aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--HOWTO/INSTALL.md53
-rw-r--r--bootstrap/bin/start.bootbin5254 -> 5250 bytes
-rw-r--r--bootstrap/bin/start_clean.bootbin5254 -> 5250 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_asm.beambin11608 -> 11620 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_block.beambin14436 -> 15048 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_bool.beambin16244 -> 16240 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_bsm.beambin12536 -> 12536 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_clean.beambin9476 -> 9476 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_dead.beambin10212 -> 10212 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_dict.beambin5360 -> 5364 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_disasm.beambin25124 -> 25124 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_except.beambin3472 -> 3472 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_flatten.beambin2900 -> 2924 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_jump.beambin8524 -> 8568 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_peep.beambin2428 -> 2428 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_receive.beambin6480 -> 6480 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_split.beambin2048 -> 2048 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_trim.beambin7672 -> 7672 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_type.beambin14328 -> 14488 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_utils.beambin13320 -> 13348 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/beam_validator.beambin34556 -> 34488 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/cerl.beambin30084 -> 30084 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/cerl_clauses.beambin2876 -> 2876 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/cerl_inline.beambin37764 -> 37752 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/cerl_trees.beambin18952 -> 18952 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/compile.beambin37912 -> 38164 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/compiler.app2
-rw-r--r--bootstrap/lib/compiler/ebin/core_lib.beambin5460 -> 5460 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/core_lint.beambin11644 -> 11644 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/core_parse.beambin37664 -> 37664 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/core_pp.beambin12064 -> 12064 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/core_scan.beambin6628 -> 6628 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/rec_env.beambin4772 -> 4772 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_core_dsetel.beambin6992 -> 6896 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_core_fold.beambin47452 -> 47644 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_core_inline.beambin4276 -> 4272 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_pre_attributes.beambin3348 -> 3348 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/sys_pre_expand.beambin13620 -> 13620 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_codegen.beambin51992 -> 51524 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_core.beambin51976 -> 51880 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_kernel.beambin43296 -> 42880 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_kernel_pp.beambin11780 -> 11780 bytes
-rw-r--r--bootstrap/lib/compiler/ebin/v3_life.beambin19992 -> 19992 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/application_controller.beambin31280 -> 31348 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/application_master.beambin6340 -> 6340 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/application_starter.beambin1256 -> 1256 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/auth.beambin6496 -> 6496 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/code.beambin7020 -> 7020 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/code_server.beambin28536 -> 28532 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/disk_log.beambin37132 -> 36596 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/disk_log_1.beambin25080 -> 25048 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/disk_log_server.beambin6604 -> 6604 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/dist_ac.beambin26652 -> 26652 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/dist_util.beambin10512 -> 10512 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/erl_boot_server.beambin5924 -> 5924 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/erl_ddll.beambin2916 -> 2916 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/erl_epmd.beambin7128 -> 7128 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/erl_reply.beambin924 -> 924 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/error_logger.beambin4480 -> 4480 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/erts_debug.beambin4048 -> 4048 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/file.beambin14544 -> 14544 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/file_io_server.beambin14528 -> 14400 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/file_server.beambin5432 -> 5436 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/gen_sctp.beambin3636 -> 3636 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/global.beambin32676 -> 32672 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/global_group.beambin17740 -> 17740 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/group.beambin13540 -> 13540 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/heart.beambin4072 -> 4072 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/hipe_unified_loader.beambin13256 -> 13256 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet.beambin23500 -> 23464 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet6_tcp.beambin2680 -> 2680 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet6_tcp_dist.beambin6240 -> 6240 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet6_udp.beambin1728 -> 1728 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_config.beambin7784 -> 7784 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_db.beambin26708 -> 26708 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_dns.beambin19772 -> 19812 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_gethost_native.beambin10500 -> 10500 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_hosts.beambin2144 -> 2144 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_parse.beambin12944 -> 12944 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_res.beambin15092 -> 15080 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_sctp.beambin2312 -> 2312 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_tcp.beambin2488 -> 2488 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_tcp_dist.beambin6524 -> 6524 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/inet_udp.beambin1916 -> 1916 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/kernel.app2
-rw-r--r--bootstrap/lib/kernel/ebin/kernel.beambin3852 -> 3852 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/kernel_config.beambin2760 -> 2760 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/net_adm.beambin3088 -> 3088 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/net_kernel.beambin22900 -> 22752 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/os.beambin5448 -> 5448 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/pg2.beambin7900 -> 7900 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/ram_file.beambin7016 -> 7032 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/rpc.beambin8616 -> 8616 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/user.beambin11592 -> 11588 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/user_drv.beambin10356 -> 10356 bytes
-rw-r--r--bootstrap/lib/kernel/ebin/wrap_log_reader.beambin3380 -> 3380 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/array.beambin12032 -> 12032 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/base64.beambin4528 -> 4544 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/beam_lib.beambin18180 -> 18188 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/binary.beambin3644 -> 3644 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/c.beambin13872 -> 13872 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/calendar.beambin5176 -> 5176 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets.beambin53624 -> 53624 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets_server.beambin6956 -> 6956 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets_utils.beambin28876 -> 28880 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets_v8.beambin27616 -> 27628 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dets_v9.beambin50216 -> 51024 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/dict.beambin9216 -> 9216 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/digraph.beambin8308 -> 8308 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/digraph_utils.beambin6852 -> 6852 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/edlin.beambin9956 -> 9956 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/edlin_expand.beambin3096 -> 3096 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/epp.beambin27592 -> 27592 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_bits.beambin2552 -> 2552 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_compile.beambin7312 -> 7312 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_eval.beambin29228 -> 29232 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_expand_records.beambin21872 -> 21872 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_lint.beambin84628 -> 84628 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_parse.beambin69620 -> 69620 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_pp.beambin25632 -> 25632 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_scan.beambin30132 -> 30064 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/erl_tar.beambin15320 -> 15320 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/error_logger_file_h.beambin5128 -> 5128 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/error_logger_tty_h.beambin5056 -> 5056 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/escript.beambin17444 -> 17412 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/ets.beambin22316 -> 22292 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/eval_bits.beambin8128 -> 8136 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/file_sorter.beambin30792 -> 30800 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/filelib.beambin7932 -> 7932 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/filename.beambin12436 -> 12448 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gb_sets.beambin8284 -> 8284 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gb_trees.beambin4992 -> 4992 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gen.beambin4048 -> 4048 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gen_event.beambin18264 -> 18264 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gen_fsm.beambin15628 -> 15628 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/gen_server.beambin17404 -> 17404 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io.beambin6836 -> 6836 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib.beambin9472 -> 9472 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib_format.beambin12408 -> 12408 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib_fread.beambin7404 -> 7404 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/io_lib_pretty.beambin14124 -> 14124 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/lib.beambin9652 -> 9652 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/lists.beambin29636 -> 29636 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/log_mf_h.beambin2672 -> 2672 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/ms_transform.beambin20360 -> 20360 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/orddict.beambin2804 -> 2812 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/pool.beambin3848 -> 3848 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/proc_lib.beambin9968 -> 9968 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/proplists.beambin4948 -> 4948 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/qlc.beambin70376 -> 70184 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/qlc_pt.beambin73648 -> 73652 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/queue.beambin6184 -> 6184 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/re.beambin13876 -> 13876 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/sets.beambin7096 -> 7096 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/shell.beambin29960 -> 29960 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/slave.beambin4860 -> 4860 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/sofs.beambin40832 -> 40820 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/stdlib.app4
-rw-r--r--bootstrap/lib/stdlib/ebin/supervisor.beambin23596 -> 23432 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/sys.beambin7556 -> 7556 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/timer.beambin5476 -> 5476 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/unicode.beambin11584 -> 11608 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/win32reg.beambin5652 -> 5652 bytes
-rw-r--r--bootstrap/lib/stdlib/ebin/zip.beambin26848 -> 26848 bytes
-rw-r--r--configure.in5
-rw-r--r--erts/configure.in60
-rw-r--r--erts/doc/src/erl.xml47
-rw-r--r--erts/doc/src/erl_driver.xml28
-rw-r--r--erts/doc/src/erlang.xml15
-rw-r--r--erts/doc/src/erlc.xml10
-rw-r--r--erts/doc/src/erts_alloc.xml21
-rw-r--r--erts/doc/src/escript.xml10
-rw-r--r--erts/doc/src/notes.xml2
-rw-r--r--erts/doc/src/zlib.xml30
-rw-r--r--erts/emulator/Makefile.in2
-rw-r--r--erts/emulator/beam/atom.names1
-rw-r--r--erts/emulator/beam/beam_emu.c20
-rw-r--r--erts/emulator/beam/bif.c4
-rw-r--r--erts/emulator/beam/bif.tab8
-rw-r--r--erts/emulator/beam/big.c9
-rw-r--r--erts/emulator/beam/big.h4
-rw-r--r--erts/emulator/beam/erl_alloc.c6
-rw-r--r--erts/emulator/beam/erl_alloc.types4
-rw-r--r--erts/emulator/beam/erl_async.c22
-rw-r--r--erts/emulator/beam/erl_bif_ddll.c26
-rwxr-xr-xerts/emulator/beam/erl_bif_info.c30
-rw-r--r--erts/emulator/beam/erl_bif_port.c2
-rw-r--r--erts/emulator/beam/erl_bif_re.c4
-rw-r--r--erts/emulator/beam/erl_db_util.c4
-rw-r--r--erts/emulator/beam/erl_debug.c2
-rw-r--r--erts/emulator/beam/erl_driver.h10
-rw-r--r--erts/emulator/beam/erl_gc.c20
-rw-r--r--erts/emulator/beam/erl_init.c34
-rw-r--r--erts/emulator/beam/erl_nif.c7
-rw-r--r--erts/emulator/beam/erl_port_task.c5
-rw-r--r--erts/emulator/beam/erl_process.c461
-rw-r--r--erts/emulator/beam/erl_process.h116
-rw-r--r--erts/emulator/beam/erl_term.h3
-rw-r--r--erts/emulator/beam/erl_unicode.c17
-rw-r--r--erts/emulator/beam/erl_vm.h3
-rw-r--r--erts/emulator/beam/erl_zlib.c40
-rw-r--r--erts/emulator/beam/erl_zlib.h6
-rw-r--r--erts/emulator/beam/external.c955
-rw-r--r--erts/emulator/beam/external.h1
-rwxr-xr-xerts/emulator/beam/global.h349
-rw-r--r--erts/emulator/beam/io.c2
-rw-r--r--erts/emulator/beam/sys.h9
-rw-r--r--erts/emulator/beam/utils.c69
-rw-r--r--erts/emulator/drivers/common/efile_drv.c15
-rw-r--r--erts/emulator/drivers/common/gzio.c53
-rw-r--r--erts/emulator/drivers/common/gzio.h16
-rw-r--r--erts/emulator/drivers/common/gzio_zutil.h9
-rw-r--r--erts/emulator/drivers/common/inet_drv.c27
-rw-r--r--erts/emulator/internal_doc/CarrierMigration.md201
-rw-r--r--erts/emulator/internal_doc/CodeLoading.md186
-rw-r--r--erts/emulator/internal_doc/DelayedDealloc.md175
-rw-r--r--erts/emulator/internal_doc/PTables.md356
-rw-r--r--erts/emulator/internal_doc/PortSignals.md267
-rw-r--r--erts/emulator/internal_doc/ProcessManagementOptimizations.md172
-rw-r--r--erts/emulator/internal_doc/ThreadProgress.md308
-rw-r--r--erts/emulator/internal_doc/Tracing.md220
-rw-r--r--erts/emulator/sys/unix/erl_unix_sys_ddll.c2
-rw-r--r--erts/emulator/sys/unix/sys.c19
-rw-r--r--erts/emulator/sys/win32/erl_win32_sys_ddll.c2
-rw-r--r--erts/emulator/sys/win32/erl_win_dyn_driver.h4
-rw-r--r--erts/emulator/test/binary_SUITE.erl232
-rw-r--r--erts/emulator/test/driver_SUITE.erl68
-rw-r--r--erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c4
-rw-r--r--erts/emulator/test/driver_SUITE_data/otp_9302_drv.c2
-rw-r--r--erts/emulator/test/driver_SUITE_data/sys_info_base_drv.c4
-rw-r--r--erts/emulator/test/driver_SUITE_data/sys_info_prev_drv.c4
-rw-r--r--erts/emulator/test/exception_SUITE.erl11
-rw-r--r--erts/emulator/test/match_spec_SUITE.erl9
-rw-r--r--erts/emulator/test/scheduler_SUITE.erl2
-rwxr-xr-xerts/emulator/utils/make_version4
-rw-r--r--erts/emulator/zlib/adler32.c104
-rw-r--r--erts/emulator/zlib/compress.c9
-rw-r--r--erts/emulator/zlib/crc32.c121
-rw-r--r--erts/emulator/zlib/crc32.h4
-rw-r--r--erts/emulator/zlib/deflate.c521
-rw-r--r--erts/emulator/zlib/deflate.h47
-rw-r--r--erts/emulator/zlib/example.c570
-rw-r--r--erts/emulator/zlib/gzguts.h209
-rw-r--r--erts/emulator/zlib/inffast.c86
-rw-r--r--erts/emulator/zlib/inffast.h6
-rw-r--r--erts/emulator/zlib/inffixed.h6
-rw-r--r--erts/emulator/zlib/inflate.c418
-rw-r--r--erts/emulator/zlib/inflate.h33
-rw-r--r--erts/emulator/zlib/inftrees.c95
-rw-r--r--erts/emulator/zlib/inftrees.h29
-rw-r--r--erts/emulator/zlib/trees.c147
-rw-r--r--erts/emulator/zlib/trees.h4
-rw-r--r--erts/emulator/zlib/uncompr.c8
-rw-r--r--erts/emulator/zlib/zconf.h291
-rw-r--r--erts/emulator/zlib/zlib.h1379
-rw-r--r--erts/emulator/zlib/zutil.c68
-rw-r--r--erts/emulator/zlib/zutil.h145
-rw-r--r--erts/epmd/src/epmd_cli.c4
-rw-r--r--erts/epmd/test/epmd_SUITE.erl23
-rw-r--r--erts/etc/common/erlexec.c31
-rw-r--r--erts/etc/unix/cerl.src7
-rw-r--r--erts/etc/unix/etp-commands.in343
-rw-r--r--erts/etc/win32/erlang.icobin1398 -> 99678 bytes
-rw-r--r--erts/preloaded/ebin/erlang.beambin97588 -> 97916 bytes
-rw-r--r--erts/preloaded/ebin/erts_internal.beambin3784 -> 4096 bytes
-rw-r--r--erts/preloaded/ebin/zlib.beambin13148 -> 13164 bytes
-rw-r--r--erts/preloaded/src/erlang.erl19
-rw-r--r--erts/preloaded/src/erts_internal.erl12
-rw-r--r--erts/preloaded/src/zlib.erl4
-rw-r--r--erts/test/erlc_SUITE.erl8
-rw-r--r--erts/test/erlexec_SUITE.erl6
-rw-r--r--erts/test/z_SUITE.erl4
-rw-r--r--erts/vsn.mk6
-rw-r--r--lib/Makefile4
-rw-r--r--lib/appmon/AUTHORS5
-rw-r--r--lib/appmon/BUGS_AND_FIXES5
-rw-r--r--lib/appmon/Makefile33
-rw-r--r--lib/appmon/doc/html/.gitignore0
-rw-r--r--lib/appmon/doc/man3/.gitignore0
-rw-r--r--lib/appmon/doc/pdf/.gitignore0
-rw-r--r--lib/appmon/doc/src/Makefile120
-rw-r--r--lib/appmon/doc/src/app_win.gifbin4210 -> 0 bytes
-rw-r--r--lib/appmon/doc/src/app_win.ps680
-rw-r--r--lib/appmon/doc/src/appmon.xml67
-rw-r--r--lib/appmon/doc/src/appmon_chapter.xml328
-rw-r--r--lib/appmon/doc/src/book.xml47
-rw-r--r--lib/appmon/doc/src/fascicules.xml18
-rw-r--r--lib/appmon/doc/src/listbox_win.gifbin4437 -> 0 bytes
-rw-r--r--lib/appmon/doc/src/listbox_win.ps741
-rw-r--r--lib/appmon/doc/src/main_win.gifbin3011 -> 0 bytes
-rw-r--r--lib/appmon/doc/src/main_win.ps691
-rw-r--r--lib/appmon/doc/src/note.gifbin1539 -> 0 bytes
-rw-r--r--lib/appmon/doc/src/notes.xml300
-rw-r--r--lib/appmon/doc/src/part.xml37
-rw-r--r--lib/appmon/doc/src/part_notes.xml39
-rw-r--r--lib/appmon/doc/src/pinfo_win.gifbin7351 -> 0 bytes
-rw-r--r--lib/appmon/doc/src/pinfo_win.ps1353
-rw-r--r--lib/appmon/doc/src/ref_man.xml37
-rw-r--r--lib/appmon/doc/src/warning.gifbin1498 -> 0 bytes
-rw-r--r--lib/appmon/ebin/.gitignore0
-rw-r--r--lib/appmon/info5
-rw-r--r--lib/appmon/priv/Makefile65
-rw-r--r--lib/appmon/priv/appmon.gifbin125 -> 0 bytes
-rw-r--r--lib/appmon/priv/appmon.tool24
-rw-r--r--lib/appmon/priv/appmon_help.txt154
-rw-r--r--lib/appmon/priv/blank.html6
-rw-r--r--lib/appmon/priv/info_frames.html9
-rw-r--r--lib/appmon/priv/main_frame.html9
-rw-r--r--lib/appmon/priv/start_info.html31
-rw-r--r--lib/appmon/src/Makefile103
-rw-r--r--lib/appmon/src/appmon.app.src24
-rw-r--r--lib/appmon/src/appmon.appup.src18
-rw-r--r--lib/appmon/src/appmon.erl1081
-rw-r--r--lib/appmon/src/appmon_a.erl1122
-rw-r--r--lib/appmon/src/appmon_dg.erl205
-rw-r--r--lib/appmon/src/appmon_dg.hrl45
-rw-r--r--lib/appmon/src/appmon_lb.erl696
-rw-r--r--lib/appmon/src/appmon_place.erl192
-rw-r--r--lib/appmon/src/appmon_txt.erl307
-rw-r--r--lib/appmon/src/appmon_web.erl1031
-rw-r--r--lib/appmon/src/process_info.erl662
-rw-r--r--lib/appmon/vsn.mk1
-rw-r--r--lib/asn1/src/asn1ct.erl11
-rw-r--r--lib/asn1/src/asn1ct_constructed_per.erl114
-rw-r--r--lib/asn1/src/asn1ct_func.erl2
-rw-r--r--lib/asn1/src/asn1ct_gen.erl24
-rw-r--r--lib/asn1/src/asn1ct_gen_per.erl6
-rw-r--r--lib/asn1/src/asn1ct_imm.erl834
-rw-r--r--lib/asn1/test/asn1_SUITE_data/SeqPrim.asn17
-rw-r--r--lib/asn1/test/testSeqPrim.erl4
-rw-r--r--lib/asn1/test/test_compile_options.erl2
-rw-r--r--lib/common_test/doc/src/run_test_chapter.xml2
-rw-r--r--lib/compiler/doc/src/compile.xml12
-rw-r--r--lib/compiler/src/beam_block.erl15
-rw-r--r--lib/compiler/src/beam_except.erl10
-rw-r--r--lib/compiler/src/beam_flatten.erl1
-rw-r--r--lib/compiler/src/beam_jump.erl12
-rw-r--r--lib/compiler/src/beam_type.erl6
-rw-r--r--lib/compiler/src/beam_utils.erl6
-rw-r--r--lib/compiler/src/compile.erl14
-rw-r--r--lib/compiler/src/sys_core_fold.erl545
-rw-r--r--lib/compiler/src/v3_codegen.erl3
-rw-r--r--lib/compiler/src/v3_core.erl3
-rw-r--r--lib/compiler/test/andor_SUITE.erl6
-rw-r--r--lib/compiler/test/beam_except_SUITE.erl10
-rw-r--r--lib/compiler/test/compilation_SUITE.erl16
-rw-r--r--lib/compiler/test/compile_SUITE.erl6
-rw-r--r--lib/compiler/test/core_fold_SUITE.erl9
-rw-r--r--lib/compiler/test/warnings_SUITE.erl1
-rw-r--r--lib/crypto/c_src/crypto.c151
-rw-r--r--lib/crypto/doc/src/crypto.xml69
-rw-r--r--lib/crypto/src/Makefile6
-rw-r--r--lib/crypto/src/crypto.app.src13
-rw-r--r--lib/crypto/src/crypto.erl15
-rw-r--r--lib/crypto/src/crypto_app.erl39
-rw-r--r--lib/crypto/src/crypto_ec_curves.erl1215
-rw-r--r--lib/crypto/src/crypto_server.erl68
-rw-r--r--lib/crypto/src/crypto_sup.erl39
-rw-r--r--lib/crypto/test/crypto_SUITE.erl93
-rw-r--r--lib/debugger/priv/erlang_bug.pngbin2632 -> 4723 bytes
-rw-r--r--lib/debugger/src/Makefile14
-rw-r--r--lib/debugger/src/dbg_ieval.erl34
-rw-r--r--lib/debugger/src/dbg_ui_break.erl98
-rw-r--r--lib/debugger/src/dbg_ui_break_win.erl314
-rw-r--r--lib/debugger/src/dbg_ui_edit.erl91
-rw-r--r--lib/debugger/src/dbg_ui_edit_win.erl128
-rw-r--r--lib/debugger/src/dbg_ui_filedialog_win.erl340
-rw-r--r--lib/debugger/src/dbg_ui_interpret.erl161
-rw-r--r--lib/debugger/src/dbg_ui_mon.erl738
-rw-r--r--lib/debugger/src/dbg_ui_mon_win.erl573
-rw-r--r--lib/debugger/src/dbg_ui_settings.erl162
-rw-r--r--lib/debugger/src/dbg_ui_trace.erl814
-rw-r--r--lib/debugger/src/dbg_ui_trace_win.erl1595
-rw-r--r--lib/debugger/src/dbg_ui_view.erl255
-rw-r--r--lib/debugger/src/dbg_ui_win.erl281
-rw-r--r--lib/debugger/src/dbg_ui_winman.erl182
-rw-r--r--lib/debugger/src/dbg_wx_mon_win.erl9
-rw-r--r--lib/debugger/src/dbg_wx_trace.erl26
-rw-r--r--lib/debugger/src/debugger.app.src20
-rw-r--r--lib/debugger/src/debugger.erl38
-rw-r--r--lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl4
-rw-r--r--lib/dialyzer/doc/manual.txt6
-rw-r--r--lib/dialyzer/doc/src/dialyzer.xml6
-rw-r--r--lib/dialyzer/src/Makefile5
-rw-r--r--lib/dialyzer/src/dialyzer.erl30
-rw-r--r--lib/dialyzer/src/dialyzer_cl.erl8
-rw-r--r--lib/dialyzer/src/dialyzer_cl_parse.erl19
-rw-r--r--lib/dialyzer/src/dialyzer_contracts.erl90
-rw-r--r--lib/dialyzer/src/dialyzer_dataflow.erl1058
-rw-r--r--lib/dialyzer/src/dialyzer_dep.erl3
-rw-r--r--lib/dialyzer/src/dialyzer_gui.erl1381
-rw-r--r--lib/dialyzer/src/dialyzer_succ_typings.erl82
-rw-r--r--lib/dialyzer/src/dialyzer_typesig.erl355
-rw-r--r--lib/dialyzer/test/Makefile1
-rw-r--r--lib/dialyzer/test/dialyzer.cover3
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/crash2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/ets1
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/ewgi2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/inf_loop12
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/inf_loop25
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/int4
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/modules3
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/my_queue2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/opaque1
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/queue1
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/simple87
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/results/wings2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl10
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/inf_loop2.erl175
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_digraph.erl655
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_erl_scan.erl1300
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl2
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_adt.erl17
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl60
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl65
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_adt.erl28
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl77
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_adt.erl138
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl571
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/simple/simple2_api.erl125
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl9
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_adt.erl5
-rw-r--r--lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl4
-rw-r--r--lib/dialyzer/vsn.mk2
-rwxr-xr-xlib/diameter/bin/diameterc4
-rw-r--r--lib/diameter/doc/src/diameter.xml7
-rw-r--r--lib/diameter/doc/src/diameter_make.xml18
-rw-r--r--lib/diameter/doc/src/diameter_sctp.xml36
-rw-r--r--lib/diameter/doc/src/seealso.ent3
-rw-r--r--lib/diameter/src/base/diameter_peer_fsm.erl10
-rw-r--r--lib/diameter/src/base/diameter_service.erl5
-rw-r--r--lib/diameter/src/base/diameter_stats.erl5
-rw-r--r--lib/diameter/src/base/diameter_traffic.erl14
-rw-r--r--lib/diameter/src/base/diameter_watchdog.erl21
-rw-r--r--lib/diameter/src/compiler/diameter_dict_util.erl37
-rw-r--r--lib/diameter/src/compiler/diameter_make.erl14
-rw-r--r--lib/diameter/src/diameter.appup.src83
-rw-r--r--lib/diameter/src/transport/diameter_sctp.erl27
-rw-r--r--lib/diameter/test/diameter_compiler_SUITE.erl9
-rw-r--r--lib/diameter/vsn.mk4
-rw-r--r--lib/erl_interface/src/connect/ei_connect.c1
-rw-r--r--lib/et/src/Makefile5
-rw-r--r--lib/et/src/et.app.src4
-rw-r--r--lib/et/src/et_collector.erl2
-rw-r--r--lib/et/src/et_gs_contents_viewer.erl602
-rw-r--r--lib/et/src/et_gs_viewer.erl1498
-rw-r--r--lib/et/src/et_viewer.erl19
-rw-r--r--lib/et/src/modules.mk4
-rw-r--r--lib/hipe/cerl/erl_bif_types.erl1793
-rw-r--r--lib/hipe/cerl/erl_types.erl2025
-rw-r--r--lib/hipe/icode/hipe_icode.erl1
-rw-r--r--lib/hipe/tools/Makefile3
-rw-r--r--lib/hipe/tools/hipe_tool.erl525
-rw-r--r--lib/inets/doc/src/notes.xml18
-rw-r--r--lib/inets/src/http_lib/http_request.erl5
-rw-r--r--lib/inets/src/http_server/Makefile3
-rw-r--r--lib/inets/src/http_server/httpd.erl218
-rw-r--r--lib/inets/src/http_server/httpd_acceptor.erl112
-rw-r--r--lib/inets/src/http_server/httpd_acceptor_sup.erl84
-rw-r--r--lib/inets/src/http_server/httpd_connection_sup.erl68
-rw-r--r--lib/inets/src/http_server/httpd_instance_sup.erl30
-rw-r--r--lib/inets/src/http_server/httpd_manager.erl725
-rw-r--r--lib/inets/src/http_server/httpd_request_handler.erl97
-rw-r--r--lib/inets/src/inets_app/inets.app.src3
-rw-r--r--lib/inets/test/Makefile4
-rw-r--r--lib/inets/test/httpd_1_0.erl (renamed from lib/pman/src/pman_options.hrl)27
-rw-r--r--lib/inets/test/httpd_1_1.erl12
-rw-r--r--lib/inets/test/httpd_SUITE.erl3019
-rw-r--r--lib/inets/test/httpd_all.erl240
-rw-r--r--lib/inets/test/httpd_block.erl53
-rw-r--r--lib/inets/test/httpd_mod_SUITE.erl76
-rw-r--r--lib/inets/test/httpd_test_lib.erl16
-rw-r--r--lib/inets/test/inets_sup_SUITE.erl7
-rw-r--r--lib/inets/test/inets_test_lib.erl10
-rw-r--r--lib/inets/test/old_httpd_SUITE.erl2445
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/Makefile.src14
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/cgi_echo.c97
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/Makefile (renamed from lib/inets/test/httpd_SUITE_data/server_root/Makefile)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/auth/group3
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/auth/passwd4
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.bat9
-rwxr-xr-xlib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.sh6
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/conf/8080.conf (renamed from lib/inets/test/httpd_SUITE_data/server_root/conf/8080.conf)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/conf/8888.conf (renamed from lib/inets/test/httpd_SUITE_data/server_root/conf/8888.conf)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/conf/httpd.conf (renamed from lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/conf/mime.types (renamed from lib/inets/test/httpd_SUITE_data/server_root/conf/mime.types)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/conf/ssl.conf (renamed from lib/inets/test/httpd_SUITE_data/server_root/conf/ssl.conf)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/config.shtml70
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_open/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/top_secret/index.html9
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/echo.shtml35
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/exec.shtml30
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/flastmod.shtml29
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/fsize.shtml29
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/include.shtml33
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/index.html25
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/last_modified.html22
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/friedrich.html7
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/oech.html4
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/welcome.html1
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_open/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/top_secret/index.html9
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/open/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/dummy.html10
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/top_secret/index.html9
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/README (renamed from lib/inets/test/httpd_SUITE_data/server_root/icons/README)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/a.gifbin0 -> 246 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.black.gifbin0 -> 242 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.red.gifbin0 -> 247 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/apache_pb.gifbin0 -> 2326 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/back.gifbin0 -> 216 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.gray.gifbin0 -> 233 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.red.gifbin0 -> 205 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/binary.gifbin0 -> 246 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/binhex.gifbin0 -> 246 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/blank.gifbin0 -> 148 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/bomb.gifbin0 -> 308 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/box1.gifbin0 -> 251 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/box2.gifbin0 -> 268 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/broken.gifbin0 -> 247 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/burst.gifbin0 -> 235 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button1.gifbin0 -> 755 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button10.gifbin0 -> 781 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button2.gifbin0 -> 785 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button3.gifbin0 -> 745 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button4.gifbin0 -> 786 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button5.gifbin0 -> 780 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button6.gifbin0 -> 791 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button7.gifbin0 -> 796 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button8.gifbin0 -> 784 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/button9.gifbin0 -> 784 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonl.gifbin0 -> 587 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonr.gifbin0 -> 576 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/c.gifbin0 -> 242 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.blue.gifbin0 -> 251 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.gray.gifbin0 -> 246 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/compressed.gifbin0 -> 1038 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/continued.gifbin0 -> 214 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/dir.gifbin0 -> 225 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/down.gifbin0 -> 163 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/dvi.gifbin0 -> 238 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/f.gifbin0 -> 236 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.gifbin0 -> 225 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.open.gifbin0 -> 242 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.sec.gifbin0 -> 243 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/forward.gifbin0 -> 219 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.gifbin0 -> 221 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.red.gifbin0 -> 220 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.sec.gifbin0 -> 249 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.right.gifbin0 -> 217 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.up.gifbin0 -> 223 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/htdig.gifbin0 -> 1822 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/icon.sheet.gifbin0 -> 11977 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/image1.gifbin0 -> 274 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/image2.gifbin0 -> 309 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/image3.gifbin0 -> 286 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/index.gifbin0 -> 268 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/layout.gifbin0 -> 276 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/left.gifbin0 -> 172 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/link.gifbin0 -> 249 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/movie.gifbin0 -> 243 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/p.gifbin0 -> 237 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/patch.gifbin0 -> 251 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pdf.gifbin0 -> 249 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie0.gifbin0 -> 188 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie1.gifbin0 -> 198 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie2.gifbin0 -> 198 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie3.gifbin0 -> 191 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie4.gifbin0 -> 193 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie5.gifbin0 -> 189 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie6.gifbin0 -> 186 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie7.gifbin0 -> 185 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie8.gifbin0 -> 173 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/portal.gifbin0 -> 254 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/poweredby.gifbin0 -> 2748 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/ps.gifbin0 -> 244 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/quill.gifbin0 -> 267 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/right.gifbin0 -> 172 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw1.gifbin0 -> 258 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw2.gifbin0 -> 263 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/script.gifbin0 -> 242 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound1.gifbin0 -> 248 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound2.gifbin0 -> 221 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere1.gifbin0 -> 285 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere2.gifbin0 -> 264 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/star.gifbin0 -> 89 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/star_blank.gifbin0 -> 53 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/tar.gifbin0 -> 243 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/tex.gifbin0 -> 251 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/text.gifbin0 -> 229 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/transfer.gifbin0 -> 242 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/unknown.gifbin0 -> 245 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/up.gifbin0 -> 164 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/uu.gifbin0 -> 236 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/uuencoded.gifbin0 -> 236 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/world1.gifbin0 -> 228 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/icons/world2.gifbin0 -> 261 bytes
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip (renamed from lib/inets/test/httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_client.pem (renamed from lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_client.pem)0
-rw-r--r--lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_server.pem (renamed from lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_server.pem)0
-rw-r--r--lib/inets/vsn.mk4
-rw-r--r--lib/jinterface/test/jitu.erl4
-rw-r--r--lib/kernel/test/code_SUITE.erl7
-rw-r--r--lib/kernel/test/sendfile_SUITE.erl20
-rw-r--r--lib/kernel/test/zlib_SUITE.erl3
-rw-r--r--lib/megaco/doc/src/definitions/term.defs3
-rw-r--r--lib/megaco/doc/src/notes.xml59
-rw-r--r--lib/megaco/src/app/megaco.appup.src13
-rw-r--r--lib/megaco/vsn.mk4
-rw-r--r--lib/observer/doc/src/Makefile4
-rw-r--r--lib/observer/doc/src/etop.xml19
-rw-r--r--lib/observer/doc/src/etop_5.gifbin9576 -> 0 bytes
-rw-r--r--lib/observer/doc/src/etop_lines.gifbin14552 -> 0 bytes
-rw-r--r--lib/observer/doc/src/etop_main.gifbin12947 -> 0 bytes
-rw-r--r--lib/observer/doc/src/etop_opt.gifbin13572 -> 0 bytes
-rw-r--r--lib/observer/doc/src/etop_ug.xml44
-rwxr-xr-xlib/observer/priv/bin/getop4
-rw-r--r--lib/observer/priv/bin/getop.bat2
-rw-r--r--lib/observer/priv/erlang_observer.pngbin2679 -> 3698 bytes
-rw-r--r--lib/observer/src/Makefile4
-rw-r--r--lib/observer/src/etop.erl5
-rw-r--r--lib/observer/src/etop_defs.hrl6
-rw-r--r--lib/observer/src/etop_gui.erl374
-rw-r--r--lib/observer/src/etop_tr.erl38
-rw-r--r--lib/observer/src/etop_txt.erl13
-rw-r--r--lib/observer/src/observer.app.src1
-rw-r--r--lib/odbc/c_src/odbcserver.c1
-rw-r--r--lib/odbc/configure.in11
-rw-r--r--lib/odbc/doc/src/notes.xml18
-rw-r--r--lib/odbc/vsn.mk2
-rw-r--r--lib/pman/AUTHORS9
-rw-r--r--lib/pman/Makefile34
-rw-r--r--lib/pman/doc/html/.gitignore0
-rw-r--r--lib/pman/doc/man3/.gitignore0
-rw-r--r--lib/pman/doc/pdf/.gitignore0
-rw-r--r--lib/pman/doc/src/Makefile116
-rw-r--r--lib/pman/doc/src/book.xml43
-rw-r--r--lib/pman/doc/src/fascicules.xml18
-rw-r--r--lib/pman/doc/src/main_window.gifbin14431 -> 0 bytes
-rw-r--r--lib/pman/doc/src/main_window.ps1573
-rw-r--r--lib/pman/doc/src/note.gifbin1539 -> 0 bytes
-rw-r--r--lib/pman/doc/src/notes.xml211
-rw-r--r--lib/pman/doc/src/options.gifbin5218 -> 0 bytes
-rw-r--r--lib/pman/doc/src/options.ps829
-rw-r--r--lib/pman/doc/src/part.xml37
-rw-r--r--lib/pman/doc/src/part_notes.xml39
-rw-r--r--lib/pman/doc/src/pman.xml88
-rw-r--r--lib/pman/doc/src/pman_chapter.xml377
-rw-r--r--lib/pman/doc/src/ref_man.xml37
-rw-r--r--lib/pman/doc/src/toolbar.gifbin6848 -> 0 bytes
-rw-r--r--lib/pman/doc/src/trace.gifbin9829 -> 0 bytes
-rw-r--r--lib/pman/doc/src/trace.ps1312
-rw-r--r--lib/pman/doc/src/warning.gifbin1498 -> 0 bytes
-rw-r--r--lib/pman/ebin/.gitignore0
-rw-r--r--lib/pman/info2
-rw-r--r--lib/pman/priv/Makefile58
-rw-r--r--lib/pman/priv/pman.gifbin199 -> 0 bytes
-rw-r--r--lib/pman/priv/pman.tool6
-rw-r--r--lib/pman/src/Makefile112
-rw-r--r--lib/pman/src/assert.hrl81
-rw-r--r--lib/pman/src/pman.app.src40
-rw-r--r--lib/pman/src/pman.appup.src19
-rw-r--r--lib/pman/src/pman.erl132
-rw-r--r--lib/pman/src/pman_buf.erl117
-rw-r--r--lib/pman/src/pman_buf.hrl29
-rw-r--r--lib/pman/src/pman_buf_buffer.erl102
-rw-r--r--lib/pman/src/pman_buf_converter.erl190
-rw-r--r--lib/pman/src/pman_buf_printer.erl91
-rw-r--r--lib/pman/src/pman_buf_utils.erl106
-rw-r--r--lib/pman/src/pman_main.erl789
-rw-r--r--lib/pman/src/pman_module_info.erl133
-rw-r--r--lib/pman/src/pman_options.erl395
-rw-r--r--lib/pman/src/pman_process.erl317
-rw-r--r--lib/pman/src/pman_relay.erl127
-rw-r--r--lib/pman/src/pman_relay_server.erl57
-rw-r--r--lib/pman/src/pman_shell.erl827
-rw-r--r--lib/pman/src/pman_tool.erl146
-rw-r--r--lib/pman/src/pman_win.erl677
-rw-r--r--lib/pman/src/pman_win.hrl39
-rw-r--r--lib/pman/vsn.mk1
-rw-r--r--lib/public_key/asn1/Makefile5
-rw-r--r--lib/public_key/asn1/OTP-PUB-KEY.set.asn1
-rw-r--r--lib/public_key/asn1/RFC5639.asn127
-rw-r--r--lib/public_key/doc/src/public_key.xml49
-rw-r--r--lib/public_key/include/public_key.hrl3
-rw-r--r--lib/public_key/src/pubkey_cert_records.erl30
-rw-r--r--lib/reltool/src/reltool_utils.erl2
-rw-r--r--lib/reltool/test/reltool_server_SUITE.erl9
-rw-r--r--lib/reltool/test/reltool_test_lib.erl53
-rw-r--r--lib/runtime_tools/c_src/Makefile.in30
-rw-r--r--lib/runtime_tools/c_src/dyntrace.c3
-rw-r--r--lib/runtime_tools/doc/src/dbg.xml4
-rw-r--r--lib/runtime_tools/src/dbg.erl4
-rw-r--r--lib/runtime_tools/src/system_information.erl6
-rw-r--r--lib/sasl/test/release_handler_SUITE.erl10
-rw-r--r--lib/snmp/doc/src/notes.xml76
-rw-r--r--lib/snmp/src/app/snmp.appup.src12
-rw-r--r--lib/snmp/test/snmp_agent_test.erl10
-rw-r--r--lib/snmp/vsn.mk4
-rw-r--r--lib/ssh/doc/src/ssh.xml2
-rw-r--r--lib/ssh/src/ssh.erl4
-rw-r--r--lib/ssh/src/ssh.hrl1
-rw-r--r--lib/ssh/src/ssh_auth.erl7
-rw-r--r--lib/ssh/src/ssh_bits.erl4
-rw-r--r--lib/ssh/src/ssh_cli.erl17
-rw-r--r--lib/ssh/src/ssh_connection.erl28
-rw-r--r--lib/ssh/src/ssh_message.erl4
-rw-r--r--lib/ssh/src/ssh_sftp.erl7
-rw-r--r--lib/ssh/src/ssh_sftpd.erl18
-rw-r--r--lib/ssh/src/ssh_xfer.erl57
-rw-r--r--lib/ssh/test/ssh_test_lib.erl16
-rw-r--r--lib/ssh/test/ssh_unicode_SUITE.erl590
-rw-r--r--lib/ssh/test/ssh_unicode_SUITE_data/sftp.txt1
-rw-r--r--lib/ssh/test/ssh_unicode_SUITE_data/sftp瑞点.txt1
-rw-r--r--lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key13
-rw-r--r--lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key.pub11
-rw-r--r--lib/ssh/vsn.mk2
-rw-r--r--lib/ssl/doc/src/notes.xml36
-rw-r--r--lib/ssl/doc/src/ssl.xml4
-rw-r--r--lib/ssl/src/ssl.appup.src12
-rw-r--r--lib/ssl/src/ssl.erl75
-rw-r--r--lib/ssl/src/ssl_connection.erl2
-rw-r--r--lib/ssl/src/ssl_connection.hrl2
-rw-r--r--lib/ssl/src/ssl_handshake.erl52
-rw-r--r--lib/ssl/src/ssl_internal.hrl6
-rw-r--r--lib/ssl/src/tls_connection.erl8
-rw-r--r--lib/ssl/src/tls_handshake.erl26
-rw-r--r--lib/ssl/src/tls_v1.erl28
-rw-r--r--lib/ssl/test/ssl_basic_SUITE.erl128
-rw-r--r--lib/ssl/test/ssl_dist_SUITE.erl2
-rw-r--r--lib/ssl/test/ssl_test_lib.erl20
-rw-r--r--lib/ssl/test/ssl_to_openssl_SUITE.erl48
-rw-r--r--lib/ssl/vsn.mk2
-rw-r--r--lib/stdlib/src/c.erl11
-rw-r--r--lib/stdlib/src/erl_lint.erl13
-rw-r--r--lib/stdlib/src/orddict.erl8
-rw-r--r--lib/stdlib/test/erl_lint_SUITE.erl10
-rw-r--r--lib/stdlib/test/shell_SUITE.erl18
-rw-r--r--lib/syntax_tools/doc/src/notes.xml32
-rw-r--r--lib/syntax_tools/src/erl_syntax.erl14
-rw-r--r--lib/syntax_tools/src/erl_tidy.erl23
-rw-r--r--lib/syntax_tools/test/syntax_tools_SUITE.erl31
-rw-r--r--lib/syntax_tools/vsn.mk2
-rw-r--r--lib/test_server/src/configure.in57
-rw-r--r--lib/test_server/src/test_server_ctrl.erl6
-rw-r--r--lib/test_server/src/ts_install.erl14
-rw-r--r--lib/test_server/src/ts_lib.erl5
-rw-r--r--lib/test_server/src/ts_make.erl6
-rw-r--r--lib/test_server/src/ts_run.erl6
-rw-r--r--lib/toolbar/AUTHORS3
-rw-r--r--lib/toolbar/Makefile36
-rw-r--r--lib/toolbar/doc/html/.gitignore0
-rw-r--r--lib/toolbar/doc/man3/.gitignore0
-rw-r--r--lib/toolbar/doc/pdf/.gitignore0
-rw-r--r--lib/toolbar/doc/src/Makefile115
-rw-r--r--lib/toolbar/doc/src/bar.gifbin4591 -> 0 bytes
-rw-r--r--lib/toolbar/doc/src/bar.ps846
-rw-r--r--lib/toolbar/doc/src/book.xml49
-rw-r--r--lib/toolbar/doc/src/create_tool.gifbin5925 -> 0 bytes
-rw-r--r--lib/toolbar/doc/src/create_tool.ps5050
-rw-r--r--lib/toolbar/doc/src/fascicules.xml18
-rw-r--r--lib/toolbar/doc/src/note.gifbin1539 -> 0 bytes
-rw-r--r--lib/toolbar/doc/src/notes.xml180
-rw-r--r--lib/toolbar/doc/src/part.xml38
-rw-r--r--lib/toolbar/doc/src/part_notes.xml38
-rw-r--r--lib/toolbar/doc/src/ref_man.xml38
-rw-r--r--lib/toolbar/doc/src/toolbar.xml101
-rw-r--r--lib/toolbar/doc/src/toolbar_chapter.xml145
-rw-r--r--lib/toolbar/doc/src/warning.gifbin1498 -> 0 bytes
-rw-r--r--lib/toolbar/ebin/.gitignore0
-rw-r--r--lib/toolbar/info2
-rw-r--r--lib/toolbar/src/Makefile93
-rw-r--r--lib/toolbar/src/canvasbutton.erl239
-rw-r--r--lib/toolbar/src/toolbar.app.src30
-rw-r--r--lib/toolbar/src/toolbar.appup.src19
-rw-r--r--lib/toolbar/src/toolbar.erl579
-rw-r--r--lib/toolbar/src/toolbar.hrl34
-rw-r--r--lib/toolbar/src/toolbar_graphics.erl404
-rw-r--r--lib/toolbar/src/toolbar_lib.erl223
-rw-r--r--lib/toolbar/src/toolbar_toolconfig.erl549
-rw-r--r--lib/toolbar/vsn.mk10
-rw-r--r--lib/tools/emacs/erlang-skels.el24
-rw-r--r--lib/tools/emacs/erlang.el17
-rw-r--r--lib/tools/emacs/test.erl.indented5
-rw-r--r--lib/tools/emacs/test.erl.orig5
-rw-r--r--lib/tools/test/xref_SUITE.erl2
-rw-r--r--lib/tv/AUTHORS5
-rw-r--r--lib/tv/Makefile35
-rw-r--r--lib/tv/doc/html/.gitignore0
-rw-r--r--lib/tv/doc/man3/.gitignore0
-rw-r--r--lib/tv/doc/pdf/.gitignore0
-rw-r--r--lib/tv/doc/src/Makefile138
-rw-r--r--lib/tv/doc/src/book.xml48
-rw-r--r--lib/tv/doc/src/fascicules.xml19
-rw-r--r--lib/tv/doc/src/info_window.gifbin6315 -> 0 bytes
-rw-r--r--lib/tv/doc/src/info_window.ps814
-rw-r--r--lib/tv/doc/src/note.gifbin1539 -> 0 bytes
-rw-r--r--lib/tv/doc/src/notes.xml288
-rw-r--r--lib/tv/doc/src/part.xml40
-rw-r--r--lib/tv/doc/src/part_notes.xml40
-rw-r--r--lib/tv/doc/src/ref_man.xml40
-rw-r--r--lib/tv/doc/src/set_poll_int.gifbin2789 -> 0 bytes
-rw-r--r--lib/tv/doc/src/set_poll_int.ps483
-rw-r--r--lib/tv/doc/src/table_visualizer_chapter.xml658
-rw-r--r--lib/tv/doc/src/tv.gifbin17015 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv.xml72
-rw-r--r--lib/tv/doc/src/tv_create_table.gifbin6211 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_create_table.ps1120
-rw-r--r--lib/tv/doc/src/tv_record_editor_mnesia.gifbin4982 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_record_editor_mnesia.ps897
-rw-r--r--lib/tv/doc/src/tv_row_marked.gifbin12354 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_row_marked.ps1611
-rw-r--r--lib/tv/doc/src/tv_row_marked_popup.gifbin13216 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_row_marked_popup.ps1324
-rw-r--r--lib/tv/doc/src/tv_search_result.gifbin23525 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_search_result.ps2739
-rw-r--r--lib/tv/doc/src/tv_search_window.gifbin5054 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_search_window.ps975
-rw-r--r--lib/tv/doc/src/tv_start.gifbin8089 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start.ps828
-rw-r--r--lib/tv/doc/src/tv_start_mnesia.gifbin8080 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start_mnesia.ps835
-rw-r--r--lib/tv/doc/src/tv_start_other_node.gifbin17327 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start_other_node.ps2316
-rw-r--r--lib/tv/doc/src/tv_start_pid_sorted.gifbin13775 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start_pid_sorted.ps1853
-rw-r--r--lib/tv/doc/src/tv_start_system.gifbin12372 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start_system.ps1330
-rw-r--r--lib/tv/doc/src/tv_start_system_unreadable.gifbin13890 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_start_system_unreadable.ps1377
-rw-r--r--lib/tv/doc/src/tv_table_browser.gifbin15457 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_table_browser.ps2024
-rw-r--r--lib/tv/doc/src/tv_table_browser_updated.gifbin15857 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_table_browser_updated.ps2124
-rw-r--r--lib/tv/doc/src/tv_table_loaded.gifbin15322 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_table_loaded.ps1430
-rw-r--r--lib/tv/doc/src/tv_table_sorted.gifbin15797 -> 0 bytes
-rw-r--r--lib/tv/doc/src/tv_table_sorted.ps1502
-rw-r--r--lib/tv/doc/src/warning.gifbin1498 -> 0 bytes
-rw-r--r--lib/tv/ebin/.gitignore0
-rw-r--r--lib/tv/info2
-rw-r--r--lib/tv/priv/Makefile72
-rw-r--r--lib/tv/priv/arrow_left.xbm5
-rw-r--r--lib/tv/priv/arrow_right.xbm5
-rw-r--r--lib/tv/priv/edit1.xbm12
-rw-r--r--lib/tv/priv/erlang.gifbin1297 -> 0 bytes
-rw-r--r--lib/tv/priv/help.xbm8
-rw-r--r--lib/tv/priv/info.xbm8
-rw-r--r--lib/tv/priv/key.xbm6
-rw-r--r--lib/tv/priv/more.xbm8
-rw-r--r--lib/tv/priv/no_sort.xbm8
-rw-r--r--lib/tv/priv/open.xbm8
-rw-r--r--lib/tv/priv/poll.xbm8
-rw-r--r--lib/tv/priv/search.xbm8
-rw-r--r--lib/tv/priv/sort.xbm8
-rw-r--r--lib/tv/priv/sort_reverse.xbm8
-rw-r--r--lib/tv/priv/tv.gifbin179 -> 0 bytes
-rw-r--r--lib/tv/priv/tv.tool23
-rw-r--r--lib/tv/src/Makefile135
-rw-r--r--lib/tv/src/tv.app.src56
-rw-r--r--lib/tv/src/tv.appup.src18
-rw-r--r--lib/tv/src/tv.erl38
-rw-r--r--lib/tv/src/tv_comm_func.erl77
-rw-r--r--lib/tv/src/tv_db.erl1271
-rw-r--r--lib/tv/src/tv_db_int_def.hrl80
-rw-r--r--lib/tv/src/tv_db_search.erl475
-rw-r--r--lib/tv/src/tv_db_sort.erl141
-rw-r--r--lib/tv/src/tv_ets_rpc.erl140
-rw-r--r--lib/tv/src/tv_etsread.erl770
-rw-r--r--lib/tv/src/tv_info.erl884
-rw-r--r--lib/tv/src/tv_int_def.hrl56
-rw-r--r--lib/tv/src/tv_int_msg.hrl504
-rw-r--r--lib/tv/src/tv_io_lib.erl223
-rw-r--r--lib/tv/src/tv_io_lib_format.erl386
-rw-r--r--lib/tv/src/tv_io_lib_pretty.erl171
-rw-r--r--lib/tv/src/tv_ip.erl242
-rw-r--r--lib/tv/src/tv_main.erl1821
-rw-r--r--lib/tv/src/tv_main.hrl285
-rw-r--r--lib/tv/src/tv_mnesia_rpc.erl106
-rw-r--r--lib/tv/src/tv_new_table.erl666
-rw-r--r--lib/tv/src/tv_nodewin.erl412
-rw-r--r--lib/tv/src/tv_pb.erl663
-rw-r--r--lib/tv/src/tv_pb_funcs.erl1056
-rw-r--r--lib/tv/src/tv_pb_int_def.hrl99
-rw-r--r--lib/tv/src/tv_pc.erl795
-rw-r--r--lib/tv/src/tv_pc_graph_ctrl.erl120
-rw-r--r--lib/tv/src/tv_pc_int_def.hrl62
-rw-r--r--lib/tv/src/tv_pc_menu_handling.erl489
-rw-r--r--lib/tv/src/tv_pd.erl1127
-rw-r--r--lib/tv/src/tv_pd_display.erl1066
-rw-r--r--lib/tv/src/tv_pd_frames.erl482
-rw-r--r--lib/tv/src/tv_pd_int_def.hrl139
-rw-r--r--lib/tv/src/tv_pd_int_msg.hrl433
-rw-r--r--lib/tv/src/tv_pd_scale.erl305
-rw-r--r--lib/tv/src/tv_pg.erl430
-rw-r--r--lib/tv/src/tv_pg_gridfcns.erl1918
-rw-r--r--lib/tv/src/tv_pg_int_def.hrl92
-rw-r--r--lib/tv/src/tv_poll_dialog.erl363
-rw-r--r--lib/tv/src/tv_pw.erl328
-rw-r--r--lib/tv/src/tv_pw_int_def.hrl55
-rw-r--r--lib/tv/src/tv_pw_window.erl277
-rw-r--r--lib/tv/src/tv_rec_edit.erl754
-rw-r--r--lib/tv/src/tv_table_owner.erl122
-rw-r--r--lib/tv/src/tv_utils.erl179
-rw-r--r--lib/tv/vsn.mk1
-rw-r--r--lib/wx/api_gen/gen_util.erl10
-rw-r--r--lib/wx/api_gen/wx_gen_cpp.erl48
-rw-r--r--lib/wx/api_gen/wxapi.conf4
-rw-r--r--lib/wx/c_src/Makefile.in7
-rw-r--r--lib/wx/c_src/gen/wxe_derived_dest.h6
-rw-r--r--lib/wx/c_src/gen/wxe_events.cpp10
-rw-r--r--lib/wx/c_src/gen/wxe_funcs.cpp21
-rw-r--r--lib/wx/c_src/wxe_callback_impl.cpp (renamed from lib/wx/c_src/wxePrintout.cpp)71
-rw-r--r--lib/wx/c_src/wxe_callback_impl.h75
-rw-r--r--lib/wx/c_src/wxe_driver.c4
-rw-r--r--lib/wx/c_src/wxe_driver.h3
-rw-r--r--lib/wx/c_src/wxe_events.h14
-rw-r--r--lib/wx/c_src/wxe_gl.cpp17
-rw-r--r--lib/wx/c_src/wxe_gl.h25
-rw-r--r--lib/wx/c_src/wxe_helpers.cpp95
-rw-r--r--lib/wx/c_src/wxe_helpers.h122
-rw-r--r--lib/wx/c_src/wxe_impl.cpp466
-rw-r--r--lib/wx/c_src/wxe_impl.h218
-rw-r--r--lib/wx/c_src/wxe_main.cpp163
-rw-r--r--lib/wx/c_src/wxe_memory.h61
-rwxr-xr-xlib/wx/configure.in16
-rw-r--r--lib/wx/doc/src/notes.xml16
-rw-r--r--lib/wx/include/wx.hrl10
-rw-r--r--lib/wx/priv/erlang-logo128.pngbin0 -> 6268 bytes
-rw-r--r--lib/wx/priv/erlang-logo32.pngbin1608 -> 1291 bytes
-rw-r--r--lib/wx/priv/erlang-logo64.pngbin4149 -> 2647 bytes
-rw-r--r--lib/wx/src/gen/wxInitDialogEvent.erl64
-rw-r--r--lib/wx/test/wx_basic_SUITE.erl29
-rw-r--r--lib/wx/test/wx_event_SUITE.erl73
-rw-r--r--lib/wx/test/wx_obj_test.erl72
-rw-r--r--lib/wx/vsn.mk2
-rw-r--r--lib/xmerl/doc/src/notes.xml29
-rw-r--r--lib/xmerl/src/xmerl_sax_parser.erl32
-rw-r--r--lib/xmerl/src/xmerl_sax_parser.hrl10
-rw-r--r--lib/xmerl/src/xmerl_sax_parser_base.erlsrc65
-rw-r--r--lib/xmerl/test/xmerl_sax_SUITE.erl35
-rw-r--r--lib/xmerl/test/xmerl_sax_std_SUITE.erl12
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl7
-rw-r--r--lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log2
-rw-r--r--lib/xmerl/vsn.mk2
-rwxr-xr-xotp_build2
-rw-r--r--system/doc/definitions/term.defs5
-rw-r--r--system/doc/design_principles/spec_proc.xml2
-rw-r--r--system/doc/getting_started/seq_prog.xml4
-rw-r--r--system/doc/reference_manual/code_loading.xml7
953 files changed, 23334 insertions, 96979 deletions
diff --git a/HOWTO/INSTALL.md b/HOWTO/INSTALL.md
index 9aa01d4ef1..0d5ae3cfbe 100644
--- a/HOWTO/INSTALL.md
+++ b/HOWTO/INSTALL.md
@@ -63,7 +63,7 @@ At Ericsson we have a "Daily Build and Test" that runs on:
* x86
* OpenBSD 5.0
* x86\_64
-* Mac OS X 10.5.8 (Leopard), 10.6.0 (Snow Leopard), 10.7.3 (Lion)
+* Mac OS X 10.5.8 (Leopard), 10.7.3 (Lion), 10.9 (Mavericks)
* x86
* Windows XP SP3, 2003, Vista, 7
* x86
@@ -680,52 +680,26 @@ If you develop linked-in drivers (shared library) you need to link using
include `-fno-common` in `CFLAGS` when compiling. Use `.so` as the library
suffix.
-Use the `--enable-darwin-64bit` configure flag to build a 64-bit
-binaries on Mac OS X.
+Install `Xcode` from the `AppStore` if it is not already installed.
-Building a fast Erlang VM on Mac OS Lion
-----------------------------------------
-
-Starting with Xcode 4.2, Apple no longer includes a "real" `gcc`
-compiler (not based on the LLVM). Building with `llvm-gcc` or `clang`
-will work, but the performance of the Erlang run-time system will not
-be the best possible.
-
-Note that if you have `gcc-4.2` installed and included in `PATH`
-(from a previous version of Xcode), `configure` will automatically
-make sure that `gcc-4.2` will be used to compile `beam_emu.c`
-(the source file most in need of `gcc`).
-
-If you don't have `gcc-4.2.` and want to build a run-time system with
-the best possible performance, do like this:
-
-Install Xcode from the AppStore if it is not already installed.
-
-If you have Xcode 4.3, or later, you will also need to download
+If you have Xcode 4.3, or later, you will also need to download
"Command Line Tools" via the Downloads preference pane in Xcode.
-Some tools may still be lacking or out-of-date, we recommend using
-[Homebrew](https://github.com/mxcl/homebrew/wiki/installation) or
-Macports to update those tools.
-
-Install MacPorts (<http://www.macports.org/>). Then:
-
- $ sudo port selfupdate
- $ sudo port install gcc45 +universal
-
### Building with wxErlang ###
-If you want to build the `wx` application, you will need to get wxWidgets-2.9.4 (or later)
-(`wxWidgets-2.9.4.tar.bz2` from <http://sourceforge.net/projects/wxwindows/files/2.9.4/>)
+If you want to build the `wx` application, you will need to get wxWidgets-3.0 (or later)
+(`wxWidgets-3.0.0.tar.bz2` from <http://sourceforge.net/projects/wxwindows/files/3.0.0/>)
or get it from github:
$ git clone [email protected]:wxWidgets/wxWidgets.git
-Be aware that the wxWidgets-2.9 branch is a development branch of wxWidgets and the MacOsX
-port still lags behind the other ports.
+Be aware that the wxWidgets-3.0 is a new release of wxWidgets, it is not as matured
+as the old releases and the MacOsX port still lags behind the other ports.
-Configure and build wxMac:
+Configure and build wxWidgets (on Mavericks - 10.9):
$ ./configure --with-cocoa --prefix=/usr/local
+ or without support for old versions and with static libs
+ $ ./configure --with-cocoa --prefix=/usr/local --with-macosx-version-min=10.9 --disable-shared
$ make
$ sudo make install
$ export PATH=/usr/local/bin:$PATH
@@ -736,12 +710,11 @@ Check that you got the correct wx-config
### Finish up ###
-Build Erlang with the MacPorts GCC as the main compiler (using `clang`
-for the Objective-C Cocoa code in the `wx` application):
+Build Erlang
$ export PATH=/usr/local/bin:$PATH
$ cd $ERL_TOP
- $ CC=/opt/local/bin/gcc-mp-4.5 CXX=/opt/local/bin/g++-mp-4.5 ./configure --enable-darwin-64bit
+ $ ./configure --enable-shared-zlib
$ make
$ sudo make install
@@ -791,7 +764,7 @@ Copyright and License
%CopyrightBegin%
-Copyright Ericsson AB 1998-2013. All Rights Reserved.
+Copyright Ericsson AB 1998-2014. All Rights Reserved.
The contents of this file are subject to the Erlang Public License,
Version 1.1, (the "License"); you may not use this file except in
diff --git a/bootstrap/bin/start.boot b/bootstrap/bin/start.boot
index db337a8632..6f7fb5d7ca 100644
--- a/bootstrap/bin/start.boot
+++ b/bootstrap/bin/start.boot
Binary files differ
diff --git a/bootstrap/bin/start_clean.boot b/bootstrap/bin/start_clean.boot
index db337a8632..6f7fb5d7ca 100644
--- a/bootstrap/bin/start_clean.boot
+++ b/bootstrap/bin/start_clean.boot
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_asm.beam b/bootstrap/lib/compiler/ebin/beam_asm.beam
index 75bae8060e..8684b356ff 100644
--- a/bootstrap/lib/compiler/ebin/beam_asm.beam
+++ b/bootstrap/lib/compiler/ebin/beam_asm.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_block.beam b/bootstrap/lib/compiler/ebin/beam_block.beam
index 370f328a96..6513a0f33b 100644
--- a/bootstrap/lib/compiler/ebin/beam_block.beam
+++ b/bootstrap/lib/compiler/ebin/beam_block.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_bool.beam b/bootstrap/lib/compiler/ebin/beam_bool.beam
index 196e442556..fb414eb9b1 100644
--- a/bootstrap/lib/compiler/ebin/beam_bool.beam
+++ b/bootstrap/lib/compiler/ebin/beam_bool.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_bsm.beam b/bootstrap/lib/compiler/ebin/beam_bsm.beam
index 9e3d9832b1..e50bb669cf 100644
--- a/bootstrap/lib/compiler/ebin/beam_bsm.beam
+++ b/bootstrap/lib/compiler/ebin/beam_bsm.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_clean.beam b/bootstrap/lib/compiler/ebin/beam_clean.beam
index 3fe3225c14..abe390267e 100644
--- a/bootstrap/lib/compiler/ebin/beam_clean.beam
+++ b/bootstrap/lib/compiler/ebin/beam_clean.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_dead.beam b/bootstrap/lib/compiler/ebin/beam_dead.beam
index b664286f0f..dc924a2905 100644
--- a/bootstrap/lib/compiler/ebin/beam_dead.beam
+++ b/bootstrap/lib/compiler/ebin/beam_dead.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_dict.beam b/bootstrap/lib/compiler/ebin/beam_dict.beam
index 50771f4e90..89867ee4a3 100644
--- a/bootstrap/lib/compiler/ebin/beam_dict.beam
+++ b/bootstrap/lib/compiler/ebin/beam_dict.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_disasm.beam b/bootstrap/lib/compiler/ebin/beam_disasm.beam
index 959e989b6d..eba17a7bbd 100644
--- a/bootstrap/lib/compiler/ebin/beam_disasm.beam
+++ b/bootstrap/lib/compiler/ebin/beam_disasm.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_except.beam b/bootstrap/lib/compiler/ebin/beam_except.beam
index e340e0f4c6..5a23c95f54 100644
--- a/bootstrap/lib/compiler/ebin/beam_except.beam
+++ b/bootstrap/lib/compiler/ebin/beam_except.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_flatten.beam b/bootstrap/lib/compiler/ebin/beam_flatten.beam
index 8f06d7270c..f0a3dfac91 100644
--- a/bootstrap/lib/compiler/ebin/beam_flatten.beam
+++ b/bootstrap/lib/compiler/ebin/beam_flatten.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_jump.beam b/bootstrap/lib/compiler/ebin/beam_jump.beam
index c296bdd18d..5c0f4a9996 100644
--- a/bootstrap/lib/compiler/ebin/beam_jump.beam
+++ b/bootstrap/lib/compiler/ebin/beam_jump.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_peep.beam b/bootstrap/lib/compiler/ebin/beam_peep.beam
index a21cc7e1e1..214fa56911 100644
--- a/bootstrap/lib/compiler/ebin/beam_peep.beam
+++ b/bootstrap/lib/compiler/ebin/beam_peep.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_receive.beam b/bootstrap/lib/compiler/ebin/beam_receive.beam
index 2f1fcc9fe1..5da32b5db6 100644
--- a/bootstrap/lib/compiler/ebin/beam_receive.beam
+++ b/bootstrap/lib/compiler/ebin/beam_receive.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_split.beam b/bootstrap/lib/compiler/ebin/beam_split.beam
index 2271c15ee4..64a946db25 100644
--- a/bootstrap/lib/compiler/ebin/beam_split.beam
+++ b/bootstrap/lib/compiler/ebin/beam_split.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_trim.beam b/bootstrap/lib/compiler/ebin/beam_trim.beam
index b655cdb4cf..b844602370 100644
--- a/bootstrap/lib/compiler/ebin/beam_trim.beam
+++ b/bootstrap/lib/compiler/ebin/beam_trim.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_type.beam b/bootstrap/lib/compiler/ebin/beam_type.beam
index 5fd60ebee1..7f80c1a691 100644
--- a/bootstrap/lib/compiler/ebin/beam_type.beam
+++ b/bootstrap/lib/compiler/ebin/beam_type.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_utils.beam b/bootstrap/lib/compiler/ebin/beam_utils.beam
index 9360e60827..ff455ce50f 100644
--- a/bootstrap/lib/compiler/ebin/beam_utils.beam
+++ b/bootstrap/lib/compiler/ebin/beam_utils.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/beam_validator.beam b/bootstrap/lib/compiler/ebin/beam_validator.beam
index b8a3491caa..fed0bb3c48 100644
--- a/bootstrap/lib/compiler/ebin/beam_validator.beam
+++ b/bootstrap/lib/compiler/ebin/beam_validator.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/cerl.beam b/bootstrap/lib/compiler/ebin/cerl.beam
index a10f017869..2cba88e8c3 100644
--- a/bootstrap/lib/compiler/ebin/cerl.beam
+++ b/bootstrap/lib/compiler/ebin/cerl.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/cerl_clauses.beam b/bootstrap/lib/compiler/ebin/cerl_clauses.beam
index 97e96c47bd..ec41e1098b 100644
--- a/bootstrap/lib/compiler/ebin/cerl_clauses.beam
+++ b/bootstrap/lib/compiler/ebin/cerl_clauses.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/cerl_inline.beam b/bootstrap/lib/compiler/ebin/cerl_inline.beam
index a7094e5540..fcd22e932e 100644
--- a/bootstrap/lib/compiler/ebin/cerl_inline.beam
+++ b/bootstrap/lib/compiler/ebin/cerl_inline.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/cerl_trees.beam b/bootstrap/lib/compiler/ebin/cerl_trees.beam
index 49528c1635..ce81e67924 100644
--- a/bootstrap/lib/compiler/ebin/cerl_trees.beam
+++ b/bootstrap/lib/compiler/ebin/cerl_trees.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/compile.beam b/bootstrap/lib/compiler/ebin/compile.beam
index 9de2c1a0cf..34b3cc86a9 100644
--- a/bootstrap/lib/compiler/ebin/compile.beam
+++ b/bootstrap/lib/compiler/ebin/compile.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/compiler.app b/bootstrap/lib/compiler/ebin/compiler.app
index 19ad28915a..83554a68a5 100644
--- a/bootstrap/lib/compiler/ebin/compiler.app
+++ b/bootstrap/lib/compiler/ebin/compiler.app
@@ -18,7 +18,7 @@
{application, compiler,
[{description, "ERTS CXC 138 10"},
- {vsn, "4.9.1"},
+ {vsn, "4.9.4"},
{modules, [
beam_a,
beam_asm,
diff --git a/bootstrap/lib/compiler/ebin/core_lib.beam b/bootstrap/lib/compiler/ebin/core_lib.beam
index d03dfe646c..5e40c086c2 100644
--- a/bootstrap/lib/compiler/ebin/core_lib.beam
+++ b/bootstrap/lib/compiler/ebin/core_lib.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/core_lint.beam b/bootstrap/lib/compiler/ebin/core_lint.beam
index bfe9914644..831e2acc43 100644
--- a/bootstrap/lib/compiler/ebin/core_lint.beam
+++ b/bootstrap/lib/compiler/ebin/core_lint.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/core_parse.beam b/bootstrap/lib/compiler/ebin/core_parse.beam
index 80820731c1..3f9c212fe7 100644
--- a/bootstrap/lib/compiler/ebin/core_parse.beam
+++ b/bootstrap/lib/compiler/ebin/core_parse.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/core_pp.beam b/bootstrap/lib/compiler/ebin/core_pp.beam
index e96e4bc654..f7e0dc40ae 100644
--- a/bootstrap/lib/compiler/ebin/core_pp.beam
+++ b/bootstrap/lib/compiler/ebin/core_pp.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/core_scan.beam b/bootstrap/lib/compiler/ebin/core_scan.beam
index f14eda5a33..f4742b98db 100644
--- a/bootstrap/lib/compiler/ebin/core_scan.beam
+++ b/bootstrap/lib/compiler/ebin/core_scan.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/rec_env.beam b/bootstrap/lib/compiler/ebin/rec_env.beam
index edabfdf444..4bd37b16c0 100644
--- a/bootstrap/lib/compiler/ebin/rec_env.beam
+++ b/bootstrap/lib/compiler/ebin/rec_env.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam b/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam
index 11c194a5cc..120c4f4a76 100644
--- a/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam
+++ b/bootstrap/lib/compiler/ebin/sys_core_dsetel.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_core_fold.beam b/bootstrap/lib/compiler/ebin/sys_core_fold.beam
index 9aa5ac5a90..5c87bdd3dd 100644
--- a/bootstrap/lib/compiler/ebin/sys_core_fold.beam
+++ b/bootstrap/lib/compiler/ebin/sys_core_fold.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_core_inline.beam b/bootstrap/lib/compiler/ebin/sys_core_inline.beam
index d8eabeda7c..1e358ee0ea 100644
--- a/bootstrap/lib/compiler/ebin/sys_core_inline.beam
+++ b/bootstrap/lib/compiler/ebin/sys_core_inline.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam b/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam
index d3b213e75a..f7621bbc3f 100644
--- a/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam
+++ b/bootstrap/lib/compiler/ebin/sys_pre_attributes.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/sys_pre_expand.beam b/bootstrap/lib/compiler/ebin/sys_pre_expand.beam
index 1e27f9e222..d726c3ca07 100644
--- a/bootstrap/lib/compiler/ebin/sys_pre_expand.beam
+++ b/bootstrap/lib/compiler/ebin/sys_pre_expand.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_codegen.beam b/bootstrap/lib/compiler/ebin/v3_codegen.beam
index 5b06d8656e..c683fc6c46 100644
--- a/bootstrap/lib/compiler/ebin/v3_codegen.beam
+++ b/bootstrap/lib/compiler/ebin/v3_codegen.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_core.beam b/bootstrap/lib/compiler/ebin/v3_core.beam
index db2c79cae7..8004afb882 100644
--- a/bootstrap/lib/compiler/ebin/v3_core.beam
+++ b/bootstrap/lib/compiler/ebin/v3_core.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_kernel.beam b/bootstrap/lib/compiler/ebin/v3_kernel.beam
index a0afb3fac2..0566a7ff51 100644
--- a/bootstrap/lib/compiler/ebin/v3_kernel.beam
+++ b/bootstrap/lib/compiler/ebin/v3_kernel.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam b/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
index 8f18f5ff25..1b2d02c1d5 100644
--- a/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
+++ b/bootstrap/lib/compiler/ebin/v3_kernel_pp.beam
Binary files differ
diff --git a/bootstrap/lib/compiler/ebin/v3_life.beam b/bootstrap/lib/compiler/ebin/v3_life.beam
index 2392863c3d..bb0ceefdd1 100644
--- a/bootstrap/lib/compiler/ebin/v3_life.beam
+++ b/bootstrap/lib/compiler/ebin/v3_life.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/application_controller.beam b/bootstrap/lib/kernel/ebin/application_controller.beam
index b7081212cb..590b9a54b0 100644
--- a/bootstrap/lib/kernel/ebin/application_controller.beam
+++ b/bootstrap/lib/kernel/ebin/application_controller.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/application_master.beam b/bootstrap/lib/kernel/ebin/application_master.beam
index f44cd9c9ab..14329fa051 100644
--- a/bootstrap/lib/kernel/ebin/application_master.beam
+++ b/bootstrap/lib/kernel/ebin/application_master.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/application_starter.beam b/bootstrap/lib/kernel/ebin/application_starter.beam
index 06d8098af9..f5059a487a 100644
--- a/bootstrap/lib/kernel/ebin/application_starter.beam
+++ b/bootstrap/lib/kernel/ebin/application_starter.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/auth.beam b/bootstrap/lib/kernel/ebin/auth.beam
index 62617ce3ef..3cc607cb14 100644
--- a/bootstrap/lib/kernel/ebin/auth.beam
+++ b/bootstrap/lib/kernel/ebin/auth.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/code.beam b/bootstrap/lib/kernel/ebin/code.beam
index 2994e5257a..5428f2cf0c 100644
--- a/bootstrap/lib/kernel/ebin/code.beam
+++ b/bootstrap/lib/kernel/ebin/code.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/code_server.beam b/bootstrap/lib/kernel/ebin/code_server.beam
index 896e3cb61b..430c2e0733 100644
--- a/bootstrap/lib/kernel/ebin/code_server.beam
+++ b/bootstrap/lib/kernel/ebin/code_server.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/disk_log.beam b/bootstrap/lib/kernel/ebin/disk_log.beam
index 63253eeaaa..8a7d6a8388 100644
--- a/bootstrap/lib/kernel/ebin/disk_log.beam
+++ b/bootstrap/lib/kernel/ebin/disk_log.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/disk_log_1.beam b/bootstrap/lib/kernel/ebin/disk_log_1.beam
index 49c6b674cd..5193dfa53d 100644
--- a/bootstrap/lib/kernel/ebin/disk_log_1.beam
+++ b/bootstrap/lib/kernel/ebin/disk_log_1.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/disk_log_server.beam b/bootstrap/lib/kernel/ebin/disk_log_server.beam
index 7c886a6ff3..ec9422d41b 100644
--- a/bootstrap/lib/kernel/ebin/disk_log_server.beam
+++ b/bootstrap/lib/kernel/ebin/disk_log_server.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/dist_ac.beam b/bootstrap/lib/kernel/ebin/dist_ac.beam
index c2e361d8c6..9d3f7548b6 100644
--- a/bootstrap/lib/kernel/ebin/dist_ac.beam
+++ b/bootstrap/lib/kernel/ebin/dist_ac.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/dist_util.beam b/bootstrap/lib/kernel/ebin/dist_util.beam
index 84738305f7..4cd98bd217 100644
--- a/bootstrap/lib/kernel/ebin/dist_util.beam
+++ b/bootstrap/lib/kernel/ebin/dist_util.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/erl_boot_server.beam b/bootstrap/lib/kernel/ebin/erl_boot_server.beam
index c84d69c1f5..7e43b0fb36 100644
--- a/bootstrap/lib/kernel/ebin/erl_boot_server.beam
+++ b/bootstrap/lib/kernel/ebin/erl_boot_server.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/erl_ddll.beam b/bootstrap/lib/kernel/ebin/erl_ddll.beam
index 90c831b045..e15e49d61c 100644
--- a/bootstrap/lib/kernel/ebin/erl_ddll.beam
+++ b/bootstrap/lib/kernel/ebin/erl_ddll.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/erl_epmd.beam b/bootstrap/lib/kernel/ebin/erl_epmd.beam
index 143147298c..1a74da7f1f 100644
--- a/bootstrap/lib/kernel/ebin/erl_epmd.beam
+++ b/bootstrap/lib/kernel/ebin/erl_epmd.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/erl_reply.beam b/bootstrap/lib/kernel/ebin/erl_reply.beam
index 2a2e9dbc92..79fb539bd3 100644
--- a/bootstrap/lib/kernel/ebin/erl_reply.beam
+++ b/bootstrap/lib/kernel/ebin/erl_reply.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/error_logger.beam b/bootstrap/lib/kernel/ebin/error_logger.beam
index bf3963693a..10f7a0b984 100644
--- a/bootstrap/lib/kernel/ebin/error_logger.beam
+++ b/bootstrap/lib/kernel/ebin/error_logger.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/erts_debug.beam b/bootstrap/lib/kernel/ebin/erts_debug.beam
index d915dc0891..7d059d10cf 100644
--- a/bootstrap/lib/kernel/ebin/erts_debug.beam
+++ b/bootstrap/lib/kernel/ebin/erts_debug.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/file.beam b/bootstrap/lib/kernel/ebin/file.beam
index 04f6da0687..3141747738 100644
--- a/bootstrap/lib/kernel/ebin/file.beam
+++ b/bootstrap/lib/kernel/ebin/file.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/file_io_server.beam b/bootstrap/lib/kernel/ebin/file_io_server.beam
index 6916cdcc58..dfaa1b07f0 100644
--- a/bootstrap/lib/kernel/ebin/file_io_server.beam
+++ b/bootstrap/lib/kernel/ebin/file_io_server.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/file_server.beam b/bootstrap/lib/kernel/ebin/file_server.beam
index d656c5e610..48352e9dfd 100644
--- a/bootstrap/lib/kernel/ebin/file_server.beam
+++ b/bootstrap/lib/kernel/ebin/file_server.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/gen_sctp.beam b/bootstrap/lib/kernel/ebin/gen_sctp.beam
index 81f496edb5..e2bb806f2b 100644
--- a/bootstrap/lib/kernel/ebin/gen_sctp.beam
+++ b/bootstrap/lib/kernel/ebin/gen_sctp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/global.beam b/bootstrap/lib/kernel/ebin/global.beam
index b404e24cdf..1629089858 100644
--- a/bootstrap/lib/kernel/ebin/global.beam
+++ b/bootstrap/lib/kernel/ebin/global.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/global_group.beam b/bootstrap/lib/kernel/ebin/global_group.beam
index e0ca1de771..d11f60015a 100644
--- a/bootstrap/lib/kernel/ebin/global_group.beam
+++ b/bootstrap/lib/kernel/ebin/global_group.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/group.beam b/bootstrap/lib/kernel/ebin/group.beam
index f151913df2..412b8e0007 100644
--- a/bootstrap/lib/kernel/ebin/group.beam
+++ b/bootstrap/lib/kernel/ebin/group.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/heart.beam b/bootstrap/lib/kernel/ebin/heart.beam
index 84b12d081c..d4972ecdd2 100644
--- a/bootstrap/lib/kernel/ebin/heart.beam
+++ b/bootstrap/lib/kernel/ebin/heart.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
index c46eced0e4..31a54ecef4 100644
--- a/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
+++ b/bootstrap/lib/kernel/ebin/hipe_unified_loader.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet.beam b/bootstrap/lib/kernel/ebin/inet.beam
index 16749a3948..fe203f816f 100644
--- a/bootstrap/lib/kernel/ebin/inet.beam
+++ b/bootstrap/lib/kernel/ebin/inet.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet6_tcp.beam b/bootstrap/lib/kernel/ebin/inet6_tcp.beam
index dc592e336c..036b0495c8 100644
--- a/bootstrap/lib/kernel/ebin/inet6_tcp.beam
+++ b/bootstrap/lib/kernel/ebin/inet6_tcp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
index 4b5543b994..83305c1826 100644
--- a/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
+++ b/bootstrap/lib/kernel/ebin/inet6_tcp_dist.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet6_udp.beam b/bootstrap/lib/kernel/ebin/inet6_udp.beam
index 2c94263b99..73f0b52b90 100644
--- a/bootstrap/lib/kernel/ebin/inet6_udp.beam
+++ b/bootstrap/lib/kernel/ebin/inet6_udp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_config.beam b/bootstrap/lib/kernel/ebin/inet_config.beam
index 7db3eddc6e..03b42209e6 100644
--- a/bootstrap/lib/kernel/ebin/inet_config.beam
+++ b/bootstrap/lib/kernel/ebin/inet_config.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_db.beam b/bootstrap/lib/kernel/ebin/inet_db.beam
index d55c06c002..45e7d9e0d0 100644
--- a/bootstrap/lib/kernel/ebin/inet_db.beam
+++ b/bootstrap/lib/kernel/ebin/inet_db.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_dns.beam b/bootstrap/lib/kernel/ebin/inet_dns.beam
index b962e1ef21..9fd86024e0 100644
--- a/bootstrap/lib/kernel/ebin/inet_dns.beam
+++ b/bootstrap/lib/kernel/ebin/inet_dns.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_gethost_native.beam b/bootstrap/lib/kernel/ebin/inet_gethost_native.beam
index 03cb896d1c..098c397936 100644
--- a/bootstrap/lib/kernel/ebin/inet_gethost_native.beam
+++ b/bootstrap/lib/kernel/ebin/inet_gethost_native.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_hosts.beam b/bootstrap/lib/kernel/ebin/inet_hosts.beam
index 78e81ce23d..3e70a8b8c1 100644
--- a/bootstrap/lib/kernel/ebin/inet_hosts.beam
+++ b/bootstrap/lib/kernel/ebin/inet_hosts.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_parse.beam b/bootstrap/lib/kernel/ebin/inet_parse.beam
index d2ef990dba..90ccd8b440 100644
--- a/bootstrap/lib/kernel/ebin/inet_parse.beam
+++ b/bootstrap/lib/kernel/ebin/inet_parse.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_res.beam b/bootstrap/lib/kernel/ebin/inet_res.beam
index 88d1f5f2c7..2636552e92 100644
--- a/bootstrap/lib/kernel/ebin/inet_res.beam
+++ b/bootstrap/lib/kernel/ebin/inet_res.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_sctp.beam b/bootstrap/lib/kernel/ebin/inet_sctp.beam
index 726edcd4c9..503cbc11e2 100644
--- a/bootstrap/lib/kernel/ebin/inet_sctp.beam
+++ b/bootstrap/lib/kernel/ebin/inet_sctp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_tcp.beam b/bootstrap/lib/kernel/ebin/inet_tcp.beam
index 00a8175665..d854abd830 100644
--- a/bootstrap/lib/kernel/ebin/inet_tcp.beam
+++ b/bootstrap/lib/kernel/ebin/inet_tcp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam b/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam
index 358d9ae403..2e54f1e1f4 100644
--- a/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam
+++ b/bootstrap/lib/kernel/ebin/inet_tcp_dist.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/inet_udp.beam b/bootstrap/lib/kernel/ebin/inet_udp.beam
index 6fb98bd777..6fbdd29f6d 100644
--- a/bootstrap/lib/kernel/ebin/inet_udp.beam
+++ b/bootstrap/lib/kernel/ebin/inet_udp.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/kernel.app b/bootstrap/lib/kernel/ebin/kernel.app
index c42f63d2c6..f491239a45 100644
--- a/bootstrap/lib/kernel/ebin/kernel.app
+++ b/bootstrap/lib/kernel/ebin/kernel.app
@@ -21,7 +21,7 @@
{application, kernel,
[
{description, "ERTS CXC 138 10"},
- {vsn, "2.17"},
+ {vsn, "3.0"},
{modules, [application,
application_controller,
application_master,
diff --git a/bootstrap/lib/kernel/ebin/kernel.beam b/bootstrap/lib/kernel/ebin/kernel.beam
index 838a57718c..c938b218e1 100644
--- a/bootstrap/lib/kernel/ebin/kernel.beam
+++ b/bootstrap/lib/kernel/ebin/kernel.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/kernel_config.beam b/bootstrap/lib/kernel/ebin/kernel_config.beam
index e3f6589104..c35da2c73d 100644
--- a/bootstrap/lib/kernel/ebin/kernel_config.beam
+++ b/bootstrap/lib/kernel/ebin/kernel_config.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/net_adm.beam b/bootstrap/lib/kernel/ebin/net_adm.beam
index 4c8b6525a6..fb722b3b4e 100644
--- a/bootstrap/lib/kernel/ebin/net_adm.beam
+++ b/bootstrap/lib/kernel/ebin/net_adm.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/net_kernel.beam b/bootstrap/lib/kernel/ebin/net_kernel.beam
index 0d39aa5ff5..33193008c7 100644
--- a/bootstrap/lib/kernel/ebin/net_kernel.beam
+++ b/bootstrap/lib/kernel/ebin/net_kernel.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/os.beam b/bootstrap/lib/kernel/ebin/os.beam
index 4602e68e17..b8b01b31ab 100644
--- a/bootstrap/lib/kernel/ebin/os.beam
+++ b/bootstrap/lib/kernel/ebin/os.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/pg2.beam b/bootstrap/lib/kernel/ebin/pg2.beam
index 3eafd8c43b..c26b5a4ffc 100644
--- a/bootstrap/lib/kernel/ebin/pg2.beam
+++ b/bootstrap/lib/kernel/ebin/pg2.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/ram_file.beam b/bootstrap/lib/kernel/ebin/ram_file.beam
index 74fcc898c3..4d6df15730 100644
--- a/bootstrap/lib/kernel/ebin/ram_file.beam
+++ b/bootstrap/lib/kernel/ebin/ram_file.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/rpc.beam b/bootstrap/lib/kernel/ebin/rpc.beam
index 4782908361..4a8aa5da69 100644
--- a/bootstrap/lib/kernel/ebin/rpc.beam
+++ b/bootstrap/lib/kernel/ebin/rpc.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/user.beam b/bootstrap/lib/kernel/ebin/user.beam
index 1ba5d096e2..0e06c78fce 100644
--- a/bootstrap/lib/kernel/ebin/user.beam
+++ b/bootstrap/lib/kernel/ebin/user.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/user_drv.beam b/bootstrap/lib/kernel/ebin/user_drv.beam
index 51ba491410..4a2cd01b0d 100644
--- a/bootstrap/lib/kernel/ebin/user_drv.beam
+++ b/bootstrap/lib/kernel/ebin/user_drv.beam
Binary files differ
diff --git a/bootstrap/lib/kernel/ebin/wrap_log_reader.beam b/bootstrap/lib/kernel/ebin/wrap_log_reader.beam
index 7a328be682..f35187c269 100644
--- a/bootstrap/lib/kernel/ebin/wrap_log_reader.beam
+++ b/bootstrap/lib/kernel/ebin/wrap_log_reader.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/array.beam b/bootstrap/lib/stdlib/ebin/array.beam
index 28d04dea2c..76cb41da49 100644
--- a/bootstrap/lib/stdlib/ebin/array.beam
+++ b/bootstrap/lib/stdlib/ebin/array.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/base64.beam b/bootstrap/lib/stdlib/ebin/base64.beam
index 2ca9a4d0b8..e8d4b44102 100644
--- a/bootstrap/lib/stdlib/ebin/base64.beam
+++ b/bootstrap/lib/stdlib/ebin/base64.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/beam_lib.beam b/bootstrap/lib/stdlib/ebin/beam_lib.beam
index 36d5e56806..b22233171b 100644
--- a/bootstrap/lib/stdlib/ebin/beam_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/beam_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/binary.beam b/bootstrap/lib/stdlib/ebin/binary.beam
index 6077d965ed..14d6ba7976 100644
--- a/bootstrap/lib/stdlib/ebin/binary.beam
+++ b/bootstrap/lib/stdlib/ebin/binary.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/c.beam b/bootstrap/lib/stdlib/ebin/c.beam
index b2999a6255..3c34406adc 100644
--- a/bootstrap/lib/stdlib/ebin/c.beam
+++ b/bootstrap/lib/stdlib/ebin/c.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/calendar.beam b/bootstrap/lib/stdlib/ebin/calendar.beam
index 3f4f14abc3..19e0443dd2 100644
--- a/bootstrap/lib/stdlib/ebin/calendar.beam
+++ b/bootstrap/lib/stdlib/ebin/calendar.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets.beam b/bootstrap/lib/stdlib/ebin/dets.beam
index cfadae3caa..ac36354796 100644
--- a/bootstrap/lib/stdlib/ebin/dets.beam
+++ b/bootstrap/lib/stdlib/ebin/dets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets_server.beam b/bootstrap/lib/stdlib/ebin/dets_server.beam
index 2b6026d29d..6bbefbbf1e 100644
--- a/bootstrap/lib/stdlib/ebin/dets_server.beam
+++ b/bootstrap/lib/stdlib/ebin/dets_server.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets_utils.beam b/bootstrap/lib/stdlib/ebin/dets_utils.beam
index 6ef251a140..cb4da358d6 100644
--- a/bootstrap/lib/stdlib/ebin/dets_utils.beam
+++ b/bootstrap/lib/stdlib/ebin/dets_utils.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets_v8.beam b/bootstrap/lib/stdlib/ebin/dets_v8.beam
index 018c2e8cbb..87e3caec1e 100644
--- a/bootstrap/lib/stdlib/ebin/dets_v8.beam
+++ b/bootstrap/lib/stdlib/ebin/dets_v8.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dets_v9.beam b/bootstrap/lib/stdlib/ebin/dets_v9.beam
index fdfd8e84cf..c85adabcae 100644
--- a/bootstrap/lib/stdlib/ebin/dets_v9.beam
+++ b/bootstrap/lib/stdlib/ebin/dets_v9.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/dict.beam b/bootstrap/lib/stdlib/ebin/dict.beam
index df8bdae61d..e39c79bd5a 100644
--- a/bootstrap/lib/stdlib/ebin/dict.beam
+++ b/bootstrap/lib/stdlib/ebin/dict.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/digraph.beam b/bootstrap/lib/stdlib/ebin/digraph.beam
index 82735d07cc..40db38c992 100644
--- a/bootstrap/lib/stdlib/ebin/digraph.beam
+++ b/bootstrap/lib/stdlib/ebin/digraph.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/digraph_utils.beam b/bootstrap/lib/stdlib/ebin/digraph_utils.beam
index b9fdd6eac3..64783f4e1d 100644
--- a/bootstrap/lib/stdlib/ebin/digraph_utils.beam
+++ b/bootstrap/lib/stdlib/ebin/digraph_utils.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/edlin.beam b/bootstrap/lib/stdlib/ebin/edlin.beam
index 7b8e03a722..12aa74c4ac 100644
--- a/bootstrap/lib/stdlib/ebin/edlin.beam
+++ b/bootstrap/lib/stdlib/ebin/edlin.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/edlin_expand.beam b/bootstrap/lib/stdlib/ebin/edlin_expand.beam
index 01570cb1d4..85ce43d1ed 100644
--- a/bootstrap/lib/stdlib/ebin/edlin_expand.beam
+++ b/bootstrap/lib/stdlib/ebin/edlin_expand.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/epp.beam b/bootstrap/lib/stdlib/ebin/epp.beam
index 62e4840c77..a5462e86d3 100644
--- a/bootstrap/lib/stdlib/ebin/epp.beam
+++ b/bootstrap/lib/stdlib/ebin/epp.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_bits.beam b/bootstrap/lib/stdlib/ebin/erl_bits.beam
index 7149491121..627b9ca711 100644
--- a/bootstrap/lib/stdlib/ebin/erl_bits.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_bits.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_compile.beam b/bootstrap/lib/stdlib/ebin/erl_compile.beam
index 244bb5e290..88da2b246f 100644
--- a/bootstrap/lib/stdlib/ebin/erl_compile.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_compile.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_eval.beam b/bootstrap/lib/stdlib/ebin/erl_eval.beam
index 60a39206f7..d58dd86070 100644
--- a/bootstrap/lib/stdlib/ebin/erl_eval.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_eval.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_expand_records.beam b/bootstrap/lib/stdlib/ebin/erl_expand_records.beam
index 0f0da08a87..0563699d5e 100644
--- a/bootstrap/lib/stdlib/ebin/erl_expand_records.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_expand_records.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_lint.beam b/bootstrap/lib/stdlib/ebin/erl_lint.beam
index 00431e7bc9..10d32c9865 100644
--- a/bootstrap/lib/stdlib/ebin/erl_lint.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_lint.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_parse.beam b/bootstrap/lib/stdlib/ebin/erl_parse.beam
index 4098c1d1d1..2815cad4a3 100644
--- a/bootstrap/lib/stdlib/ebin/erl_parse.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_parse.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_pp.beam b/bootstrap/lib/stdlib/ebin/erl_pp.beam
index 22d48708b8..f699719358 100644
--- a/bootstrap/lib/stdlib/ebin/erl_pp.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_pp.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_scan.beam b/bootstrap/lib/stdlib/ebin/erl_scan.beam
index c8da05cb67..851270bd37 100644
--- a/bootstrap/lib/stdlib/ebin/erl_scan.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_scan.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/erl_tar.beam b/bootstrap/lib/stdlib/ebin/erl_tar.beam
index 256ea5c3f5..6401818109 100644
--- a/bootstrap/lib/stdlib/ebin/erl_tar.beam
+++ b/bootstrap/lib/stdlib/ebin/erl_tar.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam
index 496e41c858..673ee6e8b2 100644
--- a/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam
+++ b/bootstrap/lib/stdlib/ebin/error_logger_file_h.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam
index 47073d155f..87d58cf378 100644
--- a/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam
+++ b/bootstrap/lib/stdlib/ebin/error_logger_tty_h.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/escript.beam b/bootstrap/lib/stdlib/ebin/escript.beam
index 12a578278f..401b41a2f5 100644
--- a/bootstrap/lib/stdlib/ebin/escript.beam
+++ b/bootstrap/lib/stdlib/ebin/escript.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/ets.beam b/bootstrap/lib/stdlib/ebin/ets.beam
index a6b4947b6c..8d024aaa99 100644
--- a/bootstrap/lib/stdlib/ebin/ets.beam
+++ b/bootstrap/lib/stdlib/ebin/ets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/eval_bits.beam b/bootstrap/lib/stdlib/ebin/eval_bits.beam
index 0b12a41b1c..6627e1132c 100644
--- a/bootstrap/lib/stdlib/ebin/eval_bits.beam
+++ b/bootstrap/lib/stdlib/ebin/eval_bits.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/file_sorter.beam b/bootstrap/lib/stdlib/ebin/file_sorter.beam
index 3273021913..1c0353488e 100644
--- a/bootstrap/lib/stdlib/ebin/file_sorter.beam
+++ b/bootstrap/lib/stdlib/ebin/file_sorter.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/filelib.beam b/bootstrap/lib/stdlib/ebin/filelib.beam
index 14ab68a7e1..b70aa54301 100644
--- a/bootstrap/lib/stdlib/ebin/filelib.beam
+++ b/bootstrap/lib/stdlib/ebin/filelib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/filename.beam b/bootstrap/lib/stdlib/ebin/filename.beam
index de676f2bed..d3700da35e 100644
--- a/bootstrap/lib/stdlib/ebin/filename.beam
+++ b/bootstrap/lib/stdlib/ebin/filename.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gb_sets.beam b/bootstrap/lib/stdlib/ebin/gb_sets.beam
index 444c2745a0..feadc1d1ed 100644
--- a/bootstrap/lib/stdlib/ebin/gb_sets.beam
+++ b/bootstrap/lib/stdlib/ebin/gb_sets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gb_trees.beam b/bootstrap/lib/stdlib/ebin/gb_trees.beam
index 24aab57544..879b8cdf76 100644
--- a/bootstrap/lib/stdlib/ebin/gb_trees.beam
+++ b/bootstrap/lib/stdlib/ebin/gb_trees.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gen.beam b/bootstrap/lib/stdlib/ebin/gen.beam
index 277a881630..6f15e461f6 100644
--- a/bootstrap/lib/stdlib/ebin/gen.beam
+++ b/bootstrap/lib/stdlib/ebin/gen.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gen_event.beam b/bootstrap/lib/stdlib/ebin/gen_event.beam
index 313bd2dcce..46f1512a24 100644
--- a/bootstrap/lib/stdlib/ebin/gen_event.beam
+++ b/bootstrap/lib/stdlib/ebin/gen_event.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gen_fsm.beam b/bootstrap/lib/stdlib/ebin/gen_fsm.beam
index 561b562115..d6719e68d9 100644
--- a/bootstrap/lib/stdlib/ebin/gen_fsm.beam
+++ b/bootstrap/lib/stdlib/ebin/gen_fsm.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/gen_server.beam b/bootstrap/lib/stdlib/ebin/gen_server.beam
index d7221a4ea3..806c4d58d7 100644
--- a/bootstrap/lib/stdlib/ebin/gen_server.beam
+++ b/bootstrap/lib/stdlib/ebin/gen_server.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io.beam b/bootstrap/lib/stdlib/ebin/io.beam
index 19ae65b3bf..6c80bfe78b 100644
--- a/bootstrap/lib/stdlib/ebin/io.beam
+++ b/bootstrap/lib/stdlib/ebin/io.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib.beam b/bootstrap/lib/stdlib/ebin/io_lib.beam
index 08e497e35a..d34f69097a 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib_format.beam b/bootstrap/lib/stdlib/ebin/io_lib_format.beam
index a476dcc6be..e579d3cb2e 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib_format.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib_format.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
index f3f059df26..8c45cf484c 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib_fread.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam b/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam
index b9bcaf8cf2..720f19461e 100644
--- a/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam
+++ b/bootstrap/lib/stdlib/ebin/io_lib_pretty.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/lib.beam b/bootstrap/lib/stdlib/ebin/lib.beam
index 0de626c384..c9086e1796 100644
--- a/bootstrap/lib/stdlib/ebin/lib.beam
+++ b/bootstrap/lib/stdlib/ebin/lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/lists.beam b/bootstrap/lib/stdlib/ebin/lists.beam
index 332a2088d0..a44b412d23 100644
--- a/bootstrap/lib/stdlib/ebin/lists.beam
+++ b/bootstrap/lib/stdlib/ebin/lists.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/log_mf_h.beam b/bootstrap/lib/stdlib/ebin/log_mf_h.beam
index 190b5d2af5..58a8d68ed5 100644
--- a/bootstrap/lib/stdlib/ebin/log_mf_h.beam
+++ b/bootstrap/lib/stdlib/ebin/log_mf_h.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/ms_transform.beam b/bootstrap/lib/stdlib/ebin/ms_transform.beam
index 1715cfac50..6e7a19c78a 100644
--- a/bootstrap/lib/stdlib/ebin/ms_transform.beam
+++ b/bootstrap/lib/stdlib/ebin/ms_transform.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/orddict.beam b/bootstrap/lib/stdlib/ebin/orddict.beam
index 722117e542..5fea6d0622 100644
--- a/bootstrap/lib/stdlib/ebin/orddict.beam
+++ b/bootstrap/lib/stdlib/ebin/orddict.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/pool.beam b/bootstrap/lib/stdlib/ebin/pool.beam
index 8ad59de20d..72934a42d7 100644
--- a/bootstrap/lib/stdlib/ebin/pool.beam
+++ b/bootstrap/lib/stdlib/ebin/pool.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/proc_lib.beam b/bootstrap/lib/stdlib/ebin/proc_lib.beam
index a297dff09c..ee23fef6f0 100644
--- a/bootstrap/lib/stdlib/ebin/proc_lib.beam
+++ b/bootstrap/lib/stdlib/ebin/proc_lib.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/proplists.beam b/bootstrap/lib/stdlib/ebin/proplists.beam
index c768955ca7..2640cfe4ae 100644
--- a/bootstrap/lib/stdlib/ebin/proplists.beam
+++ b/bootstrap/lib/stdlib/ebin/proplists.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/qlc.beam b/bootstrap/lib/stdlib/ebin/qlc.beam
index a654bb3d99..ec3f0d174e 100644
--- a/bootstrap/lib/stdlib/ebin/qlc.beam
+++ b/bootstrap/lib/stdlib/ebin/qlc.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/qlc_pt.beam b/bootstrap/lib/stdlib/ebin/qlc_pt.beam
index 9624629b83..5c89047e67 100644
--- a/bootstrap/lib/stdlib/ebin/qlc_pt.beam
+++ b/bootstrap/lib/stdlib/ebin/qlc_pt.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/queue.beam b/bootstrap/lib/stdlib/ebin/queue.beam
index 8907a03b57..b7eab3f8d1 100644
--- a/bootstrap/lib/stdlib/ebin/queue.beam
+++ b/bootstrap/lib/stdlib/ebin/queue.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/re.beam b/bootstrap/lib/stdlib/ebin/re.beam
index ef5be96cda..74b369bb0c 100644
--- a/bootstrap/lib/stdlib/ebin/re.beam
+++ b/bootstrap/lib/stdlib/ebin/re.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/sets.beam b/bootstrap/lib/stdlib/ebin/sets.beam
index 74eb720790..d8546de28d 100644
--- a/bootstrap/lib/stdlib/ebin/sets.beam
+++ b/bootstrap/lib/stdlib/ebin/sets.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/shell.beam b/bootstrap/lib/stdlib/ebin/shell.beam
index 1971561ef1..3756c0d46a 100644
--- a/bootstrap/lib/stdlib/ebin/shell.beam
+++ b/bootstrap/lib/stdlib/ebin/shell.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/slave.beam b/bootstrap/lib/stdlib/ebin/slave.beam
index 23a7091c96..ba741284ac 100644
--- a/bootstrap/lib/stdlib/ebin/slave.beam
+++ b/bootstrap/lib/stdlib/ebin/slave.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/sofs.beam b/bootstrap/lib/stdlib/ebin/sofs.beam
index b6a3f88679..90d82c23c0 100644
--- a/bootstrap/lib/stdlib/ebin/sofs.beam
+++ b/bootstrap/lib/stdlib/ebin/sofs.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/stdlib.app b/bootstrap/lib/stdlib/ebin/stdlib.app
index f00712df60..d1da05048b 100644
--- a/bootstrap/lib/stdlib/ebin/stdlib.app
+++ b/bootstrap/lib/stdlib/ebin/stdlib.app
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1996-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1996-2011. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -19,7 +19,7 @@
%%
{application, stdlib,
[{description, "ERTS CXC 138 10"},
- {vsn, "1.20"},
+ {vsn, "2.0"},
{modules, [array,
base64,
beam_lib,
diff --git a/bootstrap/lib/stdlib/ebin/supervisor.beam b/bootstrap/lib/stdlib/ebin/supervisor.beam
index f8ef186a9b..d1d1131c06 100644
--- a/bootstrap/lib/stdlib/ebin/supervisor.beam
+++ b/bootstrap/lib/stdlib/ebin/supervisor.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/sys.beam b/bootstrap/lib/stdlib/ebin/sys.beam
index 7e2ba3c19b..2aed63dc88 100644
--- a/bootstrap/lib/stdlib/ebin/sys.beam
+++ b/bootstrap/lib/stdlib/ebin/sys.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/timer.beam b/bootstrap/lib/stdlib/ebin/timer.beam
index 4269f1ebec..106d75c18a 100644
--- a/bootstrap/lib/stdlib/ebin/timer.beam
+++ b/bootstrap/lib/stdlib/ebin/timer.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/unicode.beam b/bootstrap/lib/stdlib/ebin/unicode.beam
index 572cb2b6fa..76342ef108 100644
--- a/bootstrap/lib/stdlib/ebin/unicode.beam
+++ b/bootstrap/lib/stdlib/ebin/unicode.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/win32reg.beam b/bootstrap/lib/stdlib/ebin/win32reg.beam
index 6df20f8db7..5d023ecb93 100644
--- a/bootstrap/lib/stdlib/ebin/win32reg.beam
+++ b/bootstrap/lib/stdlib/ebin/win32reg.beam
Binary files differ
diff --git a/bootstrap/lib/stdlib/ebin/zip.beam b/bootstrap/lib/stdlib/ebin/zip.beam
index 17006f313d..465a8b95a7 100644
--- a/bootstrap/lib/stdlib/ebin/zip.beam
+++ b/bootstrap/lib/stdlib/ebin/zip.beam
Binary files differ
diff --git a/configure.in b/configure.in
index f25a068be9..d33e8bf125 100644
--- a/configure.in
+++ b/configure.in
@@ -255,8 +255,9 @@ AC_ARG_ENABLE(dynamic-ssl-lib,
AS_HELP_STRING([--disable-dynamic-ssl-lib],
[disable using dynamic openssl libraries]))
-AC_ARG_ENABLE(shared-zlib,
-AS_HELP_STRING([--enable-shared-zlib], [enable using shared zlib library]))
+AC_ARG_ENABLE(builtin-zlib,
+AS_HELP_STRING([--enable-builtin-zlib],
+ [force use of our own built-in zlib]))
dnl This functionality has been lost along the way... :(
dnl It could perhaps be nice to reintroduce some day; therefore,
diff --git a/erts/configure.in b/erts/configure.in
index 3b4c46d4a5..c42a6c79d0 100644
--- a/erts/configure.in
+++ b/erts/configure.in
@@ -1336,7 +1336,7 @@ TERMCAP_LIB=
if test "x$with_termcap" != "xno" &&
test "X$host" != "Xwin32"; then
# try these libs
- termcap_libs="ncurses curses termcap termlib"
+ termcap_libs="tinfo ncurses curses termcap termlib"
for termcap_lib in $termcap_libs; do
AC_CHECK_LIB($termcap_lib, tgetent, TERMCAP_LIB="-l$termcap_lib")
@@ -1372,24 +1372,44 @@ dnl -------------
dnl zlib
dnl -------------
-AC_ARG_ENABLE(shared-zlib,
-AS_HELP_STRING([--enable-shared-zlib], [enable using shared zlib library]),
-[ case "$enableval" in
- no) enable_shared_zlib=no ;;
- *) enable_shared_zlib=yes ;;
- esac ], enable_shared_zlib=no)
+AC_ARG_ENABLE(builtin-zlib,
+ AS_HELP_STRING([--enable-builtin-zlib],
+ [force use of our own built-in zlib]),
+ [ case "$enableval" in
+ no) enable_builtin_zlib=no ;;
+ *) enable_builtin_zlib=yes ;;
+ esac ], enable_builtin_zlib=no)
Z_LIB=
-if test "x$enable_shared_zlib" = "xyes" ; then
- AC_CHECK_LIB(z, adler32_combine,
- [Z_LIB="-lz"
- AC_DEFINE(HAVE_LIBZ, 1, [Define to 1 if you have the `z' library (-lz).])],
- [AC_MSG_ERROR([cannot find any shared zlib])])
+if test "x$enable_builtin_zlib" = "xyes"; then
+ AC_MSG_NOTICE([Using our own built-in zlib source])
else
- AC_MSG_NOTICE([Using own zlib source])
+AC_MSG_CHECKING(for zlib 1.2.5 or higher)
+zlib_save_LIBS=$LIBS
+LIBS="-lz $LIBS"
+AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[
+#include "zlib.h"
+]],[[
+#if ZLIB_VERNUM >= 0x1250
+ Bytef s[1];
+ s[0] = 0;
+ (void) adler32((uLong)0, s, 1);
+#else
+#error "No zlib 1.2.5 or higher found"
+error
+#endif
+]])],
+[
+ Z_LIB="-lz"
+ AC_DEFINE(HAVE_LIBZ, 1, [Define to 1 if you have the `z' library (-lz).])
+ AC_MSG_RESULT(yes)
+],[
+ AC_MSG_RESULT(no)
+])
+LIBS=$zlib_save_LIBS
fi
-
AC_SUBST(Z_LIB)
dnl
@@ -3807,10 +3827,16 @@ if test "$enable_dtrace_test" = "yes" ; then
if ! dtrace -h $DTRACE_CPP -Iemulator/beam -o ./foo-dtrace.h -s emulator/beam/erlang_dtrace.d; then
AC_MSG_ERROR([Could not precompile erlang_dtrace.d: dtrace -h failed])
fi
- rm -f foo-dtrace.h
+
+ $RM -f dtest.{o,c}
+ cat > dtest.c <<_DTEST
+ #include "foo-dtrace.h"
+ int main(void) { ERLANG_DIST_PORT_BUSY_ENABLED(); return 0; }
+_DTEST
+ $CC $CFLAGS -c -o dtest.o dtest.c
$RM -f $DTRACE_2STEP_TEST
- if dtrace -G $DTRACE_CPP $DTRACE_BITS_FLAG -Iemulator/beam -o $DTRACE_2STEP_TEST -s emulator/beam/erlang_dtrace.d 2> /dev/null && \
+ if dtrace -G $DTRACE_CPP $DTRACE_BITS_FLAG -Iemulator/beam -o $DTRACE_2STEP_TEST -s emulator/beam/erlang_dtrace.d dtest.o && \
test -f $DTRACE_2STEP_TEST ; then
rm $DTRACE_2STEP_TEST
DTRACE_ENABLED_2STEP=yes
@@ -3818,6 +3844,8 @@ if test "$enable_dtrace_test" = "yes" ; then
else
AC_MSG_NOTICE([dtrace precompilation for 1-stage DTrace successful])
fi
+ $RM -f dtest.{o,c} foo-dtrace.h
+
DTRACE_ENABLED=yes
case $OPSYS in
linux)
diff --git a/erts/doc/src/erl.xml b/erts/doc/src/erl.xml
index bf0d132955..e737727941 100644
--- a/erts/doc/src/erl.xml
+++ b/erts/doc/src/erl.xml
@@ -941,6 +941,10 @@
when schedulers frequently run out of work. When disabled,
the frequency with which schedulers run out of work will
not be taken into account by the load balancing logic.
+ <br/>&nbsp;&nbsp;<c>+scl false</c> is similar to
+ <seealso marker="#+sub">+sub true</seealso> with the difference
+ that <c>+sub true</c> also will balance scheduler utilization
+ between schedulers.
</p>
</item>
<tag><marker id="+sct"><c>+sct CpuTopology</c></marker></tag>
@@ -1087,6 +1091,29 @@
documentation of the <seealso marker="#+sbt">+sbt</seealso> flag.
</p>
</item>
+ <tag><marker id="+sub"><c>+sub true|false</c></marker></tag>
+ <item>
+ <p>Enable or disable
+ <seealso marker="erts:erlang#statistics_scheduler_wall_time">scheduler
+ utilization</seealso> balancing of load. By default scheduler
+ utilization balancing is disabled and instead scheduler
+ compaction of load is enabled which will strive for a load
+ distribution which causes as many scheduler threads as possible
+ to be fully loaded (i.e., not run out of work). When scheduler
+ utilization balancing is enabled the system will instead try to
+ balance scheduler utilization between schedulers. That is,
+ strive for equal scheduler utilization on all schedulers.
+ <br/>&nbsp;&nbsp;&nbsp;<c>+sub true</c> is only supported on
+ systems where the runtime system detects and use a monotonically
+ increasing high resolution clock. On other systems, the runtime
+ system will fail to start.
+ <br/>&nbsp;&nbsp;&nbsp;<c>+sub true</c> implies
+ <seealso marker="#+scl">+scl false</seealso>. The difference
+ between <c>+sub true</c> and <c>+scl false</c> is that
+ <c>+scl false</c> will not try to balance the scheduler
+ utilization.
+ </p>
+ </item>
<tag><marker id="+swct"><c>+sws very_eager|eager|medium|lazy|very_lazy</c></marker></tag>
<item>
<p>
@@ -1126,18 +1153,18 @@
<tag><marker id="+spp"><c>+spp Bool</c></marker></tag>
<item>
<p>Set default scheduler hint for port parallelism. If set to
- <c>true</c>, the VM will schedule port tasks when it by this can
- improve the parallelism in the system. If set to <c>false</c>,
- the VM will try to perform port tasks immediately and by this
- improve latency at the expense of parallelism. If this
- flag has not been passed, the default scheduler hint for port
- parallelism is currently <c>false</c>. The default used can be
- inspected in runtime by calling
- <seealso marker="erlang#system_info_port_parallelism">erlang:system_info(port_parallelism)</seealso>.
+ <c>true</c>, the VM will schedule port tasks when doing so will
+ improve parallelism in the system. If set to <c>false</c>, the VM
+ will try to perform port tasks immediately, improving latency at the
+ expense of parallelism. If this flag has not been passed, the
+ default scheduler hint for port parallelism is currently
+ <c>false</c>. The default used can be inspected in runtime by
+ calling <seealso
+ marker="erlang#system_info_port_parallelism">erlang:system_info(port_parallelism)</seealso>.
The default can be overriden on port creation by passing the
<seealso marker="erlang#open_port_parallelism">parallelism</seealso>
- option to
- <seealso marker="erlang#open_port/2">open_port/2</seealso></p>.
+ option to <seealso
+ marker="erlang#open_port/2">open_port/2</seealso></p>.
</item>
<tag><marker id="sched_thread_stack_size"><c><![CDATA[+sss size]]></c></marker></tag>
<item>
diff --git a/erts/doc/src/erl_driver.xml b/erts/doc/src/erl_driver.xml
index b453a4861e..c2f7fa4588 100644
--- a/erts/doc/src/erl_driver.xml
+++ b/erts/doc/src/erl_driver.xml
@@ -745,7 +745,7 @@ typedef struct ErlIOVec {
created and decrement it once when the port associated with
the lock terminates. The emulator will also increment the
reference count when an async job is enqueued and decrement
- it after an async job has been invoked, or canceled. Besides
+ it after an async job has been invoked. Besides
this, it is the responsibility of the driver to ensure that
the reference count does not reach zero before the last use
of the lock by the driver has been made. The reference count
@@ -1995,14 +1995,12 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
<c>async_invoke</c> and <c>async_free</c>. It's typically a
pointer to a structure that contains a pipe or event that
can be used to signal that the async operation completed.
- The data should be freed in <c>async_free</c>, because it's
- called if <c>driver_async_cancel</c> is called.</p>
+ The data should be freed in <c>async_free</c>.</p>
<p>When the async operation is done, <seealso marker="driver_entry#ready_async">ready_async</seealso> driver
entry function is called. If <c>ready_async</c> is null in
the driver entry, the <c>async_free</c> function is called
instead.</p>
- <p>The return value is a handle to the asynchronous task, which
- can be used as argument to <c>driver_async_cancel</c>.</p>
+ <p>The return value is a handle to the asynchronous task.</p>
<note>
<p>As of erts version 5.5.4.3 the default stack size for
threads in the async-thread pool is 16 kilowords,
@@ -2040,26 +2038,6 @@ ERL_DRV_EXT2TERM char *buf, ErlDrvUInt len
</desc>
</func>
<func>
- <name><ret>int</ret><nametext>driver_async_cancel(long id)</nametext></name>
- <fsummary>Cancel an asynchronous call</fsummary>
- <desc>
- <marker id="driver_async_cancel"></marker>
- <p>This function used to cancel a scheduled asynchronous operation,
- if it was still in the queue. It returned 1 if it succeeded, and
- 0 if it failed.</p>
- <p>Since it could not guarantee success, it was more or less useless.
- The user had to implement synchronization of cancellation anyway.
- It also unnecessarily complicated the implementation. Therefore,
- as of OTP-R15B <c>driver_async_cancel()</c> is deprecated, and
- scheduled for removal in OTP-R17. It will currently always fail,
- and return 0.</p>
- <warning><p><c>driver_async_cancel()</c> is deprecated and will
- be removed in the OTP-R17 release.</p>
- </warning>
-
- </desc>
- </func>
- <func>
<name><ret>int</ret><nametext>driver_lock_driver(ErlDrvPort port)</nametext></name>
<fsummary>Make sure the driver is never unloaded</fsummary>
<desc>
diff --git a/erts/doc/src/erlang.xml b/erts/doc/src/erlang.xml
index 711473afd2..ea753cfaaf 100644
--- a/erts/doc/src/erlang.xml
+++ b/erts/doc/src/erlang.xml
@@ -3011,11 +3011,11 @@ os_prompt% </pre>
<tag><marker id="open_port_parallelism"><c>{parallelism, Boolean}</c></marker></tag>
<item>
<p>Set scheduler hint for port parallelism. If set to <c>true</c>,
- the VM will schedule port tasks when it by this can improve the
+ the VM will schedule port tasks when doing so will improve
parallelism in the system. If set to <c>false</c>, the VM will
- try to perform port tasks immediately and by this improving the
- latency at the expense of parallelism. The default can be set on
- system startup by passing the
+ try to perform port tasks immediately, improving latency at the
+ expense of parallelism. The default can be set on system startup
+ by passing the
<seealso marker="erl#+spp">+spp</seealso> command line argument
to <seealso marker="erl">erl(1)</seealso>.
</p>
@@ -6008,6 +6008,13 @@ ok
<seealso marker="#system_info_multi_scheduling">erlang:system_info(multi_scheduling)</seealso>, and
<seealso marker="#system_info_schedulers">erlang:system_info(schedulers)</seealso>.</p>
</item>
+ <tag><marker id="system_info_otp_correction_package"><c>otp_correction_package</c></marker></tag>
+ <item>
+ <p>Returns a string containing the OTP correction package version
+ number that currenly executing VM is part of. Note that other
+ OTP applications in the system may be part of other OTP correction
+ packages.</p>
+ </item>
<tag><marker id="system_info_otp_release"><c>otp_release</c></marker></tag>
<item>
<p>Returns a string containing the OTP release number.</p>
diff --git a/erts/doc/src/erlc.xml b/erts/doc/src/erlc.xml
index 10cab344b0..c3fc3b1686 100644
--- a/erts/doc/src/erlc.xml
+++ b/erts/doc/src/erlc.xml
@@ -234,6 +234,16 @@ erlc +export_all file.erl</pre>
from the shell.</p>
<p>Supported options: -I, -o, -D, -v, -W, -b.</p>
</item>
+ <tag>.S</tag>
+ <item>
+ <p>Erlang assembler source code. It generates a <c><![CDATA[.beam]]></c> file.</p>
+ <p>Supported options: same as for .erl.</p>
+ </item>
+ <tag>.core</tag>
+ <item>
+ <p>Erlang core source code. It generates a <c><![CDATA[.beam]]></c> file.</p>
+ <p>Supported options: same as for .erl.</p>
+ </item>
<tag>.yrl</tag>
<item>
<p>Yecc source code. It generates an <c><![CDATA[.erl]]></c> file.</p>
diff --git a/erts/doc/src/erts_alloc.xml b/erts/doc/src/erts_alloc.xml
index fffa9f594c..c9eca39a99 100644
--- a/erts/doc/src/erts_alloc.xml
+++ b/erts/doc/src/erts_alloc.xml
@@ -395,16 +395,17 @@
<c><![CDATA[<utilization>]]></c> is an integer in the range
<c>[0, 100]</c> representing utilization in percent. When a
utilization value larger than zero is used, allocator instances
- are allowed to abandon multiblock carriers. Currently the default
- is zero. If <c>de</c> (default enabled) is passed instead of a
- <c><![CDATA[<utilization>]]></c>, a recomended non zero utilization
- value will be used. The actual value chosen depend on allocator
- type and may be changed between ERTS versions. Carriers will be
- abandoned when memory utilization in the allocator instance falls
- below the utilization value used. Once a carrier has been abandoned,
- no new allocations will be made in it. When an allocator instance
- gets an increased multiblock carrier need, it will first try to
- fetch an abandoned carrier from an allocator instances of the same
+ are allowed to abandon multiblock carriers. If <c>de</c> (default
+ enabled) is passed instead of a <c><![CDATA[<utilization>]]></c>,
+ a recomended non zero utilization value will be used. The actual
+ value chosen depend on allocator type and may be changed between
+ ERTS versions. Currently the default equals <c>de</c>, but this
+ may be changed in the future. Carriers will be abandoned when
+ memory utilization in the allocator instance falls below the
+ utilization value used. Once a carrier has been abandoned, no new
+ allocations will be made in it. When an allocator instance gets an
+ increased multiblock carrier need, it will first try to fetch an
+ abandoned carrier from an allocator instances of the same
allocator type. If no abandoned carrier could be fetched, it will
create a new empty carrier. When an abandoned carrier has been
fetched it will function as an ordinary carrier. This feature has
diff --git a/erts/doc/src/escript.xml b/erts/doc/src/escript.xml
index 180447cac4..d2b09d4515 100644
--- a/erts/doc/src/escript.xml
+++ b/erts/doc/src/escript.xml
@@ -44,6 +44,7 @@
<p><c>escript</c> runs a script written in Erlang.</p>
<p>Here follows an example.</p>
<pre>
+$ <input>chmod u+x factorial</input>
$ <input>cat factorial</input>
#!/usr/bin/env escript
%% -*- erlang -*-
@@ -66,12 +67,13 @@ usage() ->
fac(0) -> 1;
fac(N) -> N * fac(N-1).
-$ <input>factorial 5</input>
+$ <input>./factorial 5</input>
factorial 5 = 120
-$ <input>factorial</input>
+$ <input>./factorial</input>
usage: factorial integer
-$ <input>factorial five</input>
-usage: factorial integer </pre>
+$ <input>./factorial five</input>
+usage: factorial integer
+ </pre>
<p>The header of the Erlang script in the example differs from
a normal Erlang module. The first line is intended to be the
interpreter line, which invokes <c>escript</c>. However if you
diff --git a/erts/doc/src/notes.xml b/erts/doc/src/notes.xml
index 8c008c493e..b4ebef72f4 100644
--- a/erts/doc/src/notes.xml
+++ b/erts/doc/src/notes.xml
@@ -257,7 +257,7 @@
processes before the BIF returns, or fail with an
exception due to the port not being open. </p><p> The
synchronous port BIFs are: </p> <list> <item><seealso
- marker="erlang#port_close/1/"><c>port_close/1</c></seealso></item>
+ marker="erlang#port_close/1"><c>port_close/1</c></seealso></item>
<item><seealso
marker="erlang#port_command/2"><c>port_command/2</c></seealso></item>
<item><seealso
diff --git a/erts/doc/src/zlib.xml b/erts/doc/src/zlib.xml
index afc597b729..11a7437f5a 100644
--- a/erts/doc/src/zlib.xml
+++ b/erts/doc/src/zlib.xml
@@ -161,20 +161,22 @@ list_to_binary([Compressed|Last])</pre>
state. <c><anno>MemLevel</anno></c>=1 uses minimum memory but is slow and
reduces compression ratio; <c><anno>MemLevel</anno></c>=9 uses maximum
memory for optimal speed. The default value is 8.</p>
- <p>The <c><anno>Strategy</anno></c> parameter is used to tune the
- compression algorithm. Use the value <c>default</c> for
- normal data, <c>filtered</c> for data produced by a filter
- (or predictor), or <c>huffman_only</c> to force Huffman
- encoding only (no string match). Filtered data consists
- mostly of small values with a somewhat random
- distribution. In this case, the compression algorithm is
- tuned to compress them better. The effect of
- <c>filtered</c>is to force more Huffman coding and less
- string matching; it is somewhat intermediate between
- <c>default</c> and <c>huffman_only</c>. The <c><anno>Strategy</anno></c>
- parameter only affects the compression ratio but not the
- correctness of the compressed output even if it is not set
- appropriately.</p>
+ <p>The <c><anno>Strategy</anno></c> parameter is used to tune
+ the compression algorithm. Use the value <c>default</c> for
+ normal data, <c>filtered</c> for data produced by a filter (or
+ predictor), <c>huffman_only</c> to force Huffman encoding
+ only (no string match), or <c>rle</c> to limit match
+ distances to one (run-length encoding). Filtered data
+ consists mostly of small values with a somewhat random
+ distribution. In this case, the compression algorithm is tuned
+ to compress them better. The effect of <c>filtered</c>is to
+ force more Huffman coding and less string matching; it is
+ somewhat intermediate between <c>default</c> and
+ <c>huffman_only</c>. <c>rle</c> is designed to be almost as
+ fast as <c>huffman_only</c>, but give better compression for PNG
+ image data. The <c><anno>Strategy</anno></c> parameter only
+ affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately.</p>
</desc>
</func>
<func>
diff --git a/erts/emulator/Makefile.in b/erts/emulator/Makefile.in
index 5638683f88..b270099566 100644
--- a/erts/emulator/Makefile.in
+++ b/erts/emulator/Makefile.in
@@ -575,7 +575,7 @@ GENERATE += $(TTF_DIR)/erl_alloc_types.h
# version include file
$(TARGET)/erl_version.h: ../vsn.mk
- $(gen_verbose)LANG=C $(PERL) utils/make_version -o $@ $(SYSTEM_VSN) $(VSN)$(SERIALNO) $(TARGET)
+ $(gen_verbose)LANG=C $(PERL) utils/make_version -o $@ $(SYSTEM_VSN) $(SYSTEM_CP_VSN) $(VSN)$(SERIALNO) $(TARGET)
GENERATE += $(TARGET)/erl_version.h
# driver table
diff --git a/erts/emulator/beam/atom.names b/erts/emulator/beam/atom.names
index eee4badfb8..96547ba743 100644
--- a/erts/emulator/beam/atom.names
+++ b/erts/emulator/beam/atom.names
@@ -116,6 +116,7 @@ atom binary_longest_prefix_trap
atom binary_longest_suffix_trap
atom binary_match_trap
atom binary_matches_trap
+atom binary_to_term_trap
atom block
atom blocked
atom bm
diff --git a/erts/emulator/beam/beam_emu.c b/erts/emulator/beam/beam_emu.c
index 78ab6fa30f..b413f0e859 100644
--- a/erts/emulator/beam/beam_emu.c
+++ b/erts/emulator/beam/beam_emu.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -48,7 +48,7 @@
# define OpCase(OpCode) case op_##OpCode
# define CountCase(OpCode) case op_count_##OpCode
# define OpCode(OpCode) ((Uint*)op_##OpCode)
-# define Goto(Rel) {Go = (int)(Rel); goto emulator_loop;}
+# define Goto(Rel) {Go = (int)(UWord)(Rel); goto emulator_loop;}
# define LabelAddr(Addr) &&##Addr
#else
# define OpCase(OpCode) lb_##OpCode
@@ -133,7 +133,7 @@ do { \
/* We don't check the range if an ordinary switch is used */
#ifdef NO_JUMP_TABLE
-#define VALID_INSTR(IP) (0 <= (int)(IP) && ((int)(IP) < (NUMBER_OF_OPCODES*2+10)))
+#define VALID_INSTR(IP) ((UWord)(IP) < (NUMBER_OF_OPCODES*2+10))
#else
#define VALID_INSTR(IP) \
((SWord)LabelAddr(emulator_loop) <= (SWord)(IP) && \
@@ -4326,7 +4326,19 @@ void process_main(void)
flags = Arg(2);
BsGetFieldSize(tmp_arg2, (flags >> 3), ClauseFail(), size);
if (size >= SMALL_BITS) {
- Uint wordsneeded = 1+WSIZE(NBYTES((Uint) size));
+ Uint wordsneeded;
+ /* check bits size before potential gc.
+ * We do not want a gc and then realize we don't need
+ * the allocated space (i.e. if the op fails)
+ *
+ * remember to reacquire the matchbuffer after gc.
+ */
+
+ mb = ms_matchbuffer(tmp_arg1);
+ if (mb->size - mb->offset < size) {
+ ClauseFail();
+ }
+ wordsneeded = 1+WSIZE(NBYTES((Uint) size));
TestHeapPreserve(wordsneeded, Arg(1), tmp_arg1);
}
mb = ms_matchbuffer(tmp_arg1);
diff --git a/erts/emulator/beam/bif.c b/erts/emulator/beam/bif.c
index 96666d98ed..61c1abedb5 100644
--- a/erts/emulator/beam/bif.c
+++ b/erts/emulator/beam/bif.c
@@ -4488,7 +4488,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
BIF_P->group_leader,
"A call to erlang:system_flag(cpu_topology, _) was made.\n"
"The cpu_topology argument is deprecated and scheduled\n"
- "for removal in erts-5.10/OTP-R16. For more information\n"
+ "for removal in Erlang/OTP 18. For more information\n"
"see the erlang:system_flag/2 documentation.\n");
BIF_TRAP1(set_cpu_topology_trap, BIF_P, BIF_ARG_2);
} else if (ERTS_IS_ATOM_STR("scheduler_bind_type", BIF_ARG_1)) {
@@ -4496,7 +4496,7 @@ BIF_RETTYPE system_flag_2(BIF_ALIST_2)
BIF_P->group_leader,
"A call to erlang:system_flag(scheduler_bind_type, _) was\n"
"made. The scheduler_bind_type argument is deprecated and\n"
- "scheduled for removal in erts-5.10/OTP-R16. For more\n"
+ "scheduled for removal in Erlang/OTP 18. For more\n"
"information see the erlang:system_flag/2 documentation.\n");
return erts_bind_schedulers(BIF_P, BIF_ARG_2);
}
diff --git a/erts/emulator/beam/bif.tab b/erts/emulator/beam/bif.tab
index dd50df636c..3ec534f0bc 100644
--- a/erts/emulator/beam/bif.tab
+++ b/erts/emulator/beam/bif.tab
@@ -45,7 +45,6 @@ bif erlang:apply/3
bif erlang:atom_to_list/1
bif erlang:binary_to_list/1
bif erlang:binary_to_list/3
-bif erlang:binary_to_term/1
bif erlang:crc32/1
bif erlang:crc32/2
bif erlang:crc32_combine/3
@@ -152,6 +151,8 @@ bif erts_internal:port_command/3
bif erts_internal:port_control/3
bif erts_internal:port_close/1
bif erts_internal:port_connect/2
+bif erts_internal:binary_to_term/1
+bif erts_internal:binary_to_term/2
bif erts_internal:request_system_task/3
bif erts_internal:check_process_code/2
@@ -479,11 +480,6 @@ bif erlang:call_on_load_function/1
bif erlang:finish_after_on_load/2
#
-# New Bifs in R13B4
-#
-bif erlang:binary_to_term/2
-
-#
# The binary match bifs (New in R14A - EEP9)
#
diff --git a/erts/emulator/beam/big.c b/erts/emulator/beam/big.c
index 2b27b111d8..41a041eba6 100644
--- a/erts/emulator/beam/big.c
+++ b/erts/emulator/beam/big.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -1603,9 +1603,11 @@ big_to_double(Wterm x, double* resp)
/*
* Logic has been copied from erl_bif_guard.c and slightly
* modified to use a static instead of dynamic heap
+ *
+ * HALFWORD: Return relative term with 'heap' as base.
*/
Eterm
-double_to_big(double x, Eterm *heap)
+double_to_big(double x, Eterm *heap, Uint hsz)
{
int is_negative;
int ds;
@@ -1633,9 +1635,10 @@ double_to_big(double x, Eterm *heap)
sz = BIG_NEED_SIZE(ds); /* number of words including arity */
hp = heap;
- res = make_big(hp);
+ res = make_big_rel(hp, heap);
xp = (ErtsDigit*) (hp + 1);
+ ASSERT(ds < hsz);
for (i = ds - 1; i >= 0; i--) {
ErtsDigit d;
diff --git a/erts/emulator/beam/big.h b/erts/emulator/beam/big.h
index 1a7b14170f..d80111822e 100644
--- a/erts/emulator/beam/big.h
+++ b/erts/emulator/beam/big.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -141,7 +141,7 @@ Eterm big_lshift(Eterm, Sint, Eterm*);
int big_comp (Wterm, Wterm);
int big_ucomp (Eterm, Eterm);
int big_to_double(Wterm x, double* resp);
-Eterm double_to_big(double, Eterm*);
+Eterm double_to_big(double, Eterm*, Uint hsz);
Eterm small_to_big(Sint, Eterm*);
Eterm uint_to_big(Uint, Eterm*);
Eterm uword_to_big(UWord, Eterm*);
diff --git a/erts/emulator/beam/erl_alloc.c b/erts/emulator/beam/erl_alloc.c
index b5ba9bb94a..8094c6ee2e 100644
--- a/erts/emulator/beam/erl_alloc.c
+++ b/erts/emulator/beam/erl_alloc.c
@@ -75,9 +75,9 @@
#define ERTS_ALC_DEFAULT_ENABLED_ACUL_EHEAP_ALLOC 45
#define ERTS_ALC_DEFAULT_ENABLED_ACUL_LL_ALLOC 85
-#define ERTS_ALC_DEFAULT_ACUL 0
-#define ERTS_ALC_DEFAULT_ACUL_EHEAP_ALLOC 0
-#define ERTS_ALC_DEFAULT_ACUL_LL_ALLOC 0
+#define ERTS_ALC_DEFAULT_ACUL ERTS_ALC_DEFAULT_ENABLED_ACUL
+#define ERTS_ALC_DEFAULT_ACUL_EHEAP_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_EHEAP_ALLOC
+#define ERTS_ALC_DEFAULT_ACUL_LL_ALLOC ERTS_ALC_DEFAULT_ENABLED_ACUL_LL_ALLOC
#ifndef ERTS_SMP
# undef ERTS_ALC_DEFAULT_ACUL
diff --git a/erts/emulator/beam/erl_alloc.types b/erts/emulator/beam/erl_alloc.types
index 32308fae9b..b4e52770e3 100644
--- a/erts/emulator/beam/erl_alloc.types
+++ b/erts/emulator/beam/erl_alloc.types
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2003-2013. All Rights Reserved.
+# Copyright Ericsson AB 2003-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -150,7 +150,7 @@ type LINK_LH STANDARD PROCESSES link_lh
type SUSPEND_MON STANDARD PROCESSES suspend_monitor
type PEND_SUSPEND SHORT_LIVED PROCESSES pending_suspend
type PROC_LIST SHORT_LIVED PROCESSES proc_list
-type EXTRA_ROOT SHORT_LIVED PROCESSES extra_root
+type SAVED_ESTACK SHORT_LIVED PROCESSES saved_estack
type FUN_ENTRY LONG_LIVED CODE fun_entry
type ATOM_TXT LONG_LIVED ATOM atom_text
type BEAM_REGISTER EHEAP PROCESSES beam_register
diff --git a/erts/emulator/beam/erl_async.c b/erts/emulator/beam/erl_async.c
index e6d72f569b..f0cec1c53c 100644
--- a/erts/emulator/beam/erl_async.c
+++ b/erts/emulator/beam/erl_async.c
@@ -602,7 +602,7 @@ unsigned int driver_async_port_key(ErlDrvPort port)
** return values:
** 0 completed
** -1 error
-** N handle value (used with async_cancel)
+** N handle value
** arguments:
** ix driver index
** key pointer to secedule queue (NULL means round robin)
@@ -687,23 +687,3 @@ long driver_async(ErlDrvPort ix, unsigned int* key,
return id;
}
-
-int driver_async_cancel(unsigned int id)
-{
- /*
- * Not supported anymore. Always fail (which is backward
- * compatible).
- *
- * This functionality could be implemented again. However,
- * it is (and always has been) completely useless since
- * it doesn't give you any guarantees whatsoever. The user
- * needs to (and always have had to) synchronize in his/her
- * own code in order to get any guarantees.
- */
- return 0;
-}
-
-
-
-
-
diff --git a/erts/emulator/beam/erl_bif_ddll.c b/erts/emulator/beam/erl_bif_ddll.c
index 1c3e955f47..1728b200f7 100644
--- a/erts/emulator/beam/erl_bif_ddll.c
+++ b/erts/emulator/beam/erl_bif_ddll.c
@@ -182,7 +182,7 @@ BIF_RETTYPE erl_ddll_try_load_3(BIF_ALIST_3)
Eterm name_term = BIF_ARG_2;
Eterm options = BIF_ARG_3;
char *path = NULL;
- ErlDrvSizeT path_len;
+ Sint path_len;
char *name = NULL;
DE_Handle *dh;
erts_driver_t *drv;
@@ -198,6 +198,7 @@ BIF_RETTYPE erl_ddll_try_load_3(BIF_ALIST_3)
int kill_ports = 0;
int do_build_load_error = 0;
int build_this_load_error = 0;
+ int encoding;
for(l = options; is_list(l); l = CDR(list_val(l))) {
Eterm opt = CAR(list_val(l));
@@ -257,18 +258,23 @@ BIF_RETTYPE erl_ddll_try_load_3(BIF_ALIST_3)
goto error;
}
- if (erts_iolist_size(path_term, &path_len)) {
- goto error;
+ encoding = erts_get_native_filename_encoding();
+ if (encoding == ERL_FILENAME_WIN_WCHAR) {
+ /* Do not convert the lib name to utf-16le yet, do that in win32 specific code */
+ /* since lib_name is used in error messages */
+ encoding = ERL_FILENAME_UTF8;
}
- path = erts_alloc(ERTS_ALC_T_DDLL_TMP_BUF, path_len + 1 /* might need path separator */ + sys_strlen(name) + 1);
- if (erts_iolist_to_buf(path_term, path, path_len) != 0) {
+ path = erts_convert_filename_to_encoding(path_term, NULL, 0,
+ ERTS_ALC_T_DDLL_TMP_BUF, 1, 0,
+ encoding, &path_len,
+ sys_strlen(name) + 2); /* might need path separator */
+ if (!path) {
goto error;
}
- while (path_len > 0 && (path[path_len-1] == '\\' || path[path_len-1] == '/')) {
- --path_len;
- }
+ ASSERT(path_len > 0 && path[path_len-1] == 0);
+ while (--path_len > 0 && (path[path_len-1] == '\\' || path[path_len-1] == '/'))
+ ;
path[path_len++] = '/';
- /*path[path_len] = '\0';*/
sys_strcpy(path+path_len,name);
#if DDLL_SMP
@@ -1524,7 +1530,7 @@ static int do_load_driver_entry(DE_Handle *dh, char *path, char *name)
assert_drv_list_rwlocked();
- if ((res = erts_sys_ddll_open(path, &(dh->handle))) != ERL_DE_NO_ERROR) {
+ if ((res = erts_sys_ddll_open(path, &(dh->handle), NULL)) != ERL_DE_NO_ERROR) {
return res;
}
diff --git a/erts/emulator/beam/erl_bif_info.c b/erts/emulator/beam/erl_bif_info.c
index 2b40f9272d..e0b654cb22 100755
--- a/erts/emulator/beam/erl_bif_info.c
+++ b/erts/emulator/beam/erl_bif_info.c
@@ -64,8 +64,10 @@ static Export *gather_gc_info_res_trap;
#define DECL_AM(S) Eterm AM_ ## S = am_atom_put(#S, sizeof(#S) - 1)
+static char otp_correction_package[] = ERLANG_OTP_CORRECTION_PACKAGE;
/* Keep erts_system_version as a global variable for easy access from a core */
static char erts_system_version[] = ("Erlang/OTP " ERLANG_OTP_RELEASE
+ "%s"
" [erts-" ERLANG_VERSION "]"
#if !HEAP_ON_C_STACK && !HALFWORD_HEAP
" [no-c-stack-objects]"
@@ -304,11 +306,28 @@ make_link_list(Process *p, ErtsLink *root, Eterm tail)
int
erts_print_system_version(int to, void *arg, Process *c_p)
{
+ int i, rc = -1;
+ char *rc_str = "";
+ char rc_buf[100];
+ char *ocp = otp_correction_package;
#ifdef ERTS_SMP
Uint total, online, active;
(void) erts_schedulers_state(&total, &online, &active, 0);
#endif
- return erts_print(to, arg, erts_system_version
+ for (i = 0; i < sizeof(otp_correction_package)-4; i++) {
+ if (ocp[i] == '-' && ocp[i+1] == 'r' && ocp[i+2] == 'c')
+ rc = atoi(&ocp[i+3]);
+ }
+ if (rc >= 0) {
+ if (rc == 0)
+ rc_str = " [DEVELOPMENT]";
+ else {
+ erts_snprintf(rc_buf, sizeof(rc_buf), " [RELEASE CANDIDATE %d]", rc);
+ rc_str = rc_buf;
+ }
+ }
+ return erts_print(to, arg, erts_system_version,
+ rc_str
#ifdef ERTS_SMP
, total, online
#endif
@@ -2417,6 +2436,10 @@ BIF_RETTYPE system_info_1(BIF_ALIST_1)
DECL_AM(unknown);
BIF_RET(AM_unknown);
}
+ } else if (ERTS_IS_ATOM_STR("otp_correction_package", BIF_ARG_1)) {
+ int n = sizeof(ERLANG_OTP_CORRECTION_PACKAGE)-1;
+ hp = HAlloc(BIF_P, 2*n);
+ BIF_RET(buf_to_intlist(&hp, ERLANG_OTP_CORRECTION_PACKAGE, n, NIL));
} else if (ERTS_IS_ATOM_STR("otp_release", BIF_ARG_1)) {
int n = sizeof(ERLANG_OTP_RELEASE)-1;
hp = HAlloc(BIF_P, 2*n);
@@ -3613,8 +3636,9 @@ BIF_RETTYPE erts_debug_set_internal_state_2(BIF_ALIST_2)
default: BIF_ERROR(BIF_P, BADARG); break;
}
- res = erts_set_gc_state(BIF_P, enable);
- BIF_RET(res ? am_true : am_false);
+ res = (BIF_P->flags & F_DISABLE_GC) ? am_false : am_true;
+ erts_set_gc_state(BIF_P, enable);
+ BIF_RET(res);
}
else if (ERTS_IS_ATOM_STR("send_fake_exit_signal", BIF_ARG_1)) {
/* Used by signal_SUITE (emulator) */
diff --git a/erts/emulator/beam/erl_bif_port.c b/erts/emulator/beam/erl_bif_port.c
index 864349491a..f298422267 100644
--- a/erts/emulator/beam/erl_bif_port.c
+++ b/erts/emulator/beam/erl_bif_port.c
@@ -808,7 +808,7 @@ open_port(Process* p, Eterm name, Eterm settings, int *err_typep, int *err_nump)
if (encoding == ERL_FILENAME_WIN_WCHAR) {
encoding = ERL_FILENAME_UTF8;
}
- if ((name_buf = erts_convert_filename_to_encoding(name, NULL, 0, ERTS_ALC_T_TMP,0,1, encoding, NULL))
+ if ((name_buf = erts_convert_filename_to_encoding(name, NULL, 0, ERTS_ALC_T_TMP,0,1, encoding, NULL, 0))
== NULL) {
goto badarg;
}
diff --git a/erts/emulator/beam/erl_bif_re.c b/erts/emulator/beam/erl_bif_re.c
index 99c31738a5..448c6f6f6d 100644
--- a/erts/emulator/beam/erl_bif_re.c
+++ b/erts/emulator/beam/erl_bif_re.c
@@ -1196,8 +1196,8 @@ re_run(Process *p, Eterm arg1, Eterm arg2, Eterm arg3)
ovsize = 3*(unsigned_val(tp[2])+1);
code_size = binary_size(tp[5]);
- if ((code_tmp = (const pcre *)
- erts_get_aligned_binary_bytes(tp[5], &temp_alloc)) == NULL) {
+ code_tmp = (const pcre *) erts_get_aligned_binary_bytes(tp[5], &temp_alloc);
+ if (code_tmp == NULL || code_size < 4) {
erts_free_aligned_binary_bytes(temp_alloc);
BIF_ERROR(p, BADARG);
}
diff --git a/erts/emulator/beam/erl_db_util.c b/erts/emulator/beam/erl_db_util.c
index ef3749a2c4..a358ecf326 100644
--- a/erts/emulator/beam/erl_db_util.c
+++ b/erts/emulator/beam/erl_db_util.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -1838,7 +1838,7 @@ restart:
ep = termp;
break;
case matchArrayBind: /* When the array size is unknown. */
- ASSERT(termp);
+ ASSERT(termp || arity==0);
n = *pc++;
variables[n].term = dpm_array_to_list(psp, termp, arity);
break;
diff --git a/erts/emulator/beam/erl_debug.c b/erts/emulator/beam/erl_debug.c
index dc79d45be7..873a9860da 100644
--- a/erts/emulator/beam/erl_debug.c
+++ b/erts/emulator/beam/erl_debug.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1998-2012. All Rights Reserved.
+ * Copyright Ericsson AB 1998-2013. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
diff --git a/erts/emulator/beam/erl_driver.h b/erts/emulator/beam/erl_driver.h
index 5cffae92be..2bd3181bdc 100644
--- a/erts/emulator/beam/erl_driver.h
+++ b/erts/emulator/beam/erl_driver.h
@@ -132,8 +132,8 @@ typedef struct {
#define DO_WRITE ERL_DRV_WRITE
#define ERL_DRV_EXTENDED_MARKER (0xfeeeeeed)
-#define ERL_DRV_EXTENDED_MAJOR_VERSION 2
-#define ERL_DRV_EXTENDED_MINOR_VERSION 2
+#define ERL_DRV_EXTENDED_MAJOR_VERSION 3
+#define ERL_DRV_EXTENDED_MINOR_VERSION 0
/*
* The emulator will refuse to load a driver with different major
@@ -657,12 +657,6 @@ EXTERN long driver_async(ErlDrvPort ix,
void* async_data,
void (*async_free)(void*));
-/*
- * driver_async_cancel() is deprecated. It is scheduled for removal
- * in OTP-R16. For more information see the erl_driver(3) documentation.
- */
-EXTERN int driver_async_cancel(unsigned int key) ERL_DRV_DEPRECATED_FUNC;
-
/* Locks the driver in the machine "forever", there is
no unlock function. Note that this is almost never useful, as an open
port towards the driver locks it until the port is closed, why unexpected
diff --git a/erts/emulator/beam/erl_gc.c b/erts/emulator/beam/erl_gc.c
index c5585d39e8..ab8448e8a1 100644
--- a/erts/emulator/beam/erl_gc.c
+++ b/erts/emulator/beam/erl_gc.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2002-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2002-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -1157,7 +1157,7 @@ do_minor(Process *p, Uint new_sz, Eterm* objv, int nobj)
old_htop = sweep_one_area(OLD_HTOP(p), old_htop, heap, heap_size);
}
OLD_HTOP(p) = old_htop;
- HIGH_WATER(p) = (HEAP_START(p) != HIGH_WATER(p)) ? n_heap : n_htop;
+ HIGH_WATER(p) = n_htop;
if (MSO(p).first) {
sweep_off_heap(p, 0);
@@ -1975,17 +1975,6 @@ setup_rootset(Process *p, Eterm *objv, int nobj, Rootset *rootset)
++n;
}
- /*
- * A trapping BIF can add to rootset by setting the extra_root
- * in the process_structure.
- */
- if (p->extra_root != NULL) {
- roots[n].v = p->extra_root->objv;
- roots[n].sz = p->extra_root->sz;
- ++n;
- }
-
-
ASSERT((is_nil(p->seq_trace_token) ||
is_tuple(follow_moved(p->seq_trace_token)) ||
is_atom(p->seq_trace_token)));
@@ -2563,11 +2552,6 @@ offset_one_rootset(Process *p, Sint offs, char* area, Uint area_size,
p->dictionary->used,
offs, area, area_size);
}
- if (p->extra_root != NULL) {
- offset_heap_ptr(p->extra_root->objv,
- p->extra_root->sz,
- offs, area, area_size);
- }
offset_heap_ptr(&p->fvalue, 1, offs, area, area_size);
offset_heap_ptr(&p->ftrace, 1, offs, area, area_size);
diff --git a/erts/emulator/beam/erl_init.c b/erts/emulator/beam/erl_init.c
index 8c4fffa75b..19088fd913 100644
--- a/erts/emulator/beam/erl_init.c
+++ b/erts/emulator/beam/erl_init.c
@@ -537,6 +537,12 @@ void erts_usage(void)
erts_fprintf(stderr, " see the erl(1) documentation for more info.\n");
erts_fprintf(stderr, "-sct cput set cpu topology,\n");
erts_fprintf(stderr, " see the erl(1) documentation for more info.\n");
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT
+ erts_fprintf(stderr, "-sub bool enable/disable scheduler utilization balancing,\n");
+#else
+ erts_fprintf(stderr, "-sub false disable scheduler utilization balancing,\n");
+#endif
+ erts_fprintf(stderr, " see the erl(1) documentation for more info.\n");
erts_fprintf(stderr, "-sws val set scheduler wakeup strategy, valid values are:\n");
erts_fprintf(stderr, " default|legacy.\n");
erts_fprintf(stderr, "-swct val set scheduler wake cleanup threshold, valid values are:\n");
@@ -553,8 +559,8 @@ void erts_usage(void)
erts_fprintf(stderr, " numbers is %d\n",
ERTS_MAX_NO_OF_SCHEDULERS);
erts_fprintf(stderr, "-SP p1:p2 specify schedulers (p1) and schedulers online (p2)\n");
- erts_fprintf(stderr, " as percentages of logical processors configured and logical\n");
- erts_fprintf(stderr, " processors available, respectively\n");
+ erts_fprintf(stderr, " as percentages of logical processors configured and logical\n");
+ erts_fprintf(stderr, " processors available, respectively\n");
erts_fprintf(stderr, "-t size set the maximum number of atoms the "
"emulator can handle\n");
erts_fprintf(stderr, " valid range is [%d-%d]\n",
@@ -1433,8 +1439,10 @@ erl_start(int argc, char **argv)
}
else if (has_prefix("cl", sub_param)) {
arg = get_arg(sub_param+2, argv[i+1], &i);
- if (sys_strcmp("true", arg) == 0)
+ if (sys_strcmp("true", arg) == 0) {
erts_sched_compact_load = 1;
+ erts_sched_balance_util = 0;
+ }
else if (sys_strcmp("false", arg) == 0)
erts_sched_compact_load = 0;
else {
@@ -1512,6 +1520,26 @@ erl_start(int argc, char **argv)
erts_usage();
}
}
+ else if (has_prefix("ub", sub_param)) {
+ arg = get_arg(sub_param+2, argv[i+1], &i);
+ if (sys_strcmp("true", arg) == 0) {
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT
+ erts_sched_balance_util = 1;
+#else
+ erts_fprintf(stderr,
+ "scheduler utilization balancing not "
+ "supported on this system\n");
+ erts_usage();
+#endif
+ }
+ else if (sys_strcmp("false", arg) == 0)
+ erts_sched_balance_util = 0;
+ else {
+ erts_fprintf(stderr, "bad scheduler utilization balancing "
+ " value '%s'\n", arg);
+ erts_usage();
+ }
+ }
else if (has_prefix("wct", sub_param)) {
arg = get_arg(sub_param+3, argv[i+1], &i);
if (erts_sched_set_wake_cleanup_threshold(arg) != 0) {
diff --git a/erts/emulator/beam/erl_nif.c b/erts/emulator/beam/erl_nif.c
index e87959f0ab..dc285b3cf7 100644
--- a/erts/emulator/beam/erl_nif.c
+++ b/erts/emulator/beam/erl_nif.c
@@ -1407,7 +1407,7 @@ void* enif_dlopen(const char* lib,
ErtsSysDdllError errdesc = ERTS_SYS_DDLL_ERROR_INIT;
void* handle;
void* init_func;
- if (erts_sys_ddll_open2(lib, &handle, &errdesc) == ERL_DE_NO_ERROR) {
+ if (erts_sys_ddll_open(lib, &handle, &errdesc) == ERL_DE_NO_ERROR) {
if (erts_sys_ddll_load_nif_init(handle, &init_func, &errdesc) == ERL_DE_NO_ERROR) {
erts_sys_ddll_call_nif_init(init_func);
}
@@ -1587,7 +1587,8 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2)
encoding = ERL_FILENAME_UTF8;
}
lib_name = erts_convert_filename_to_encoding(BIF_ARG_1, NULL, 0,
- ERTS_ALC_T_TMP, 1, 0, encoding, NULL);
+ ERTS_ALC_T_TMP, 1, 0, encoding,
+ NULL, 0);
if (!lib_name) {
BIF_ERROR(BIF_P, BADARG);
}
@@ -1626,7 +1627,7 @@ BIF_RETTYPE load_nif_2(BIF_ALIST_2)
"module '%T' not allowed", mod_atom);
}
else if (init_func == NULL &&
- (err=erts_sys_ddll_open2(lib_name, &handle, &errdesc)) != ERL_DE_NO_ERROR) {
+ (err=erts_sys_ddll_open(lib_name, &handle, &errdesc)) != ERL_DE_NO_ERROR) {
const char slogan[] = "Failed to load NIF library";
if (strstr(errdesc.str, lib_name) != NULL) {
ret = load_nif_error(BIF_P, "load_failed", "%s: '%s'", slogan, errdesc.str);
diff --git a/erts/emulator/beam/erl_port_task.c b/erts/emulator/beam/erl_port_task.c
index 547a42beb2..d4108067d0 100644
--- a/erts/emulator/beam/erl_port_task.c
+++ b/erts/emulator/beam/erl_port_task.c
@@ -877,6 +877,11 @@ enqueue_port(ErtsRunQueue *runq, Port *pp)
ASSERT(runq->ports.start && runq->ports.end);
erts_smp_inc_runq_len(runq, &runq->ports.info, ERTS_PORT_PRIO_LEVEL);
+
+#ifdef ERTS_SMP
+ if (runq->halt_in_progress)
+ erts_non_empty_runq(runq);
+#endif
}
static ERTS_INLINE Port *
diff --git a/erts/emulator/beam/erl_process.c b/erts/emulator/beam/erl_process.c
index 0a41fb596d..74cd84a998 100644
--- a/erts/emulator/beam/erl_process.c
+++ b/erts/emulator/beam/erl_process.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -144,6 +144,7 @@ extern BeamInstr beam_exit[];
extern BeamInstr beam_continue_exit[];
int erts_sched_compact_load;
+int erts_sched_balance_util = 0;
Uint erts_no_schedulers;
#define ERTS_THR_PRGR_LATER_CLEANUP_OP_THRESHOLD_VERY_LAZY (4*1024*1024)
@@ -608,6 +609,7 @@ erts_late_init_process(void)
static void
init_sched_wall_time(ErtsSchedWallTime *swtp)
{
+ swtp->need = erts_sched_balance_util;
swtp->enabled = 0;
swtp->start = 0;
swtp->working.total = 0;
@@ -630,27 +632,253 @@ sched_wall_time_ts(void)
#endif
}
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+
+#ifdef ARCH_64
+
+static ERTS_INLINE Uint64
+aschedtime_read(ErtsAtomicSchedTime *var)
+{
+ return (Uint64) erts_atomic_read_nob((erts_atomic_t *) var);
+}
+
+static ERTS_INLINE void
+aschedtime_set(ErtsAtomicSchedTime *var, Uint64 val)
+{
+ erts_atomic_set_nob((erts_atomic_t *) var, (erts_aint_t) val);
+}
+
+static ERTS_INLINE void
+aschedtime_init(ErtsAtomicSchedTime *var)
+{
+ erts_atomic_init_nob((erts_atomic_t *) var, (erts_aint_t) 0);
+}
+
+#elif defined(ARCH_32)
+
+static ERTS_INLINE Uint64
+aschedtime_read(ErtsAtomicSchedTime *var)
+{
+ erts_dw_aint_t dw;
+ erts_dw_atomic_read_nob((erts_dw_atomic_t *) var, &dw);
+#ifdef ETHR_SU_DW_NAINT_T__
+ return (Uint64) dw.dw_sint;
+#else
+ {
+ Uint64 res;
+ res = (Uint64) ((Uint32) dw.sint[ERTS_DW_AINT_HIGH_WORD]);
+ res <<= 32;
+ res |= (Uint64) ((Uint32) dw.sint[ERTS_DW_AINT_LOW_WORD]);
+ return res;
+ }
+#endif
+}
+
+static ERTS_INLINE void
+aschedtime_set(ErtsAtomicSchedTime *var, Uint64 val)
+{
+ erts_dw_aint_t dw;
+#ifdef ETHR_SU_DW_NAINT_T__
+ dw.dw_sint = (ETHR_SU_DW_NAINT_T__) val;
+#else
+ dw.sint[ERTS_DW_AINT_LOW_WORD] = (erts_aint_t) (val & 0xffffffff);
+ dw.sint[ERTS_DW_AINT_HIGH_WORD] = (erts_aint_t) ((val >> 32) & 0xffffffff);
+#endif
+ erts_dw_atomic_set_nob((erts_dw_atomic_t *) var, &dw);
+}
+
+static ERTS_INLINE void
+aschedtime_init(ErtsAtomicSchedTime *var)
+{
+ erts_dw_aint_t dw;
+ dw.sint[ERTS_DW_AINT_LOW_WORD] = (erts_aint_t) 0;
+ dw.sint[ERTS_DW_AINT_HIGH_WORD] = (erts_aint_t) 0;
+ erts_dw_atomic_init_nob((erts_dw_atomic_t *) var, &dw);
+}
+
+#else
+# error :-/
+#endif
+
+#define ERTS_GET_AVG_MAX_UNLOCKED_TRY 50
+#define ERTS_SCHED_AVG_UTIL_WRITE_MARKER (~((Uint64) 0))
+
+/* Intervals in nanoseconds */
+#define ERTS_SCHED_UTIL_SHORT_INTERVAL ((Uint64) 1*1000*1000*1000)
+#define ERTS_SCHED_UTIL_LONG_INTERVAL ((Uint64) 10*1000*1000*1000)
+
+
+#define ERTS_SCHED_UTIL_IGNORE_IMBALANCE_DIFF 5000 /* ppm */
+
+static ERTS_INLINE Uint64
+calc_sched_worktime(int is_working, Uint64 now, Uint64 last,
+ Uint64 interval, Uint64 old_worktime)
+{
+ Uint64 worktime;
+ Uint64 new;
+
+ if (now <= last)
+ return old_worktime;
+
+ new = now - last;
+
+ if (new >= interval)
+ return is_working ? interval : (Uint64) 0;
+
+
+ /*
+ * Division by 1000 in order to avoid
+ * overflow. If changed update assertions
+ * in init_runq_sched_util().
+ */
+ worktime = old_worktime;
+ worktime *= (interval - new)/1000;
+ worktime /= (interval/1000);
+ if (is_working)
+ worktime += new;
+
+ ASSERT(0 <= worktime && worktime <= interval);
+
+ return worktime;
+}
+
+static ERTS_INLINE void
+update_avg_sched_util(ErtsSchedulerData *esdp, Uint64 now, int is_working)
+{
+ ErtsRunQueue *rq;
+ int worked;
+ Uint64 swt, lwt, last;
+
+ rq = esdp->run_queue;
+ last = aschedtime_read(&rq->sched_util.last);
+
+ if (now <= last) {
+ ASSERT(last == ERTS_SCHED_AVG_UTIL_WRITE_MARKER);
+ return;
+ }
+
+ ASSERT(now >= last);
+
+ worked = rq->sched_util.is_working;
+
+ swt = calc_sched_worktime(worked, now, last, ERTS_SCHED_UTIL_SHORT_INTERVAL,
+ rq->sched_util.worktime.short_interval);
+ lwt = calc_sched_worktime(worked, now, last, ERTS_SCHED_UTIL_LONG_INTERVAL,
+ rq->sched_util.worktime.long_interval);
+
+ aschedtime_set(&rq->sched_util.last, ERTS_SCHED_AVG_UTIL_WRITE_MARKER);
+ ERTS_THR_WRITE_MEMORY_BARRIER;
+ rq->sched_util.is_working = is_working;
+ rq->sched_util.worktime.short_interval = swt;
+ rq->sched_util.worktime.long_interval = lwt;
+ ERTS_THR_WRITE_MEMORY_BARRIER;
+ aschedtime_set(&rq->sched_util.last, now);
+}
+
+int
+erts_get_sched_util(ErtsRunQueue *rq, int initially_locked, int short_interval)
+{
+ /* Average scheduler utilization in ppm */
+ int util, is_working, try = 0, locked = initially_locked;
+ Uint64 worktime, old_worktime, now, last, interval, *old_worktimep;
+
+ if (short_interval) {
+ old_worktimep = &rq->sched_util.worktime.short_interval;
+ interval = ERTS_SCHED_UTIL_SHORT_INTERVAL;
+ }
+ else {
+ old_worktimep = &rq->sched_util.worktime.long_interval;
+ interval = ERTS_SCHED_UTIL_LONG_INTERVAL;
+ }
+
+ while (1) {
+ Uint64 chk_last;
+ last = aschedtime_read(&rq->sched_util.last);
+ ERTS_THR_READ_MEMORY_BARRIER;
+ is_working = rq->sched_util.is_working;
+ old_worktime = *old_worktimep;
+ ERTS_THR_READ_MEMORY_BARRIER;
+ chk_last = aschedtime_read(&rq->sched_util.last);
+ if (chk_last == last)
+ break;
+ if (!locked) {
+ if (++try >= ERTS_GET_AVG_MAX_UNLOCKED_TRY) {
+ /* Writer will eventually block on runq-lock */
+ erts_smp_runq_lock(rq);
+ locked = 1;
+ }
+ }
+ }
+
+ if (!initially_locked && locked)
+ erts_smp_runq_unlock(rq);
+
+ now = sched_wall_time_ts();
+ worktime = calc_sched_worktime(is_working, now, last, interval, old_worktime);
+
+ util = (int) ((worktime * 1000000)/interval);
+
+ ASSERT(0 <= util && util <= 1000000);
+
+ return util;
+}
+
+static void
+init_runq_sched_util(ErtsRunQueueSchedUtil *rqsu, int enabled)
+{
+ aschedtime_init(&rqsu->last);
+ if (!enabled)
+ aschedtime_set(&rqsu->last, ERTS_SCHED_AVG_UTIL_WRITE_MARKER);
+ rqsu->is_working = 0;
+ rqsu->worktime.short_interval = (Uint64) 0;
+ rqsu->worktime.long_interval = (Uint64) 0;
+
+#ifdef DEBUG
+ {
+ Uint64 intrvl;
+ /*
+ * If one of these asserts fail we may have
+ * overflow in calc_sched_worktime(). Which
+ * have to be fixed either by shrinking
+ * interval size, or fix calculation of
+ * worktime in calc_sched_worktime().
+ */
+ intrvl = ERTS_SCHED_UTIL_SHORT_INTERVAL;
+ ASSERT(intrvl*(intrvl/1000) > intrvl);
+ intrvl = ERTS_SCHED_UTIL_LONG_INTERVAL;
+ ASSERT(intrvl*(intrvl/1000) > intrvl);
+ }
+#endif
+}
+
+#endif /* ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT */
+
static ERTS_INLINE void
sched_wall_time_change(ErtsSchedulerData *esdp, int working)
{
- if (esdp->sched_wall_time.enabled) {
+ if (esdp->sched_wall_time.need) {
Uint64 ts = sched_wall_time_ts();
- if (working) {
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ update_avg_sched_util(esdp, ts, working);
+#endif
+ if (esdp->sched_wall_time.enabled) {
+ if (working) {
#ifdef DEBUG
- ASSERT(!esdp->sched_wall_time.working.currently);
- esdp->sched_wall_time.working.currently = 1;
+ ASSERT(!esdp->sched_wall_time.working.currently);
+ esdp->sched_wall_time.working.currently = 1;
#endif
- ts -= esdp->sched_wall_time.start;
- esdp->sched_wall_time.working.start = ts;
- }
- else {
+ ts -= esdp->sched_wall_time.start;
+ esdp->sched_wall_time.working.start = ts;
+ }
+ else {
#ifdef DEBUG
- ASSERT(esdp->sched_wall_time.working.currently);
- esdp->sched_wall_time.working.currently = 0;
+ ASSERT(esdp->sched_wall_time.working.currently);
+ esdp->sched_wall_time.working.currently = 0;
#endif
- ts -= esdp->sched_wall_time.start;
- ts -= esdp->sched_wall_time.working.start;
- esdp->sched_wall_time.working.total += ts;
+ ts -= esdp->sched_wall_time.start;
+ ts -= esdp->sched_wall_time.working.start;
+ esdp->sched_wall_time.working.total += ts;
+ }
}
}
}
@@ -705,10 +933,13 @@ reply_sched_wall_time(void *vswtrp)
ASSERT(esdp);
if (swtrp->set) {
- if (!swtrp->enable && esdp->sched_wall_time.enabled)
+ if (!swtrp->enable && esdp->sched_wall_time.enabled) {
+ esdp->sched_wall_time.need = erts_sched_balance_util;
esdp->sched_wall_time.enabled = 0;
+ }
else if (swtrp->enable && !esdp->sched_wall_time.enabled) {
Uint64 ts = sched_wall_time_ts();
+ esdp->sched_wall_time.need = 1;
esdp->sched_wall_time.enabled = 1;
esdp->sched_wall_time.start = ts;
esdp->sched_wall_time.working.total = 0;
@@ -2084,9 +2315,8 @@ ongoing_multi_scheduling_block(void)
}
static ERTS_INLINE void
-empty_runq(ErtsRunQueue *rq)
+empty_runq_aux(ErtsRunQueue *rq, Uint32 old_flags)
{
- Uint32 old_flags = ERTS_RUNQ_FLGS_UNSET(rq, ERTS_RUNQ_FLG_NONEMPTY|ERTS_RUNQ_FLG_PROTECTED);
if (old_flags & ERTS_RUNQ_FLG_NONEMPTY) {
#ifdef DEBUG
erts_aint32_t empty = erts_smp_atomic32_read_nob(&no_empty_run_queues);
@@ -2107,6 +2337,23 @@ empty_runq(ErtsRunQueue *rq)
}
static ERTS_INLINE void
+empty_runq(ErtsRunQueue *rq)
+{
+ Uint32 old_flags = ERTS_RUNQ_FLGS_UNSET(rq, ERTS_RUNQ_FLG_NONEMPTY|ERTS_RUNQ_FLG_PROTECTED);
+ empty_runq_aux(rq, old_flags);
+}
+
+static ERTS_INLINE Uint32
+empty_protected_runq(ErtsRunQueue *rq)
+{
+ Uint32 old_flags = ERTS_RUNQ_FLGS_BSET(rq,
+ ERTS_RUNQ_FLG_NONEMPTY|ERTS_RUNQ_FLG_PROTECTED,
+ ERTS_RUNQ_FLG_PROTECTED);
+ empty_runq_aux(rq, old_flags);
+ return old_flags;
+}
+
+static ERTS_INLINE void
non_empty_runq(ErtsRunQueue *rq)
{
Uint32 old_flags = ERTS_RUNQ_FLGS_SET(rq, ERTS_RUNQ_FLG_NONEMPTY);
@@ -2130,6 +2377,18 @@ non_empty_runq(ErtsRunQueue *rq)
}
}
+void
+erts_empty_runq(ErtsRunQueue *rq)
+{
+ empty_runq(rq);
+}
+
+void
+erts_non_empty_runq(ErtsRunQueue *rq)
+{
+ non_empty_runq(rq);
+}
+
static erts_aint32_t
sched_prep_spin_wait(ErtsSchedulerSleepInfo *ssi)
{
@@ -2632,7 +2891,7 @@ ssi_flags_set_wake(ErtsSchedulerSleepInfo *ssi)
}
static void
-wake_scheduler(ErtsRunQueue *rq, int incq)
+wake_scheduler(ErtsRunQueue *rq)
{
ErtsSchedulerSleepInfo *ssi;
erts_aint32_t flgs;
@@ -2651,9 +2910,6 @@ wake_scheduler(ErtsRunQueue *rq, int incq)
flgs = ssi_flags_set_wake(ssi);
erts_sched_finish_poke(ssi, flgs);
-
- if (incq && (flgs & ERTS_SSI_FLG_WAITING))
- non_empty_runq(rq);
}
#define ERTS_NO_USED_RUNQS_SHIFT 16
@@ -2744,7 +3000,7 @@ chk_wake_sched(ErtsRunQueue *crq, int ix, int activate)
if (try_inc_no_active_runqs(ix+1))
(void) ERTS_RUNQ_FLGS_UNSET(wrq, ERTS_RUNQ_FLG_INACTIVE);
}
- wake_scheduler(wrq, 0);
+ wake_scheduler(wrq);
return 1;
}
return 0;
@@ -2792,7 +3048,7 @@ smp_notify_inc_runq(ErtsRunQueue *runq)
{
#ifdef ERTS_SMP
if (runq)
- wake_scheduler(runq, 1);
+ wake_scheduler(runq);
#endif
}
@@ -2810,7 +3066,7 @@ erts_sched_notify_check_cpu_bind(void)
for (ix = 0; ix < erts_no_run_queues; ix++) {
ErtsRunQueue *rq = ERTS_RUNQ_IX(ix);
(void) ERTS_RUNQ_FLGS_SET(rq, ERTS_RUNQ_FLG_CHK_CPU_BIND);
- wake_scheduler(rq, 0);
+ wake_scheduler(rq);
}
#else
erts_sched_check_cpu_bind(erts_get_scheduler_data());
@@ -2938,6 +3194,11 @@ check_immigration_need(ErtsRunQueue *c_rq, ErtsMigrationPath *mp, int prio)
if (!f_rq)
return NULL;
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (mp->sched_util)
+ return NULL;
+#endif
+
f_rq_flags = ERTS_RUNQ_FLGS_GET(f_rq);
if (f_rq_flags & ERTS_RUNQ_FLG_PROTECTED)
return NULL;
@@ -3077,7 +3338,7 @@ suspend_run_queue(ErtsRunQueue *rq)
ERTS_SSI_FLG_SUSPENDED);
(void) ERTS_RUNQ_FLGS_SET(rq, ERTS_RUNQ_FLG_SUSPENDED);
- wake_scheduler(rq, 0);
+ wake_scheduler(rq);
}
static void scheduler_ix_resume_wake(Uint ix);
@@ -3169,6 +3430,9 @@ evacuate_run_queue(ErtsRunQueue *rq,
to_rq->misc.start = start;
to_rq->misc.end = end;
+
+ non_empty_runq(to_rq);
+
erts_smp_runq_unlock(to_rq);
smp_notify_inc_runq(to_rq);
erts_smp_runq_lock(to_rq);
@@ -3381,7 +3645,7 @@ try_steal_task(ErtsRunQueue *rq)
Uint32 flags;
/* Protect jobs we steal from getting stolen from us... */
- flags = ERTS_RUNQ_FLGS_SET(rq, ERTS_RUNQ_FLG_PROTECTED);
+ flags = empty_protected_runq(rq);
if (flags & ERTS_RUNQ_FLG_SUSPENDED)
return 0; /* go suspend instead... */
@@ -3460,6 +3724,9 @@ typedef struct {
int full_reds_history_change;
int oowc;
int max_len;
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ int sched_util;
+#endif
} ErtsRunQueueBalance;
static ErtsRunQueueBalance *run_queue_info;
@@ -3623,6 +3890,9 @@ check_balance(ErtsRunQueue *c_rq)
Sint64 scheds_reds, full_scheds_reds;
int forced, active, current_active, oowc, half_full_scheds, full_scheds,
mmax_len, blnc_no_rqs, qix, pix, freds_hist_ix;
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ int sched_util_balancing;
+#endif
if (erts_smp_atomic32_xchg_nob(&balance_info.checking_balance, 1)) {
c_rq->check_balance_reds = INT_MAX;
@@ -3678,6 +3948,10 @@ check_balance(ErtsRunQueue *c_rq)
return;
}
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ sched_util_balancing = 0;
+#endif
+
freds_hist_ix = balance_info.full_reds_history_index;
balance_info.full_reds_history_index++;
if (balance_info.full_reds_history_index >= ERTS_FULL_REDS_HISTORY_SIZE)
@@ -3708,7 +3982,12 @@ check_balance(ErtsRunQueue *c_rq)
run_queue_info[qix].oowc = rq->out_of_work_count;
run_queue_info[qix].max_len = rq->max_len;
rq->check_balance_reds = INT_MAX;
-
+
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (erts_sched_balance_util)
+ run_queue_info[qix].sched_util = erts_get_sched_util(rq, 1, 0);
+#endif
+
erts_smp_runq_unlock(rq);
}
@@ -3778,8 +4057,38 @@ check_balance(ErtsRunQueue *c_rq)
mmax_len = run_queue_info[qix].max_len;
}
- if (!erts_sched_compact_load)
+ if (!erts_sched_compact_load) {
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (erts_sched_balance_util && full_scheds < blnc_no_rqs) {
+ int avg_util = 0;
+
+ for (qix = 0; qix < blnc_no_rqs; qix++)
+ avg_util += run_queue_info[qix].sched_util;
+
+ avg_util /= blnc_no_rqs; /* in ppm */
+
+ sched_util_balancing = 1;
+ /*
+ * In order to avoid renaming a large amount of fields
+ * we write utilization values instead of lenght values
+ * in the 'max_len' and 'migration_limit' fields...
+ */
+ for (qix = 0; qix < blnc_no_rqs; qix++) {
+ run_queue_info[qix].flags = 0; /* Reset for later use... */
+ for (pix = 0; pix < ERTS_NO_PRIO_LEVELS; pix++) {
+ run_queue_info[qix].prio[pix].emigrate_to = -1;
+ run_queue_info[qix].prio[pix].immigrate_from = -1;
+ run_queue_info[qix].prio[pix].avail = 100;
+ run_queue_info[qix].prio[pix].max_len = run_queue_info[qix].sched_util;
+ run_queue_info[qix].prio[pix].migration_limit = avg_util;
+ }
+ }
+ active = blnc_no_rqs;
+ goto setup_migration_paths;
+ }
+#endif
goto all_active;
+ }
if (!forced && half_full_scheds != blnc_no_rqs) {
int min = 1;
@@ -3896,15 +4205,30 @@ check_balance(ErtsRunQueue *c_rq)
}
}
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ setup_migration_paths:
+#endif
+
/* Setup migration paths for all priorities */
for (pix = 0; pix < ERTS_NO_PRIO_LEVELS; pix++) {
int low = 0, high = 0;
for (qix = 0; qix < blnc_no_rqs; qix++) {
int len_diff = run_queue_info[qix].prio[pix].max_len;
len_diff -= run_queue_info[qix].prio[pix].migration_limit;
+
#ifdef DBG_PRINT
if (pix == 2) erts_fprintf(stderr, "%d ", len_diff);
#endif
+
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (sched_util_balancing
+ && -ERTS_SCHED_UTIL_IGNORE_IMBALANCE_DIFF <= len_diff
+ && len_diff <= ERTS_SCHED_UTIL_IGNORE_IMBALANCE_DIFF) {
+ /* ignore minor imbalance */
+ len_diff = 0;
+ }
+#endif
+
run_queue_compare[qix].qix = qix;
run_queue_compare[qix].len = len_diff;
if (len_diff != 0) {
@@ -4031,6 +4355,9 @@ erts_fprintf(stderr, "--------------------------------\n");
Uint32 flags = run_queue_info[qix].flags;
ErtsMigrationPath *mp = &new_mpaths->mpath[qix];
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ mp->sched_util = sched_util_balancing;
+#endif
mp->flags = flags;
mp->misc_evac_runq = NULL;
@@ -4628,6 +4955,11 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online)
set_wakeup_other_data();
#endif
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (erts_sched_balance_util)
+ erts_sched_compact_load = 0;
+#endif
+
ASSERT(no_schedulers_online <= no_schedulers);
ASSERT(no_schedulers_online >= 1);
ASSERT(no_schedulers >= 1);
@@ -4696,6 +5028,11 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online)
rq->ports.info.reds = 0;
rq->ports.start = NULL;
rq->ports.end = NULL;
+
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ init_runq_sched_util(&rq->sched_util, erts_sched_balance_util);
+#endif
+
}
#ifdef ERTS_SMP
@@ -4794,6 +5131,7 @@ erts_init_scheduling(int no_schedulers, int no_schedulers_online)
esdp->reductions = 0;
init_sched_wall_time(&esdp->sched_wall_time);
+
erts_port_task_handle_init(&esdp->nosuspend_port_task_handle);
}
@@ -5761,7 +6099,7 @@ erts_set_schedulers_online(Process *p,
for (ix = no; ix < online; ix++) {
ErtsRunQueue *rq = ERTS_RUNQ_IX(ix);
- wake_scheduler(rq, 0);
+ wake_scheduler(rq);
}
}
}
@@ -5860,7 +6198,7 @@ erts_block_multi_scheduling(Process *p, ErtsProcLocks plocks, int on, int all)
for (ix = 1; ix < online; ix++) {
ErtsRunQueue *rq = ERTS_RUNQ_IX(ix);
- wake_scheduler(rq, 0);
+ wake_scheduler(rq);
}
if (erts_smp_atomic32_read_nob(&schdlr_sspnd.active)
@@ -7265,19 +7603,13 @@ Process *schedule(Process *p, int calls)
#ifdef ERTS_SMP
ErtsMigrationPaths *mps;
ErtsMigrationPath *mp;
-
-#ifdef ERTS_SMP
- {
- ErtsProcList *pnd_xtrs = rq->procs.pending_exiters;
- if (erts_proclist_fetch(&pnd_xtrs, NULL)) {
- rq->procs.pending_exiters = NULL;
- erts_smp_runq_unlock(rq);
- handle_pending_exiters(pnd_xtrs);
- erts_smp_runq_lock(rq);
- }
-
+ ErtsProcList *pnd_xtrs = rq->procs.pending_exiters;
+ if (erts_proclist_fetch(&pnd_xtrs, NULL)) {
+ rq->procs.pending_exiters = NULL;
+ erts_smp_runq_unlock(rq);
+ handle_pending_exiters(pnd_xtrs);
+ erts_smp_runq_lock(rq);
}
-#endif
if (rq->check_balance_reds <= 0)
check_balance(rq);
@@ -7294,7 +7626,7 @@ Process *schedule(Process *p, int calls)
continue_check_activities_to_run:
flags = ERTS_RUNQ_FLGS_GET_NOB(rq);
continue_check_activities_to_run_known_flags:
-
+ ASSERT(flags & ERTS_RUNQ_FLG_NONEMPTY);
if (flags & (ERTS_RUNQ_FLG_CHK_CPU_BIND|ERTS_RUNQ_FLG_SUSPENDED)) {
@@ -7346,20 +7678,16 @@ Process *schedule(Process *p, int calls)
rq->wakeup_other = 0;
rq->wakeup_other_reds = 0;
- empty_runq(rq);
-
flags = ERTS_RUNQ_FLGS_GET_NOB(rq);
- if (flags & ERTS_RUNQ_FLG_SUSPENDED) {
- non_empty_runq(rq);
+ if (flags & ERTS_RUNQ_FLG_SUSPENDED)
goto continue_check_activities_to_run_known_flags;
- }
- else if (!(flags & ERTS_RUNQ_FLG_INACTIVE)) {
- if (try_steal_task(rq)) {
- non_empty_runq(rq);
+ if (flags & ERTS_RUNQ_FLG_INACTIVE)
+ empty_runq(rq);
+ else {
+ if (try_steal_task(rq))
goto continue_check_activities_to_run;
- }
- (void) ERTS_RUNQ_FLGS_UNSET(rq, ERTS_RUNQ_FLG_PROTECTED);
+ empty_runq(rq);
/*
* Check for ERTS_RUNQ_FLG_SUSPENDED has to be done
@@ -7368,10 +7696,10 @@ Process *schedule(Process *p, int calls)
flags = ERTS_RUNQ_FLGS_GET_NOB(rq);
if (flags & ERTS_RUNQ_FLG_SUSPENDED) {
non_empty_runq(rq);
+ flags |= ERTS_RUNQ_FLG_NONEMPTY;
goto continue_check_activities_to_run_known_flags;
}
}
-
#endif
scheduler_wait(&fcalls, esdp, rq);
@@ -8271,25 +8599,22 @@ save_gc_task(Process *c_p, ErtsProcSysTask *st, int prio)
int
erts_set_gc_state(Process *c_p, int enable)
{
- int res;
ErtsProcSysTaskQs *dgc_tsk_qs;
ASSERT(c_p == erts_get_current_process());
ASSERT((ERTS_PSFLG_RUNNING|ERTS_PSFLG_RUNNING_SYS)
& erts_smp_atomic32_read_nob(&c_p->state));
ERTS_SMP_LC_ASSERT(ERTS_PROC_LOCK_MAIN == erts_proc_lc_my_proc_locks(c_p));
- res = !(c_p->flags & F_DISABLE_GC);
-
if (!enable) {
c_p->flags |= F_DISABLE_GC;
- return res;
+ return 0;
}
c_p->flags &= ~F_DISABLE_GC;
dgc_tsk_qs = ERTS_PROC_GET_DELAYED_GC_TASK_QS(c_p);
if (!dgc_tsk_qs)
- return res;
+ return 0;
/* Move delayed gc tasks into sys tasks queues. */
@@ -8387,7 +8712,7 @@ erts_set_gc_state(Process *c_p, int enable)
if (dgc_tsk_qs)
proc_sys_task_queues_free(dgc_tsk_qs);
- return res;
+ return 1;
}
void
@@ -8489,6 +8814,10 @@ erts_schedule_misc_op(void (*func)(void *), void *arg)
rq->misc.start = molp;
rq->misc.end = molp;
+#ifdef ERTS_SMP
+ non_empty_runq(rq);
+#endif
+
erts_smp_runq_unlock(rq);
smp_notify_inc_runq(rq);
@@ -8758,7 +9087,6 @@ erl_create_process(Process* parent, /* Parent of process (default group leader).
p->htop = p->heap;
p->heap_sz = sz;
p->catches = 0;
- p->extra_root = NULL;
p->bin_vheap_sz = p->min_vheap_size;
p->bin_old_vheap_sz = p->min_vheap_size;
@@ -9375,8 +9703,11 @@ save_pending_exiter(Process *p)
erts_proclist_store_last(&rq->procs.pending_exiters, plp);
+ non_empty_runq(rq);
+
erts_smp_runq_unlock(rq);
- wake_scheduler(rq, 1);
+
+ wake_scheduler(rq);
}
#endif
@@ -10222,12 +10553,6 @@ erts_continue_exit_process(Process *p)
if (pbt)
erts_free(ERTS_ALC_T_BPD, (void *) pbt);
- if (p->extra_root != NULL) {
- (p->extra_root->cleanup)(p->extra_root); /* Should deallocate
- whole structure */
- p->extra_root = NULL;
- }
-
delete_process(p);
#ifdef ERTS_SMP
diff --git a/erts/emulator/beam/erl_process.h b/erts/emulator/beam/erl_process.h
index 043621125c..24832d59b5 100644
--- a/erts/emulator/beam/erl_process.h
+++ b/erts/emulator/beam/erl_process.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -70,6 +70,9 @@ typedef struct process Process;
struct ErtsNodesMonitor_;
+#define ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT 0
+#define ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT 0
+
#define ERTS_MAX_NO_OF_SCHEDULERS 1024
#define ERTS_DEFAULT_MAX_PROCESSES (1 << 18)
@@ -98,6 +101,7 @@ struct saved_calls {
extern Export exp_send, exp_receive, exp_timeout;
extern int erts_sched_compact_load;
+extern int erts_sched_balance_util;
extern Uint erts_no_schedulers;
extern Uint erts_no_run_queues;
extern int erts_sched_thread_suggested_stack_size;
@@ -198,6 +202,10 @@ extern int erts_sched_thread_suggested_stack_size;
#define ERTS_RUNQ_FLGS_SET(RQ, FLGS) \
((Uint32) erts_smp_atomic32_read_bor_relb(&(RQ)->flags, \
(erts_aint32_t) (FLGS)))
+#define ERTS_RUNQ_FLGS_BSET(RQ, MSK, FLGS) \
+ ((Uint32) erts_smp_atomic32_read_bset_relb(&(RQ)->flags, \
+ (erts_aint32_t) (MSK), \
+ (erts_aint32_t) (FLGS)))
#define ERTS_RUNQ_FLGS_UNSET(RQ, FLGS) \
((Uint32) erts_smp_atomic32_read_band_relb(&(RQ)->flags, \
(erts_aint32_t) ~(FLGS)))
@@ -316,9 +324,40 @@ typedef struct {
int reds;
} ErtsRunQueueInfo;
+
+#ifdef HAVE_GETHRTIME
+# undef ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT
+# define ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT 1
+#endif
+
#ifdef ERTS_SMP
+#undef ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+#define ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT_OPT
+
+#ifdef ARCH_64
+typedef erts_atomic_t ErtsAtomicSchedTime;
+#elif defined(ARCH_32)
+typedef erts_dw_atomic_t ErtsAtomicSchedTime;
+#else
+# error :-/
+#endif
+
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+typedef struct {
+ ErtsAtomicSchedTime last;
+ struct {
+ Uint64 short_interval;
+ Uint64 long_interval;
+ } worktime;
+ int is_working;
+} ErtsRunQueueSchedUtil;
+#endif
+
typedef struct {
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ int sched_util;
+#endif
Uint32 flags;
ErtsRunQueue *misc_evac_runq;
struct {
@@ -385,6 +424,9 @@ struct ErtsRunQueue_ {
Port *start;
Port *end;
} ports;
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ ErtsRunQueueSchedUtil sched_util;
+#endif
};
#ifdef ERTS_SMP
@@ -414,6 +456,7 @@ do { \
} while (0)
typedef struct {
+ int need; /* "+sbu true" or scheduler_wall_time enabled */
int enabled;
Uint64 start;
struct {
@@ -499,7 +542,6 @@ struct ErtsSchedulerData_ {
Eterm tmp_heap[TMP_HEAP_SIZE];
int num_tmp_heap_used;
Eterm beam_emu_tmp_heap[BEAM_EMU_TMP_HEAP_SIZE];
- Eterm cmp_tmp_heap[CMP_TMP_HEAP_SIZE];
Eterm erl_arith_tmp_heap[ERL_ARITH_TMP_HEAP_SIZE];
#endif
ErtsSchedulerSleepInfo *ssi;
@@ -542,6 +584,12 @@ int erts_smp_lc_runq_is_locked(ErtsRunQueue *);
#ifdef ERTS_INCLUDE_SCHEDULER_INTERNALS
+#ifdef ERTS_SMP
+void erts_empty_runq(ErtsRunQueue *rq);
+void erts_non_empty_runq(ErtsRunQueue *rq);
+#endif
+
+
/*
* Run queue locked during modifications. We use atomic ops since
* other threads peek at values without run queue lock.
@@ -574,6 +622,10 @@ erts_smp_inc_runq_len(ErtsRunQueue *rq, ErtsRunQueueInfo *rqi, int prio)
erts_smp_atomic32_set_relb(&rqi->len, len);
+#ifdef ERTS_SMP
+ if (rq->len == 0)
+ erts_non_empty_runq(rq);
+#endif
rq->len++;
if (rq->max_len < rq->len)
rq->max_len = len;
@@ -711,13 +763,6 @@ struct ErtsPendingSuspend_ {
#endif
-typedef struct ErlExtraRootSet_ ErlExtraRootSet;
-struct ErlExtraRootSet_ {
- Eterm *objv;
- Uint sz;
- void (*cleanup)(ErlExtraRootSet *);
-};
-
/* Defines to ease the change of memory architecture */
# define HEAP_START(p) (p)->heap
# define HEAP_TOP(p) (p)->htop
@@ -811,8 +856,6 @@ struct process {
ErlMessageQueue msg; /* Message queue */
- ErlExtraRootSet *extra_root; /* Used by trapping BIF's */
-
union {
ErtsBifTimer *bif_timers; /* Bif timers aiming at this process */
void *terminate;
@@ -1695,6 +1738,13 @@ erts_proc_set_error_handler(Process *p, ErtsProcLocks plocks, Eterm handler)
extern erts_atomic_t erts_migration_paths;
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+int erts_get_sched_util(ErtsRunQueue *rq,
+ int initially_locked,
+ int short_interval);
+#endif
+
+
ERTS_GLB_INLINE ErtsMigrationPaths *erts_get_migration_paths_managed(void);
ERTS_GLB_INLINE ErtsMigrationPaths *erts_get_migration_paths(void);
ERTS_GLB_INLINE ErtsRunQueue *erts_check_emigration_need(ErtsRunQueue *c_rq,
@@ -1746,22 +1796,36 @@ erts_check_emigration_need(ErtsRunQueue *c_rq, int prio)
return mp->prio[prio].runq;
}
-
- if (prio == ERTS_PORT_PRIO_LEVEL)
- len = RUNQ_READ_LEN(&c_rq->ports.info.len);
+#if ERTS_HAVE_SCHED_UTIL_BALANCING_SUPPORT
+ if (mp->sched_util) {
+ ErtsRunQueue *rq = mp->prio[prio].runq;
+ /* No migration if other is non-empty */
+ if (!(ERTS_RUNQ_FLGS_GET(rq) & ERTS_RUNQ_FLG_NONEMPTY)
+ && erts_get_sched_util(rq, 0, 1) < mp->prio[prio].limit.other
+ && erts_get_sched_util(c_rq, 0, 1) > mp->prio[prio].limit.this) {
+ return rq;
+ }
+ }
else
- len = RUNQ_READ_LEN(&c_rq->procs.prio_info[prio].len);
-
- if (len > mp->prio[prio].limit.this) {
- ErtsRunQueue *n_rq = mp->prio[prio].runq;
- if (n_rq) {
- if (prio == ERTS_PORT_PRIO_LEVEL)
- len = RUNQ_READ_LEN(&n_rq->ports.info.len);
- else
- len = RUNQ_READ_LEN(&n_rq->procs.prio_info[prio].len);
-
- if (len < mp->prio[prio].limit.other)
- return n_rq;
+#endif
+ {
+
+ if (prio == ERTS_PORT_PRIO_LEVEL)
+ len = RUNQ_READ_LEN(&c_rq->ports.info.len);
+ else
+ len = RUNQ_READ_LEN(&c_rq->procs.prio_info[prio].len);
+
+ if (len > mp->prio[prio].limit.this) {
+ ErtsRunQueue *n_rq = mp->prio[prio].runq;
+ if (n_rq) {
+ if (prio == ERTS_PORT_PRIO_LEVEL)
+ len = RUNQ_READ_LEN(&n_rq->ports.info.len);
+ else
+ len = RUNQ_READ_LEN(&n_rq->procs.prio_info[prio].len);
+
+ if (len < mp->prio[prio].limit.other)
+ return n_rq;
+ }
}
}
}
diff --git a/erts/emulator/beam/erl_term.h b/erts/emulator/beam/erl_term.h
index 953edf79ea..50d3e63c58 100644
--- a/erts/emulator/beam/erl_term.h
+++ b/erts/emulator/beam/erl_term.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2000-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2000-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -1126,6 +1126,7 @@ extern unsigned tag_val_def(Wterm);
#define make_tuple_rel make_boxed_rel
#define make_external_rel make_boxed_rel
#define make_internal_ref_rel make_boxed_rel
+#define make_big_rel make_boxed_rel
#define binary_val_rel(RTERM, BASE) binary_val(rterm2wterm(RTERM, BASE))
#define list_val_rel(RTERM, BASE) list_val(rterm2wterm(RTERM, BASE))
diff --git a/erts/emulator/beam/erl_unicode.c b/erts/emulator/beam/erl_unicode.c
index 7e3c6681d9..3a968594f3 100644
--- a/erts/emulator/beam/erl_unicode.c
+++ b/erts/emulator/beam/erl_unicode.c
@@ -1990,12 +1990,14 @@ char *erts_convert_filename_to_native(Eterm name, char *statbuf, size_t statbuf_
{
int encoding = erts_get_native_filename_encoding();
return erts_convert_filename_to_encoding(name, statbuf, statbuf_size, alloc_type,
- allow_empty, allow_atom, encoding, used);
+ allow_empty, allow_atom, encoding,
+ used, 0);
}
char *erts_convert_filename_to_encoding(Eterm name, char *statbuf, size_t statbuf_size,
ErtsAlcType_t alloc_type, int allow_empty,
- int allow_atom, int encoding, Sint *used)
+ int allow_atom, int encoding, Sint *used,
+ Uint extra)
{
char* name_buf = NULL;
@@ -2008,13 +2010,14 @@ char *erts_convert_filename_to_encoding(Eterm name, char *statbuf, size_t statbu
}
if (encoding == ERL_FILENAME_WIN_WCHAR) {
need += 2;
+ extra *= 2;
} else {
++need;
}
if (used)
*used = (Sint) need;
- if (need > statbuf_size) {
- name_buf = (char *) erts_alloc(alloc_type, need);
+ if (need+extra > statbuf_size) {
+ name_buf = (char *) erts_alloc(alloc_type, need+extra);
} else {
name_buf = statbuf;
}
@@ -2035,8 +2038,8 @@ char *erts_convert_filename_to_encoding(Eterm name, char *statbuf, size_t statbu
/*Add 0 termination only*/
if (used)
*used = (Sint) size+1;
- if (size+1 > statbuf_size) {
- name_buf = (char *) erts_alloc(alloc_type, size+1);
+ if (size+1+extra > statbuf_size) {
+ name_buf = (char *) erts_alloc(alloc_type, size+1+extra);
} else {
name_buf = statbuf;
}
@@ -2045,7 +2048,7 @@ char *erts_convert_filename_to_encoding(Eterm name, char *statbuf, size_t statbu
} else {
name_buf = erts_convert_filename_to_wchar(bytes, size,
statbuf, statbuf_size,
- alloc_type, used, 0);
+ alloc_type, used, extra);
}
erts_free_aligned_binary_bytes(temp_alloc);
} else {
diff --git a/erts/emulator/beam/erl_vm.h b/erts/emulator/beam/erl_vm.h
index 337422eead..b7de8208ad 100644
--- a/erts/emulator/beam/erl_vm.h
+++ b/erts/emulator/beam/erl_vm.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -46,7 +46,6 @@
heap data on the C stack or if we use the buffers in the scheduler data. */
#define TMP_HEAP_SIZE 128 /* Number of Eterm in the schedulers
small heap for transient heap data */
-#define CMP_TMP_HEAP_SIZE 32 /* cmp wants its own tmp-heap... */
#define ERL_ARITH_TMP_HEAP_SIZE 4 /* as does erl_arith... */
#define BEAM_EMU_TMP_HEAP_SIZE 2 /* and beam_emu... */
diff --git a/erts/emulator/beam/erl_zlib.c b/erts/emulator/beam/erl_zlib.c
index 47fd92988e..8e33144f96 100644
--- a/erts/emulator/beam/erl_zlib.c
+++ b/erts/emulator/beam/erl_zlib.c
@@ -87,6 +87,46 @@ int ZEXPORT erl_zlib_deflate_finish(z_stream *streamp)
return deflateEnd(streamp);
}
+int ZEXPORT erl_zlib_inflate_start(z_stream *streamp, const Bytef* source,
+ uLong sourceLen)
+{
+ streamp->next_in = (Bytef*)source;
+ streamp->avail_in = (uInt)sourceLen;
+ streamp->total_out = streamp->avail_out = 0;
+ streamp->next_out = NULL;
+ erl_zlib_alloc_init(streamp);
+ return inflateInit(streamp);
+}
+/*
+ * Inflate a chunk, The destination length is the limit.
+ * Returns Z_OK if more to process, Z_STREAM_END if we are done.
+ */
+int ZEXPORT erl_zlib_inflate_chunk(z_stream *streamp, Bytef* dest, uLongf* destLen)
+{
+ int err;
+ uLongf last_tot = streamp->total_out;
+
+ streamp->next_out = dest;
+ streamp->avail_out = (uInt)*destLen;
+
+ if ((uLong)streamp->avail_out != *destLen) return Z_BUF_ERROR;
+
+ err = inflate(streamp, Z_NO_FLUSH);
+ ASSERT(err != Z_STREAM_ERROR);
+ *destLen = streamp->total_out - last_tot;
+ return err;
+}
+
+/*
+ * When we are done, free up the inflate structure
+ * Retyurns Z_OK or Error
+ */
+int ZEXPORT erl_zlib_inflate_finish(z_stream *streamp)
+{
+ return inflateEnd(streamp);
+}
+
+
int ZEXPORT erl_zlib_compress2 (Bytef* dest, uLongf* destLen,
const Bytef* source, uLong sourceLen,
int level)
diff --git a/erts/emulator/beam/erl_zlib.h b/erts/emulator/beam/erl_zlib.h
index 5ac849d21c..160166c66b 100644
--- a/erts/emulator/beam/erl_zlib.h
+++ b/erts/emulator/beam/erl_zlib.h
@@ -39,6 +39,12 @@ int ZEXPORT erl_zlib_deflate_start(z_stream *streamp, const Bytef* source,
int ZEXPORT erl_zlib_deflate_chunk(z_stream *streamp, Bytef* dest, uLongf* destLen);
int ZEXPORT erl_zlib_deflate_finish(z_stream *streamp);
+int ZEXPORT erl_zlib_inflate_start(z_stream *streamp, const Bytef* source,
+ uLong sourceLen);
+int ZEXPORT erl_zlib_inflate_chunk(z_stream *streamp, Bytef* dest, uLongf* destLen);
+int ZEXPORT erl_zlib_inflate_finish(z_stream *streamp);
+
+
/* Use instead of compress
*/
#define erl_zlib_compress(dest,destLen,source,sourceLen) \
diff --git a/erts/emulator/beam/external.c b/erts/emulator/beam/external.c
index 22b0a02937..5e7a5cab6e 100644
--- a/erts/emulator/beam/external.c
+++ b/erts/emulator/beam/external.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -61,6 +61,9 @@
*/
# define ERTS_DEBUG_USE_DIST_SEP
# endif
+# define IF_DEBUG(X) X
+#else
+# define IF_DEBUG(X)
#endif
/* Does Sint fit in Sint32?
@@ -84,29 +87,40 @@
static Export term_to_binary_trap_export;
static byte* enc_term(ErtsAtomCacheMap *, Eterm, byte*, Uint32, struct erl_off_heap_header** off_heap);
-static int enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
+struct TTBEncodeContext_;
+static int enc_term_int(struct TTBEncodeContext_*,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
struct erl_off_heap_header** off_heap, Sint *reds, byte **res);
static Uint is_external_string(Eterm obj, int* p_is_string);
static byte* enc_atom(ErtsAtomCacheMap *, Eterm, byte*, Uint32);
static byte* enc_pid(ErtsAtomCacheMap *, Eterm, byte*, Uint32);
-static byte* dec_term(ErtsDistExternal *, Eterm**, byte*, ErlOffHeap*, Eterm*);
+struct B2TContext_t;
+static byte* dec_term(ErtsDistExternal *, Eterm**, byte*, ErlOffHeap*, Eterm*, struct B2TContext_t*);
static byte* dec_atom(ErtsDistExternal *, byte*, Eterm*);
static byte* dec_pid(ErtsDistExternal *, Eterm**, byte*, ErlOffHeap*, Eterm*);
-static Sint decoded_size(byte *ep, byte* endp, int internal_tags);
+static Sint decoded_size(byte *ep, byte* endp, int internal_tags, struct B2TContext_t*);
static BIF_RETTYPE term_to_binary_trap_1(BIF_ALIST_1);
static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint flags,
Binary *context_b);
static Uint encode_size_struct2(ErtsAtomCacheMap *, Eterm, unsigned);
-static int encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj,
+struct TTBSizeContext_;
+static int encode_size_struct_int(struct TTBSizeContext_*, ErtsAtomCacheMap *acmp, Eterm obj,
unsigned dflags, Sint *reds, Uint *res);
+static Export binary_to_term_trap_export;
+static BIF_RETTYPE binary_to_term_trap_1(BIF_ALIST_1);
+static Eterm binary_to_term_int(Process* p, Uint32 flags, Eterm bin, Binary* context_b);
+
void erts_init_external(void) {
#if 1 /* In R16 */
erts_init_trap_export(&term_to_binary_trap_export,
am_erlang, am_term_to_binary_trap, 1,
&term_to_binary_trap_1);
+
+ erts_init_trap_export(&binary_to_term_trap_export,
+ am_erlang, am_binary_to_term_trap, 1,
+ &binary_to_term_trap_1);
#else
sys_memset((void *) &term_to_binary_trap_export, 0, sizeof(Export));
term_to_binary_trap_export.address = &term_to_binary_trap_export.code[3];
@@ -877,7 +891,7 @@ erts_decode_dist_ext_size(ErtsDistExternal *edep)
goto fail;
ep = edep->extp+1;
}
- res = decoded_size(ep, edep->ext_endp, 0);
+ res = decoded_size(ep, edep->ext_endp, 0, NULL);
if (res >= 0)
return res;
fail:
@@ -889,12 +903,12 @@ Sint erts_decode_ext_size(byte *ext, Uint size)
{
if (size == 0 || *ext != VERSION_MAGIC)
return -1;
- return decoded_size(ext+1, ext+size, 0);
+ return decoded_size(ext+1, ext+size, 0, NULL);
}
Sint erts_decode_ext_size_ets(byte *ext, Uint size)
{
- Sint sz = decoded_size(ext, ext+size, 1);
+ Sint sz = decoded_size(ext, ext+size, 1, NULL);
ASSERT(sz >= 0);
return sz;
}
@@ -927,7 +941,7 @@ erts_decode_dist_ext(Eterm** hpp,
goto error;
ep++;
}
- ep = dec_term(edep, hpp, ep, off_heap, &obj);
+ ep = dec_term(edep, hpp, ep, off_heap, &obj, NULL);
if (!ep)
goto error;
@@ -948,7 +962,7 @@ Eterm erts_decode_ext(Eterm **hpp, ErlOffHeap *off_heap, byte **ext)
byte *ep = *ext;
if (*ep++ != VERSION_MAGIC)
return THE_NON_VALUE;
- ep = dec_term(NULL, hpp, ep, off_heap, &obj);
+ ep = dec_term(NULL, hpp, ep, off_heap, &obj, NULL);
if (!ep) {
#ifdef DEBUG
bin_write(ERTS_PRINT_STDERR,NULL,*ext,500);
@@ -962,7 +976,7 @@ Eterm erts_decode_ext(Eterm **hpp, ErlOffHeap *off_heap, byte **ext)
Eterm erts_decode_ext_ets(Eterm **hpp, ErlOffHeap *off_heap, byte *ext)
{
Eterm obj;
- ext = dec_term(NULL, hpp, ext, off_heap, &obj);
+ ext = dec_term(NULL, hpp, ext, off_heap, &obj, NULL);
ASSERT(ext);
return obj;
}
@@ -1043,9 +1057,14 @@ static BIF_RETTYPE term_to_binary_trap_1(BIF_ALIST_1)
Binary *bin = ((ProcBin *) binary_val(bt))->val;
Eterm res = erts_term_to_binary_int(BIF_P, Term, 0, 0,bin);
if (is_tuple(res)) {
+ ASSERT(BIF_P->flags & F_DISABLE_GC);
BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
} else {
- BIF_RET(res);
+ if (erts_set_gc_state(BIF_P, 1)
+ || MSO(BIF_P).overhead > BIN_VHEAP_SZ(BIF_P))
+ ERTS_BIF_YIELD_RETURN(BIF_P, res);
+ else
+ BIF_RET(res);
}
}
@@ -1053,8 +1072,10 @@ BIF_RETTYPE term_to_binary_1(BIF_ALIST_1)
{
Eterm res = erts_term_to_binary_int(BIF_P, BIF_ARG_1, 0, TERM_TO_BINARY_DFLAGS, NULL);
if (is_tuple(res)) {
+ erts_set_gc_state(BIF_P, 0);
BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
} else {
+ ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
}
}
@@ -1067,7 +1088,6 @@ BIF_RETTYPE term_to_binary_2(BIF_ALIST_2)
int level = 0;
Uint flags = TERM_TO_BINARY_DFLAGS;
Eterm res;
- Binary *bin = NULL;
while (is_list(Flags)) {
Eterm arg = CAR(list_val(Flags));
@@ -1104,14 +1124,74 @@ BIF_RETTYPE term_to_binary_2(BIF_ALIST_2)
goto error;
}
- res = erts_term_to_binary_int(p, Term, level, flags, bin);
+ res = erts_term_to_binary_int(p, Term, level, flags, NULL);
if (is_tuple(res)) {
+ erts_set_gc_state(p, 0);
BIF_TRAP1(&term_to_binary_trap_export,BIF_P,res);
} else {
+ ASSERT(!(BIF_P->flags & F_DISABLE_GC));
BIF_RET(res);
}
}
+
+enum B2TState { /* order is somewhat significant */
+ B2TPrepare,
+ B2TUncompressChunk,
+ B2TSizeInit,
+ B2TSize,
+ B2TDecodeInit,
+ B2TDecode,
+ B2TDecodeList,
+ B2TDecodeTuple,
+ B2TDecodeString,
+ B2TDecodeBinary,
+
+ B2TDone,
+ B2TDecodeFail,
+ B2TBadArg
+};
+
+typedef struct {
+ int heap_size;
+ int terms;
+ byte* ep;
+ int atom_extra_skip;
+} B2TSizeContext;
+
+typedef struct {
+ byte* ep;
+ Eterm res;
+ Eterm* next;
+ Eterm* hp_start;
+ Eterm* hp;
+ Eterm* hp_end;
+ int remaining_n;
+ char* remaining_bytes;
+} B2TDecodeContext;
+
+typedef struct {
+ z_stream stream;
+ byte* dbytes;
+ Uint dleft;
+} B2TUncompressContext;
+
+typedef struct B2TContext_t {
+ Sint heap_size;
+ byte* aligned_alloc;
+ ErtsBinary2TermState b2ts;
+ Uint32 flags;
+ SWord reds;
+ Eterm trap_bin;
+ enum B2TState state;
+ union {
+ B2TSizeContext sc;
+ B2TDecodeContext dc;
+ B2TUncompressContext uc;
+ } u;
+} B2TContext;
+
+
static uLongf binary2term_uncomp_size(byte* data, Sint size)
{
z_stream stream;
@@ -1141,48 +1221,62 @@ static uLongf binary2term_uncomp_size(byte* data, Sint size)
return err == Z_STREAM_END ? uncomp_size : 0;
}
-static ERTS_INLINE Sint
-binary2term_prepare(ErtsBinary2TermState *state, byte *data, Sint data_size)
+static ERTS_INLINE int
+binary2term_prepare(ErtsBinary2TermState *state, byte *data, Sint data_size,
+ B2TContext* ctx)
{
- Sint res;
byte *bytes = data;
Sint size = data_size;
state->exttmp = 0;
if (size < 1 || *bytes != VERSION_MAGIC) {
- error:
- if (state->exttmp)
- erts_free(ERTS_ALC_T_TMP, state->extp);
- state->extp = NULL;
- state->exttmp = 0;
return -1;
}
bytes++;
size--;
if (size < 5 || *bytes != COMPRESSED) {
state->extp = bytes;
+ if (ctx)
+ ctx->state = B2TSizeInit;
}
else {
uLongf dest_len = (Uint32) get_int32(bytes+1);
bytes += 5;
size -= 5;
if (dest_len > 32*1024*1024
- || (state->extp = erts_alloc_fnf(ERTS_ALC_T_TMP, dest_len)) == NULL) {
+ || (state->extp = erts_alloc_fnf(ERTS_ALC_T_EXT_TERM_DATA, dest_len)) == NULL) {
+ /*
+ * Try avoid out-of-memory crash due to corrupted 'dest_len'
+ * by checking the actual length of the uncompressed data.
+ * The only way to do that is to uncompress it. Sad but true.
+ */
if (dest_len != binary2term_uncomp_size(bytes, size)) {
- goto error;
+ return -1;
}
- state->extp = erts_alloc(ERTS_ALC_T_TMP, dest_len);
+ state->extp = erts_alloc(ERTS_ALC_T_EXT_TERM_DATA, dest_len);
+ ctx->reds -= dest_len;
}
state->exttmp = 1;
- if (erl_zlib_uncompress(state->extp, &dest_len, bytes, size) != Z_OK)
- goto error;
+ if (ctx) {
+ if (erl_zlib_inflate_start(&ctx->u.uc.stream, bytes, size) != Z_OK)
+ return -1;
+
+ ctx->u.uc.dbytes = state->extp;
+ ctx->u.uc.dleft = dest_len;
+ ctx->state = B2TUncompressChunk;
+ }
+ else {
+ uLongf dlen = dest_len;
+ if (erl_zlib_uncompress(state->extp, &dlen, bytes, size) != Z_OK
+ || dlen != dest_len) {
+ return -1;
+ }
+ }
size = (Sint) dest_len;
}
- res = decoded_size(state->extp, state->extp + size, 0);
- if (res < 0)
- goto error;
- return res;
+ state->extsize = size;
+ return 0;
}
static ERTS_INLINE void
@@ -1190,7 +1284,7 @@ binary2term_abort(ErtsBinary2TermState *state)
{
if (state->exttmp) {
state->exttmp = 0;
- erts_free(ERTS_ALC_T_TMP, state->extp);
+ erts_free(ERTS_ALC_T_EXT_TERM_DATA, state->extp);
}
}
@@ -1198,11 +1292,11 @@ static ERTS_INLINE Eterm
binary2term_create(ErtsDistExternal *edep, ErtsBinary2TermState *state, Eterm **hpp, ErlOffHeap *ohp)
{
Eterm res;
- if (!dec_term(edep, hpp, state->extp, ohp, &res))
+ if (!dec_term(edep, hpp, state->extp, ohp, &res, NULL))
res = THE_NON_VALUE;
if (state->exttmp) {
state->exttmp = 0;
- erts_free(ERTS_ALC_T_TMP, state->extp);
+ erts_free(ERTS_ALC_T_EXT_TERM_DATA, state->extp);
}
return res;
}
@@ -1210,7 +1304,18 @@ binary2term_create(ErtsDistExternal *edep, ErtsBinary2TermState *state, Eterm **
Sint
erts_binary2term_prepare(ErtsBinary2TermState *state, byte *data, Sint data_size)
{
- return binary2term_prepare(state, data, data_size);
+ Sint res;
+
+ if (binary2term_prepare(state, data, data_size, NULL) < 0 ||
+ (res=decoded_size(state->extp, state->extp + state->extsize, 0, NULL)) < 0) {
+
+ if (state->exttmp)
+ erts_free(ERTS_ALC_T_EXT_TERM_DATA, state->extp);
+ state->extp = NULL;
+ state->exttmp = 0;
+ return -1;
+ }
+ return res;
}
void
@@ -1225,68 +1330,233 @@ erts_binary2term_create(ErtsBinary2TermState *state, Eterm **hpp, ErlOffHeap *oh
return binary2term_create(NULL,state, hpp, ohp);
}
-BIF_RETTYPE binary_to_term_1(BIF_ALIST_1)
+static void b2t_destroy_context(B2TContext* context)
{
- Sint heap_size;
- Eterm res;
+ erts_free_aligned_binary_bytes_extra(context->aligned_alloc,
+ ERTS_ALC_T_EXT_TERM_DATA);
+ context->aligned_alloc = NULL;
+ binary2term_abort(&context->b2ts);
+ if (context->state == B2TUncompressChunk) {
+ erl_zlib_inflate_finish(&context->u.uc.stream);
+ }
+}
+
+static void b2t_context_destructor(Binary *context_bin)
+{
+ B2TContext* ctx = (B2TContext*) ERTS_MAGIC_BIN_DATA(context_bin);
+ ASSERT(ERTS_MAGIC_BIN_DESTRUCTOR(context_bin) == b2t_context_destructor);
+
+ b2t_destroy_context(ctx);
+}
+
+static BIF_RETTYPE binary_to_term_trap_1(BIF_ALIST_1)
+{
+ Binary *context_bin = ((ProcBin *) binary_val(BIF_ARG_1))->val;
+ ASSERT(ERTS_MAGIC_BIN_DESTRUCTOR(context_bin) == b2t_context_destructor);
+
+ return binary_to_term_int(BIF_P, 0, THE_NON_VALUE, context_bin);
+}
+
+
+#define B2T_BYTES_PER_REDUCTION 128
+#define B2T_MEMCPY_FACTOR 8
+
+/* Define for testing */
+/*#define EXTREME_B2T_TRAPPING 1*/
+
+#ifdef EXTREME_B2T_TRAPPING
+static unsigned b2t_rand(void)
+{
+ static unsigned prev = 17;
+ prev = (prev * 214013 + 2531011);
+ return prev;
+}
+#endif
+
+
+static B2TContext* b2t_export_context(Process* p, B2TContext* src)
+{
+ Binary* context_b = erts_create_magic_binary(sizeof(B2TContext),
+ b2t_context_destructor);
+ B2TContext* ctx = ERTS_MAGIC_BIN_DATA(context_b);
Eterm* hp;
- Eterm* endp;
- Sint size;
- byte* bytes;
- byte* temp_alloc = NULL;
- ErtsBinary2TermState b2ts;
+ sys_memcpy(ctx, src, sizeof(B2TContext));
+ if (ctx->state >= B2TDecode && ctx->u.dc.next == &src->u.dc.res) {
+ ctx->u.dc.next = &ctx->u.dc.res;
+ }
+ hp = HAlloc(p, PROC_BIN_SIZE);
+ ctx->trap_bin = erts_mk_magic_binary_term(&hp, &MSO(p), context_b);
+ return ctx;
+}
- if ((bytes = erts_get_aligned_binary_bytes(BIF_ARG_1, &temp_alloc)) == NULL) {
- error:
- erts_free_aligned_binary_bytes(temp_alloc);
- BIF_ERROR(BIF_P, BADARG);
+static Eterm binary_to_term_int(Process* p, Uint32 flags, Eterm bin, Binary* context_b)
+{
+#ifdef EXTREME_B2T_TRAPPING
+ SWord initial_reds = 1 + b2t_rand() % 4;
+#else
+ SWord initial_reds = (Uint)(ERTS_BIF_REDS_LEFT(p) * B2T_BYTES_PER_REDUCTION);
+#endif
+ B2TContext c_buff;
+ B2TContext *ctx;
+ int is_first_call;
+
+ if (context_b == NULL) {
+ /* Setup enough to get started */
+ is_first_call = 1;
+ ctx = &c_buff;
+ ctx->state = B2TPrepare;
+ ctx->aligned_alloc = NULL;
+ ctx->flags = flags;
+ IF_DEBUG(ctx->trap_bin = THE_NON_VALUE;)
+ } else {
+ is_first_call = 0;
+ ctx = ERTS_MAGIC_BIN_DATA(context_b);
+ ASSERT(ctx->state != B2TPrepare);
}
- size = binary_size(BIF_ARG_1);
+ ctx->reds = initial_reds;
+
+ do {
+ switch (ctx->state) {
+ case B2TPrepare: {
+ byte* bytes;
+ Uint bin_size;
+ bytes = erts_get_aligned_binary_bytes_extra(bin,
+ &ctx->aligned_alloc,
+ ERTS_ALC_T_EXT_TERM_DATA,
+ 0);
+ if (bytes == NULL) {
+ ctx->b2ts.exttmp = 0;
+ ctx->state = B2TBadArg;
+ break;
+ }
+ bin_size = binary_size(bin);
+ if (ctx->aligned_alloc) {
+ ctx->reds -= bin_size / 8;
+ }
+ if (binary2term_prepare(&ctx->b2ts, bytes, bin_size, ctx) < 0) {
+ ctx->state = B2TBadArg;
+ }
+ break;
+ }
+ case B2TUncompressChunk: {
+ uLongf chunk = ctx->reds;
+ int zret;
+
+ if (chunk > ctx->u.uc.dleft)
+ chunk = ctx->u.uc.dleft;
+ zret = erl_zlib_inflate_chunk(&ctx->u.uc.stream,
+ ctx->u.uc.dbytes, &chunk);
+ ctx->u.uc.dbytes += chunk;
+ ctx->u.uc.dleft -= chunk;
+ if (zret == Z_OK && ctx->u.uc.dleft > 0) {
+ ctx->reds = 0;
+ }
+ else if (erl_zlib_inflate_finish(&ctx->u.uc.stream) == Z_OK
+ && zret == Z_STREAM_END
+ && ctx->u.uc.dleft == 0) {
+ ctx->reds -= chunk;
+ ctx->state = B2TSizeInit;
+ }
+ else {
+ ctx->state = B2TBadArg;
+ }
+ break;
+ }
+ case B2TSizeInit:
+ ctx->u.sc.ep = NULL;
+ ctx->state = B2TSize;
+ /*fall through*/
+ case B2TSize:
+ ctx->heap_size = decoded_size(ctx->b2ts.extp,
+ ctx->b2ts.extp + ctx->b2ts.extsize,
+ 0, ctx);
+ break;
+
+ case B2TDecodeInit:
+ if (ctx == &c_buff && ctx->b2ts.extsize > ctx->reds) {
+ /* dec_term will maybe trap, allocate space for magic bin
+ before result term to make it easy to trim with HRelease.
+ */
+ ctx = b2t_export_context(p, &c_buff);
+ }
+ ctx->u.dc.ep = ctx->b2ts.extp;
+ ctx->u.dc.res = (Eterm) (UWord) NULL;
+ ctx->u.dc.next = &ctx->u.dc.res;
+ ctx->u.dc.hp_start = HAlloc(p, ctx->heap_size);
+ ctx->u.dc.hp = ctx->u.dc.hp_start;
+ ctx->u.dc.hp_end = ctx->u.dc.hp_start + ctx->heap_size;
+ ctx->state = B2TDecode;
+ /*fall through*/
+ case B2TDecode:
+ case B2TDecodeList:
+ case B2TDecodeTuple:
+ case B2TDecodeString:
+ case B2TDecodeBinary: {
+ ErtsDistExternal fakedep;
+ fakedep.flags = ctx->flags;
+ dec_term(&fakedep, NULL, NULL, &MSO(p), NULL, ctx);
+ break;
+ }
+ case B2TDecodeFail:
+ HRelease(p, ctx->u.dc.hp_end, ctx->u.dc.hp_start);
+ /*fall through*/
+ case B2TBadArg:
+ b2t_destroy_context(ctx);
+ if (!is_first_call) {
+ erts_set_gc_state(p, 1);
+ }
+ BUMP_REDS(p, (initial_reds - ctx->reds) / B2T_BYTES_PER_REDUCTION);
+ BIF_ERROR(p, BADARG & ~EXF_SAVETRACE);
- heap_size = binary2term_prepare(&b2ts, bytes, size);
- if (heap_size < 0)
- goto error;
+ case B2TDone:
+ b2t_destroy_context(ctx);
- hp = HAlloc(BIF_P, heap_size);
- endp = hp + heap_size;
+ if (ctx->u.dc.hp > ctx->u.dc.hp_end) {
+ erl_exit(1, ":%s, line %d: heap overrun by %d words(s)\n",
+ __FILE__, __LINE__, ctx->u.dc.hp - ctx->u.dc.hp_end);
+ }
+ HRelease(p, ctx->u.dc.hp_end, ctx->u.dc.hp);
- res = binary2term_create(NULL, &b2ts, &hp, &MSO(BIF_P));
+ if (!is_first_call) {
+ erts_set_gc_state(p, 1);
+ }
+ BUMP_REDS(p, (initial_reds - ctx->reds) / B2T_BYTES_PER_REDUCTION);
+ return ctx->u.dc.res;
- erts_free_aligned_binary_bytes(temp_alloc);
+ default:
+ ASSERT(!"Unknown state in binary_to_term");
+ }
+ }while (ctx->reds > 0 || ctx->state >= B2TDone);
- if (hp > endp) {
- erl_exit(1, ":%s, line %d: heap overrun by %d words(s)\n",
- __FILE__, __LINE__, hp-endp);
+ if (ctx == &c_buff) {
+ ASSERT(ctx->trap_bin == THE_NON_VALUE);
+ ctx = b2t_export_context(p, &c_buff);
}
+ ASSERT(ctx->trap_bin != THE_NON_VALUE);
- HRelease(BIF_P, endp, hp);
-
- if (res == THE_NON_VALUE)
- goto error;
+ if (is_first_call) {
+ erts_set_gc_state(p, 0);
+ }
+ BUMP_ALL_REDS(p);
+ BIF_TRAP1(&binary_to_term_trap_export, p, ctx->trap_bin);
+}
- return res;
+BIF_RETTYPE erts_internal_binary_to_term_1(BIF_ALIST_1)
+{
+ return binary_to_term_int(BIF_P, 0, BIF_ARG_1, NULL);
}
-BIF_RETTYPE binary_to_term_2(BIF_ALIST_2)
+BIF_RETTYPE erts_internal_binary_to_term_2(BIF_ALIST_2)
{
- Sint heap_size;
- Eterm res;
Eterm opts;
Eterm opt;
- Eterm* hp;
- Eterm* endp;
- Sint size;
- byte* bytes;
- byte* temp_alloc = NULL;
- ErtsBinary2TermState b2ts;
- ErtsDistExternal fakedep;
+ Uint32 flags = 0;
- fakedep.flags = 0;
opts = BIF_ARG_2;
while (is_list(opts)) {
opt = CAR(list_val(opts));
if (opt == am_safe) {
- fakedep.flags |= ERTS_DIST_EXT_BTT_SAFE;
+ flags |= ERTS_DIST_EXT_BTT_SAFE;
}
else {
goto error;
@@ -1297,35 +1567,10 @@ BIF_RETTYPE binary_to_term_2(BIF_ALIST_2)
if (is_not_nil(opts))
goto error;
- if ((bytes = erts_get_aligned_binary_bytes(BIF_ARG_1, &temp_alloc)) == NULL) {
- error:
- erts_free_aligned_binary_bytes(temp_alloc);
- BIF_ERROR(BIF_P, BADARG);
- }
- size = binary_size(BIF_ARG_1);
-
- heap_size = binary2term_prepare(&b2ts, bytes, size);
- if (heap_size < 0)
- goto error;
-
- hp = HAlloc(BIF_P, heap_size);
- endp = hp + heap_size;
-
- res = binary2term_create(&fakedep, &b2ts, &hp, &MSO(BIF_P));
-
- erts_free_aligned_binary_bytes(temp_alloc);
-
- if (hp > endp) {
- erl_exit(1, ":%s, line %d: heap overrun by %d words(s)\n",
- __FILE__, __LINE__, hp-endp);
- }
-
- HRelease(BIF_P, endp, hp);
-
- if (res == THE_NON_VALUE)
- goto error;
+ return binary_to_term_int(BIF_P, flags, BIF_ARG_1, NULL);
- return res;
+error:
+ BIF_ERROR(BIF_P, BADARG);
}
Eterm
@@ -1473,25 +1718,29 @@ erts_term_to_binary(Process* p, Eterm Term, int level, Uint flags) {
/* #define EXTREME_TTB_TRAPPING 1 */
#ifndef EXTREME_TTB_TRAPPING
-#define TERM_TO_BINARY_LOOP_FACTOR 500
-#define TERM_TO_BINARY_SIZE_FACTOR 500000
-#define TERM_TO_BINARY_COMPRESS_CHUNK 500000
+#define TERM_TO_BINARY_LOOP_FACTOR 32
+#define TERM_TO_BINARY_COMPRESS_CHUNK (1 << 18)
#else
#define TERM_TO_BINARY_LOOP_FACTOR 1
-#define TERM_TO_BINARY_SIZE_FACTOR 10
#define TERM_TO_BINARY_COMPRESS_CHUNK 10
#endif
typedef enum { TTBSize, TTBEncode, TTBCompress } TTBState;
-typedef struct {
+typedef struct TTBSizeContext_ {
Uint flags;
int level;
+ Uint result;
+ Eterm obj;
+ ErtsEStack estack;
} TTBSizeContext;
-typedef struct {
+typedef struct TTBEncodeContext_ {
Uint flags;
int level;
+ byte* ep;
+ Eterm obj;
+ ErtsWStack wstack;
Binary *result_bin;
} TTBEncodeContext;
@@ -1514,15 +1763,17 @@ typedef struct {
} s;
} TTBContext;
-static void context_destructor(Binary *context_bin)
+static void ttb_context_destructor(Binary *context_bin)
{
TTBContext *context = ERTS_MAGIC_BIN_DATA(context_bin);
if (context->alive) {
context->alive = 0;
switch (context->state) {
case TTBSize:
+ DESTROY_SAVED_ESTACK(&context->s.sc.estack);
break;
case TTBEncode:
+ DESTROY_SAVED_WSTACK(&context->s.ec.wstack);
if (context->s.ec.result_bin != NULL) { /* Set to NULL if ever made alive! */
ASSERT(erts_refc_read(&(context->s.ec.result_bin->refc),0) == 0);
erts_bin_free(context->s.ec.result_bin);
@@ -1567,7 +1818,7 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
do { \
if (context_b == NULL) { \
context_b = erts_create_magic_binary(sizeof(TTBContext), \
- context_destructor); \
+ ttb_context_destructor); \
context = ERTS_MAGIC_BIN_DATA(context_b); \
memcpy(context,&c_buff,sizeof(TTBContext)); \
} \
@@ -1587,6 +1838,7 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
/* Setup enough to get started */
context->state = TTBSize;
context->alive = 1;
+ context->s.sc.estack.start = NULL;
context->s.sc.flags = flags;
context->s.sc.level = level;
} else {
@@ -1602,7 +1854,8 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
int level;
Uint flags;
/* Try for fast path */
- if (encode_size_struct_int(p, NULL, Term, context->s.sc.flags, &reds, &size) < 0) {
+ if (encode_size_struct_int(&context->s.sc, NULL, Term,
+ context->s.sc.flags, &reds, &size) < 0) {
EXPORT_CONTEXT();
/* Same state */
RETURN_STATE();
@@ -1615,7 +1868,7 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
/* Finish in one go */
res = erts_term_to_binary_simple(p, Term, size,
level, flags);
- BUMP_REDS(p, size / TERM_TO_BINARY_SIZE_FACTOR);
+ BUMP_REDS(p, 1);
return res;
}
@@ -1628,6 +1881,7 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
context->state = TTBEncode;
context->s.ec.flags = flags;
context->s.ec.level = level;
+ context->s.ec.wstack.wstart = NULL;
context->s.ec.result_bin = result_bin;
break;
}
@@ -1639,7 +1893,7 @@ static Eterm erts_term_to_binary_int(Process* p, Eterm Term, int level, Uint fla
Binary *result_bin;
flags = context->s.ec.flags;
- if (enc_term_int(p,NULL,Term, bytes+1, flags, NULL, &reds, &endp) < 0) {
+ if (enc_term_int(&context->s.ec, NULL,Term, bytes+1, flags, NULL, &reds, &endp) < 0) {
EXPORT_CONTEXT();
RETURN_STATE();
}
@@ -2047,27 +2301,6 @@ dec_pid(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap, Ete
#define ENC_PATCH_FUN_SIZE ((Eterm) 2)
#define ENC_LAST_ARRAY_ELEMENT ((Eterm) 3)
-/* Free extra rootset (used when trapping) */
-static void cleanup_ttb_extra_root(ErlExtraRootSet *rs)
-{
- if (rs->objv != NULL) {
- erts_free(ERTS_ALC_T_EXTRA_ROOT, rs->objv);
- }
- erts_free(ERTS_ALC_T_EXTRA_ROOT, rs);
-}
-
-/* Same as above, but we have an extra "stack" beyond GC reach, i.e. an array of two extra roots */
-static void cleanup_ttb_extra_root_2(ErlExtraRootSet *rs)
-{
- if (rs->objv != NULL) {
- erts_free(ERTS_ALC_T_EXTRA_ROOT, rs->objv);
- }
- if (rs[1].objv != NULL) {
- erts_free(ERTS_ALC_T_EXTRA_ROOT, rs[1].objv);
- }
-
- erts_free(ERTS_ALC_T_EXTRA_ROOT, rs);
-}
static byte*
enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
@@ -2079,39 +2312,43 @@ enc_term(ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
}
static int
-enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
+enc_term_int(TTBEncodeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dflags,
struct erl_off_heap_header** off_heap, Sint *reds, byte **res)
{
- DECLARE_ESTACK(s);
- DECLARE_WSTACK(com);
+ DECLARE_WSTACK(s);
Uint n;
Uint i;
Uint j;
Uint* ptr;
Eterm val;
FloatDef f;
- int count_reds = (p != NULL && reds != NULL);
Sint r = 0;
+#if HALFWORD_HEAP
+ UWord wobj;
+#endif
- if (count_reds) {
- ESTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_EXTRA_ROOT);
- WSTACK_CHANGE_ALLOCATOR(com, ERTS_ALC_T_EXTRA_ROOT);
+
+ if (ctx) {
+ WSTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_SAVED_ESTACK);
r = *reds;
- }
- if (p && p->extra_root) { /* restore saved stacks and byte pointer */
- ESTACK_RESTORE(s,p->extra_root[0].objv, p->extra_root[0].sz);
- obj = ESTACK_POP(s);
- WSTACK_RESTORE(com, p->extra_root[1].objv, p->extra_root[1].sz);
- ep = (byte *) WSTACK_POP(com);
+ if (ctx->wstack.wstart) { /* restore saved stacks and byte pointer */
+ WSTACK_RESTORE(s, &ctx->wstack);
+ ep = ctx->ep;
+ obj = ctx->obj;
+ }
}
goto L_jump_start;
outer_loop:
- while (!ESTACK_ISEMPTY(s)) {
- obj = ESTACK_POP(s);
- switch (val = WSTACK_POP(com)) {
+ while (!WSTACK_ISEMPTY(s)) {
+#if HALFWORD_HEAP
+ obj = (Eterm) (wobj = WSTACK_POP(s));
+#else
+ obj = WSTACK_POP(s);
+#endif
+ switch (val = WSTACK_POP(s)) {
case ENC_TERM:
break;
case ENC_ONE_CONS:
@@ -2122,55 +2359,52 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
obj = CAR(cons);
tl = CDR(cons);
- WSTACK_PUSH(com, is_list(tl) ? ENC_ONE_CONS : ENC_TERM);
- ESTACK_PUSH(s, tl);
+ WSTACK_PUSH(s, is_list(tl) ? ENC_ONE_CONS : ENC_TERM);
+ WSTACK_PUSH(s, tl);
}
break;
case ENC_PATCH_FUN_SIZE:
- /* obj will be discarded, it was NIL */
{
- byte* size_p = (byte *) WSTACK_POP(com);
+#if HALFWORD_HEAP
+ byte* size_p = (byte *) wobj;
+#else
+ byte* size_p = (byte *) obj;
+#endif
put_int32(ep - size_p, size_p);
}
goto outer_loop;
case ENC_LAST_ARRAY_ELEMENT:
/* obj is the tuple */
{
- Eterm* ptr = tuple_val(obj);
- i = arityval(*ptr);
- obj = ptr[i];
+#if HALFWORD_HEAP
+ Eterm* ptr = (Eterm *) wobj;
+#else
+ Eterm* ptr = (Eterm *) obj;
+#endif
+ obj = *ptr;
}
break;
default: /* ENC_LAST_ARRAY_ELEMENT+1 and upwards */
{
- Eterm* ptr = tuple_val(obj);
- i = arityval(*ptr);
- ESTACK_PUSH(s, obj); /* put back tuple and next element index */
- WSTACK_PUSH(com, val-1);
- obj = ptr[i - (val - ENC_LAST_ARRAY_ELEMENT)]; /* the index is counting down */
+#if HALFWORD_HEAP
+ Eterm* ptr = (Eterm *) wobj;
+#else
+ Eterm* ptr = (Eterm *) obj;
+#endif
+ WSTACK_PUSH(s, val-1);
+ obj = *ptr++;
+ WSTACK_PUSH(s, (UWord)ptr);
}
break;
}
L_jump_start:
- if (count_reds && --r == 0) {
+ if (ctx && --r == 0) {
*reds = r;
- ESTACK_PUSH(s,obj); /* push back current object, to be popped on restore */
- WSTACK_PUSH(com,((UWord) ep));
- if (p->extra_root == NULL) {
- /* NB. Allocate an array of two "extra-roots", of which only the first element
- is seen and handled by the GC. Index 1 holds the Wstack. */
- p->extra_root = erts_alloc(ERTS_ALC_T_EXTRA_ROOT, sizeof(ErlExtraRootSet)*2);
- p->extra_root->objv = NULL;
- p->extra_root->sz = 0;
- p->extra_root->cleanup = cleanup_ttb_extra_root_2;
- p->extra_root[1].objv = NULL;
- p->extra_root[1].sz = 0;
- p->extra_root[1].cleanup = NULL; /* Never used */
- }
- ESTACK_SAVE(s, p->extra_root[0].objv, p->extra_root[0].sz);
- WSTACK_SAVE(com, p->extra_root[1].objv, (p->extra_root[1].sz));
+ ctx->obj = obj;
+ ctx->ep = ep;
+ WSTACK_SAVE(s, &ctx->wstack);
return -1;
}
switch(tag_val_def(obj)) {
@@ -2316,8 +2550,8 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
ep += 4;
}
if (i > 0) {
- WSTACK_PUSH(com, ENC_LAST_ARRAY_ELEMENT+i-1);
- ESTACK_PUSH(s, obj);
+ WSTACK_PUSH(s, ENC_LAST_ARRAY_ELEMENT+i-1);
+ WSTACK_PUSH(s, (UWord)ptr);
}
break;
@@ -2461,9 +2695,8 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
int ei;
*ep++ = NEW_FUN_EXT;
- WSTACK_PUSH(com, (UWord) ep); /* Position for patching in size */
- WSTACK_PUSH(com, ENC_PATCH_FUN_SIZE);
- ESTACK_PUSH(s,NIL); /* Will be thrown away */
+ WSTACK_PUSH(s, ENC_PATCH_FUN_SIZE);
+ WSTACK_PUSH(s, (UWord) ep); /* Position for patching in size */
ep += 4;
*ep = funp->arity;
ep += 1;
@@ -2480,8 +2713,8 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
fun_env:
for (ei = funp->num_free-1; ei > 0; ei--) {
- WSTACK_PUSH(com, ENC_TERM);
- ESTACK_PUSH(s, (UWord) funp->env[ei]);
+ WSTACK_PUSH(s, ENC_TERM);
+ WSTACK_PUSH(s, (UWord) funp->env[ei]);
}
if (funp->num_free != 0) {
obj = funp->env[0];
@@ -2524,13 +2757,9 @@ enc_term_int(Process *p,ErtsAtomCacheMap *acmp, Eterm obj, byte* ep, Uint32 dfla
break;
}
}
- DESTROY_ESTACK(s);
- DESTROY_WSTACK(com);
- if (p && p->extra_root) {
- cleanup_ttb_extra_root_2(p->extra_root);
- p->extra_root = NULL;
- }
- if (count_reds) {
+ DESTROY_WSTACK(s);
+ if (ctx) {
+ ASSERT(ctx->wstack.wstart == NULL);
*reds = r;
}
*res = ep;
@@ -2604,21 +2833,112 @@ undo_offheap_in_area(ErlOffHeap* off_heap, Eterm* start, Eterm* end)
#endif /* DEBUG */
}
+
/* Decode term from external format into *objp.
** On failure return NULL and (R13B04) *hpp will be unchanged.
*/
static byte*
-dec_term(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap, Eterm* objp)
+dec_term(ErtsDistExternal *edep, Eterm** hpp, byte* ep, ErlOffHeap* off_heap,
+ Eterm* objp, B2TContext* ctx)
{
- Eterm* hp_saved = *hpp;
+ Eterm* hp_saved;
int n;
ErtsAtomEncoding char_enc;
- register Eterm* hp = *hpp; /* Please don't take the address of hp */
- Eterm* next = objp;
+ register Eterm* hp; /* Please don't take the address of hp */
+ Eterm* next;
+ SWord reds;
+
+ if (ctx) {
+ hp_saved = ctx->u.dc.hp_start;
+ reds = ctx->reds;
+ next = ctx->u.dc.next;
+ ep = ctx->u.dc.ep;
+ hpp = &ctx->u.dc.hp;
+
+ if (ctx->state != B2TDecode) {
+ int n_limit = reds;
+
+ n = ctx->u.dc.remaining_n;
+ if (ctx->state == B2TDecodeBinary) {
+ n_limit *= B2T_MEMCPY_FACTOR;
+ ASSERT(n_limit >= reds);
+ reds -= n / B2T_MEMCPY_FACTOR;
+ }
+ else
+ reds -= n;
- *next = (Eterm) (UWord) NULL;
+ if (n > n_limit) {
+ ctx->u.dc.remaining_n -= n_limit;
+ n = n_limit;
+ reds = 0;
+ }
+ else {
+ ctx->u.dc.remaining_n = 0;
+ }
+
+ switch (ctx->state) {
+ case B2TDecodeList:
+ objp = next - 2;
+ while (n > 0) {
+ objp[0] = (Eterm) COMPRESS_POINTER(next);
+ objp[1] = make_list(next);
+ next = objp;
+ objp -= 2;
+ n--;
+ }
+ break;
+
+ case B2TDecodeTuple:
+ objp = next - 1;
+ while (n-- > 0) {
+ objp[0] = (Eterm) COMPRESS_POINTER(next);
+ next = objp;
+ objp--;
+ }
+ break;
+
+ case B2TDecodeString:
+ hp = *hpp;
+ hp[-1] = make_list(hp); /* overwrite the premature NIL */
+ while (n-- > 0) {
+ hp[0] = make_small(*ep++);
+ hp[1] = make_list(hp+2);
+ hp += 2;
+ }
+ hp[-1] = NIL;
+ *hpp = hp;
+ break;
+
+ case B2TDecodeBinary:
+ sys_memcpy(ctx->u.dc.remaining_bytes, ep, n);
+ ctx->u.dc.remaining_bytes += n;
+ ep += n;
+ break;
+
+ default:
+ ASSERT(!"Unknown state");
+ }
+ if (!ctx->u.dc.remaining_n) {
+ ctx->state = B2TDecode;
+ }
+ if (reds <= 0) {
+ ctx->u.dc.next = next;
+ ctx->u.dc.ep = ep;
+ ctx->reds = 0;
+ return NULL;
+ }
+ }
+ }
+ else {
+ hp_saved = *hpp;
+ reds = ERTS_SWORD_MAX;
+ next = objp;
+ *next = (Eterm) (UWord) NULL;
+ }
+ hp = *hpp;
while (next != NULL) {
+
objp = next;
next = (Eterm *) EXPAND_POINTER(*objp);
@@ -2738,7 +3058,16 @@ dec_term_atom_common:
*objp = make_tuple(hp);
*hp++ = make_arityval(n);
hp += n;
- objp = hp - 1;
+ objp = hp - 1;
+ if (ctx) {
+ if (reds < n) {
+ ASSERT(reds > 0);
+ ctx->state = B2TDecodeTuple;
+ ctx->u.dc.remaining_n = n - reds;
+ n = reds;
+ }
+ reds -= n;
+ }
while (n-- > 0) {
objp[0] = (Eterm) COMPRESS_POINTER(next);
next = objp;
@@ -2756,17 +3085,27 @@ dec_term_atom_common:
break;
}
*objp = make_list(hp);
- hp += 2*n;
+ hp += 2 * n;
objp = hp - 2;
objp[0] = (Eterm) COMPRESS_POINTER((objp+1));
objp[1] = (Eterm) COMPRESS_POINTER(next);
next = objp;
objp -= 2;
- while (--n > 0) {
+ n--;
+ if (ctx) {
+ if (reds < n) {
+ ctx->state = B2TDecodeList;
+ ctx->u.dc.remaining_n = n - reds;
+ n = reds;
+ }
+ reds -= n;
+ }
+ while (n > 0) {
objp[0] = (Eterm) COMPRESS_POINTER(next);
- objp[1] = make_list(objp + 2);
+ objp[1] = make_list(next);
next = objp;
objp -= 2;
+ n--;
}
break;
case STRING_EXT:
@@ -2777,6 +3116,14 @@ dec_term_atom_common:
break;
}
*objp = make_list(hp);
+ if (ctx) {
+ if (reds < n) {
+ ctx->state = B2TDecodeString;
+ ctx->u.dc.remaining_n = n - reds;
+ n = reds;
+ }
+ reds -= n;
+ }
while (n-- > 0) {
hp[0] = make_small(*ep++);
hp[1] = make_list(hp+2);
@@ -2984,7 +3331,6 @@ dec_term_atom_common:
dbin->flags = 0;
dbin->orig_size = n;
erts_refc_init(&dbin->refc, 1);
- sys_memcpy(dbin->orig_bytes, ep, n);
pb = (ProcBin *) hp;
hp += PROC_BIN_SIZE;
pb->thing_word = HEADER_PROC_BIN;
@@ -2995,7 +3341,20 @@ dec_term_atom_common:
pb->bytes = (byte*) dbin->orig_bytes;
pb->flags = 0;
*objp = make_binary(pb);
- }
+ if (ctx) {
+ int n_limit = reds * B2T_MEMCPY_FACTOR;
+ if (n > n_limit) {
+ ctx->state = B2TDecodeBinary;
+ ctx->u.dc.remaining_n = n - n_limit;
+ ctx->u.dc.remaining_bytes = dbin->orig_bytes + n_limit;
+ n = n_limit;
+ reds = 0;
+ }
+ else
+ reds -= n / B2T_MEMCPY_FACTOR;
+ }
+ sys_memcpy(dbin->orig_bytes, ep, n);
+ }
ep += n;
break;
}
@@ -3018,13 +3377,14 @@ dec_term_atom_common:
sys_memcpy(hb->data, ep, n);
bin = make_binary(hb);
hp += heap_bin_size(n);
+ ep += n;
} else {
Binary* dbin = erts_bin_nrml_alloc(n);
ProcBin* pb;
+
dbin->flags = 0;
dbin->orig_size = n;
erts_refc_init(&dbin->refc, 1);
- sys_memcpy(dbin->orig_bytes, ep, n);
pb = (ProcBin *) hp;
pb->thing_word = HEADER_PROC_BIN;
pb->size = n;
@@ -3035,8 +3395,23 @@ dec_term_atom_common:
pb->flags = 0;
bin = make_binary(pb);
hp += PROC_BIN_SIZE;
- }
- ep += n;
+ if (ctx) {
+ int n_limit = reds * B2T_MEMCPY_FACTOR;
+ if (n > n_limit) {
+ ctx->state = B2TDecodeBinary;
+ ctx->u.dc.remaining_n = n - n_limit;
+ ctx->u.dc.remaining_bytes = dbin->orig_bytes + n_limit;
+ n = n_limit;
+ reds = 0;
+ }
+ else
+ reds -= n / B2T_MEMCPY_FACTOR;
+ }
+ sys_memcpy(dbin->orig_bytes, ep, n);
+ ep += n;
+ n = pb->size;
+ }
+
if (bitsize == 8 || n == 0) {
*objp = bin;
} else {
@@ -3067,7 +3442,7 @@ dec_term_atom_common:
goto error;
}
*hpp = hp;
- ep = dec_term(edep, hpp, ep, off_heap, &temp);
+ ep = dec_term(edep, hpp, ep, off_heap, &temp, NULL);
hp = *hpp;
if (ep == NULL) {
goto error;
@@ -3127,7 +3502,7 @@ dec_term_atom_common:
}
*hpp = hp;
/* Index */
- if ((ep = dec_term(edep, hpp, ep, off_heap, &temp)) == NULL) {
+ if ((ep = dec_term(edep, hpp, ep, off_heap, &temp, NULL)) == NULL) {
goto error;
}
if (!is_small(temp)) {
@@ -3136,7 +3511,7 @@ dec_term_atom_common:
old_index = unsigned_val(temp);
/* Uniq */
- if ((ep = dec_term(edep, hpp, ep, off_heap, &temp)) == NULL) {
+ if ((ep = dec_term(edep, hpp, ep, off_heap, &temp, NULL)) == NULL) {
goto error;
}
if (!is_small(temp)) {
@@ -3204,7 +3579,7 @@ dec_term_atom_common:
}
/* Index */
- if ((ep = dec_term(edep, hpp, ep, off_heap, &temp)) == NULL) {
+ if ((ep = dec_term(edep, hpp, ep, off_heap, &temp, NULL)) == NULL) {
goto error;
}
if (!is_small(temp)) {
@@ -3213,7 +3588,7 @@ dec_term_atom_common:
old_index = unsigned_val(temp);
/* Uniq */
- if ((ep = dec_term(edep, hpp, ep, off_heap, &temp)) == NULL) {
+ if ((ep = dec_term(edep, hpp, ep, off_heap, &temp, NULL)) == NULL) {
goto error;
}
if (!is_small(temp)) {
@@ -3313,8 +3688,31 @@ dec_term_atom_common:
}
undo_offheap_in_area(off_heap, hp_saved, hp);
*hpp = hp_saved;
- return NULL;
+ if (ctx) {
+ ctx->state = B2TDecodeFail;
+ ctx->reds = reds;
+ }
+ return NULL;
}
+
+ if (--reds <= 0) {
+ if (ctx) {
+ if (next || ctx->state != B2TDecode) {
+ ctx->u.dc.ep = ep;
+ ctx->u.dc.next = next;
+ ctx->u.dc.hp = hp;
+ ctx->reds = 0;
+ return NULL;
+ }
+ }
+ else {
+ reds = ERTS_SWORD_MAX;
+ }
+ }
+ }
+ if (ctx) {
+ ctx->state = B2TDone;
+ ctx->reds = reds;
}
*hpp = hp;
return ep;
@@ -3331,26 +3729,24 @@ static Uint encode_size_struct2(ErtsAtomCacheMap *acmp, Eterm obj, unsigned dfla
}
static int
-encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj,
+encode_size_struct_int(TTBSizeContext* ctx, ErtsAtomCacheMap *acmp, Eterm obj,
unsigned dflags, Sint *reds, Uint *res)
{
DECLARE_ESTACK(s);
Uint m, i, arity;
Uint result = 0;
- int count_reds = (p != NULL && reds != 0);
Sint r = 0;
- if (count_reds) {
- ESTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_EXTRA_ROOT);
+ if (ctx) {
+ ESTACK_CHANGE_ALLOCATOR(s, ERTS_ALC_T_SAVED_ESTACK);
r = *reds;
- }
- if (p && p->extra_root) { /* restore saved stack */
- ESTACK_RESTORE(s,p->extra_root->objv, p->extra_root->sz + 1);
- result = ESTACK_POP(s); /*Untagged, beyond p->extra_root->sz */
- obj = ESTACK_POP(s);
-
- }
+ if (ctx->estack.start) { /* restore saved stack */
+ ESTACK_RESTORE(s, &ctx->estack);
+ result = ctx->result;
+ obj = ctx->obj;
+ }
+ }
goto L_jump_start;
@@ -3376,18 +3772,11 @@ encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj,
}
L_jump_start:
- if (count_reds && --r == 0) {
+ if (ctx && --r == 0) {
*reds = r;
- ESTACK_PUSH(s,obj); /* push back current object */
- ESTACK_PUSH(s,result); /* Untagged, will be out of GC reach */
- if (p->extra_root == NULL) {
- p->extra_root = erts_alloc(ERTS_ALC_T_EXTRA_ROOT, sizeof(ErlExtraRootSet));
- p->extra_root->objv = NULL;
- p->extra_root->sz = 0;
- p->extra_root->cleanup = cleanup_ttb_extra_root;
- }
- ESTACK_SAVE(s, p->extra_root->objv, p->extra_root->sz);
- --p->extra_root->sz; /* Hide result from GC */
+ ctx->obj = obj;
+ ctx->result = result;
+ ESTACK_SAVE(s, &ctx->estack);
return -1;
}
switch (tag_val_def(obj)) {
@@ -3590,11 +3979,8 @@ encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj,
}
DESTROY_ESTACK(s);
- if (p && p->extra_root) {
- cleanup_ttb_extra_root(p->extra_root);
- p->extra_root = NULL;
- }
- if (count_reds) {
+ if (ctx) {
+ ASSERT(ctx->estack.start == NULL);
*reds = r;
}
*res = result;
@@ -3602,18 +3988,37 @@ encode_size_struct_int(Process *p, ErtsAtomCacheMap *acmp, Eterm obj,
}
static Sint
-decoded_size(byte *ep, byte* endp, int internal_tags)
+decoded_size(byte *ep, byte* endp, int internal_tags, B2TContext* ctx)
{
- int heap_size = 0;
+ int heap_size;
int terms;
- int atom_extra_skip = 0;
+ int atom_extra_skip;
Uint n;
+ SWord reds;
+
+ if (ctx) {
+ reds = ctx->reds;
+ if (ctx->u.sc.ep) {
+ heap_size = ctx->u.sc.heap_size;
+ terms = ctx->u.sc.terms;
+ ep = ctx->u.sc.ep;
+ atom_extra_skip = ctx->u.sc.atom_extra_skip;
+ goto init_done;
+ }
+ }
+ else
+ reds = 0; /* not used but compiler warns anyway */
+
+ heap_size = 0;
+ terms = 1;
+ atom_extra_skip = 0;
+init_done:
#define SKIP(sz) \
do { \
if ((sz) <= endp-ep) { \
ep += (sz); \
- } else { return -1; }; \
+ } else { goto error; }; \
} while (0)
#define SKIP2(sz1, sz2) \
@@ -3621,31 +4026,32 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
Uint sz = (sz1) + (sz2); \
if (sz1 < sz && (sz) <= endp-ep) { \
ep += (sz); \
- } else { return -1; } \
+ } else { goto error; } \
} while (0)
#define CHKSIZE(sz) \
do { \
- if ((sz) > endp-ep) { return -1; } \
+ if ((sz) > endp-ep) { goto error; } \
} while (0)
#define ADDTERMS(n) \
do { \
int before = terms; \
terms += (n); \
- if (terms < before) return -1; \
+ if (terms < before) goto error; \
} while (0)
-
- for (terms=1; terms > 0; terms--) {
- int tag;
-
+ ASSERT(terms > 0);
+ do {
+ int tag;
CHKSIZE(1);
tag = ep++[0];
switch (tag) {
case INTEGER_EXT:
SKIP(4);
+#if !defined(ARCH_64) || HALFWORD_HEAP
heap_size += BIG_UINT_HEAP_SIZE;
+#endif
break;
case SMALL_INTEGER_EXT:
SKIP(1);
@@ -3660,7 +4066,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
CHKSIZE(4);
n = get_int32(ep);
if (n > BIG_ARITY_MAX*sizeof(ErtsDigit)) {
- return -1;
+ goto error;
}
SKIP2(n,4+1); /* skip, size,sign,digits */
heap_size += 1+1+(n+sizeof(Eterm)-1)/sizeof(Eterm); /* XXX: 1 too much? */
@@ -3669,7 +4075,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
CHKSIZE(2);
n = get_int16(ep);
if (n > MAX_ATOM_CHARACTERS) {
- return -1;
+ goto error;
}
SKIP(n+2+atom_extra_skip);
atom_extra_skip = 0;
@@ -3679,7 +4085,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
n = get_int16(ep);
ep += 2;
if (n > MAX_ATOM_SZ_LIMIT) {
- return -1;
+ goto error;
}
SKIP(n+atom_extra_skip);
atom_extra_skip = 0;
@@ -3688,7 +4094,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
CHKSIZE(1);
n = get_int8(ep);
if (n > MAX_ATOM_CHARACTERS) {
- return -1;
+ goto error;
}
SKIP(n+1+atom_extra_skip);
atom_extra_skip = 0;
@@ -3698,7 +4104,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
n = get_int8(ep);
ep++;
if (n > MAX_ATOM_SZ_LIMIT) {
- return -1;
+ goto error;
}
SKIP(n+atom_extra_skip);
atom_extra_skip = 0;
@@ -3727,7 +4133,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
id_words = get_int16(ep);
if (id_words > ERTS_MAX_REF_NUMBERS)
- return -1;
+ goto error;
ep += 2;
atom_extra_skip = 1 + 4*id_words;
@@ -3829,7 +4235,7 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
num_free = get_int32(ep);
ep += 4;
if (num_free > MAX_ARG) {
- return -1;
+ goto error;
}
terms += 4 + num_free;
heap_size += ERL_FUN_SIZE + num_free;
@@ -3846,24 +4252,47 @@ decoded_size(byte *ep, byte* endp, int internal_tags)
case BINARY_INTERNAL_REF:
if (!internal_tags) {
- return -1;
+ goto error;
}
SKIP(sizeof(ProcBin));
heap_size += PROC_BIN_SIZE;
break;
case BIT_BINARY_INTERNAL_REF:
if (!internal_tags) {
- return -1;
+ goto error;
}
SKIP(2+sizeof(ProcBin));
heap_size += PROC_BIN_SIZE + ERL_SUB_BIN_SIZE;
break;
default:
- return -1;
+ goto error;
}
- }
+ terms--;
+
+ if (ctx && --reds <= 0 && terms > 0) {
+ ctx->u.sc.heap_size = heap_size;
+ ctx->u.sc.terms = terms;
+ ctx->u.sc.ep = ep;
+ ctx->u.sc.atom_extra_skip = atom_extra_skip;
+ ctx->reds = 0;
+ return 0;
+ }
+ }while (terms > 0);
+
/* 'terms' may be non-zero if it has wrapped around */
- return terms==0 ? heap_size : -1;
+ if (terms == 0) {
+ if (ctx) {
+ ctx->state = B2TDecodeInit;
+ ctx->reds = reds;
+ }
+ return heap_size;
+ }
+
+error:
+ if (ctx) {
+ ctx->state = B2TBadArg;
+ }
+ return -1;
#undef SKIP
#undef SKIP2
#undef CHKSIZE
diff --git a/erts/emulator/beam/external.h b/erts/emulator/beam/external.h
index ff29e84972..83001b2c7e 100644
--- a/erts/emulator/beam/external.h
+++ b/erts/emulator/beam/external.h
@@ -146,6 +146,7 @@ typedef struct {
typedef struct {
byte *extp;
int exttmp;
+ Uint extsize;
} ErtsBinary2TermState;
/* -------------------------------------------------------------------------- */
diff --git a/erts/emulator/beam/global.h b/erts/emulator/beam/global.h
index 94bc1b172a..83a8911a36 100755
--- a/erts/emulator/beam/global.h
+++ b/erts/emulator/beam/global.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -370,231 +370,233 @@ extern int stackdump_on_exit;
* DESTROY_ESTACK(Stack)
*/
+typedef struct {
+ Eterm* start;
+ Eterm* sp;
+ Eterm* end;
+ ErtsAlcType_t alloc_type;
+}ErtsEStack;
-void erl_grow_stack(ErtsAlcType_t a_type, Eterm** start, Eterm** sp, Eterm** end);
-#define ESTK_CONCAT(a,b) a##b
-#define ESTK_SUBSCRIPT(s,i) *((Eterm *)((byte *)ESTK_CONCAT(s,_start) + (i)))
#define DEF_ESTACK_SIZE (16)
-#define DECLARE_ESTACK(s) \
- Eterm ESTK_CONCAT(s,_default_stack)[DEF_ESTACK_SIZE]; \
- Eterm* ESTK_CONCAT(s,_start) = ESTK_CONCAT(s,_default_stack); \
- Eterm* ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start); \
- Eterm* ESTK_CONCAT(s,_end) = ESTK_CONCAT(s,_start) + DEF_ESTACK_SIZE;\
- ErtsAlcType_t ESTK_CONCAT(s,_alloc_type) = ERTS_ALC_T_ESTACK
+void erl_grow_estack(ErtsEStack*, Eterm* def_stack);
+#define ESTK_CONCAT(a,b) a##b
+#define ESTK_DEF_STACK(s) ESTK_CONCAT(s,_default_estack)
+
+#define DECLARE_ESTACK(s) \
+ Eterm ESTK_DEF_STACK(s)[DEF_ESTACK_SIZE]; \
+ ErtsEStack s = { \
+ ESTK_DEF_STACK(s), /* start */ \
+ ESTK_DEF_STACK(s), /* sp */ \
+ ESTK_DEF_STACK(s) + DEF_ESTACK_SIZE, /* end */ \
+ ERTS_ALC_T_ESTACK /* alloc_type */ \
+ }
#define ESTACK_CHANGE_ALLOCATOR(s,t) \
do { \
- if (ESTK_CONCAT(s,_start) != ESTK_CONCAT(s,_default_stack)) { \
+ if (s.start != ESTK_DEF_STACK(s)) { \
erl_exit(1, "Internal error - trying to change allocator " \
"type of active estack\n"); \
} \
- ESTK_CONCAT(s,_alloc_type) = (t); \
+ s.alloc_type = (t); \
} while (0)
+#define DESTROY_ESTACK(s) \
+do { \
+ if (s.start != ESTK_DEF_STACK(s)) { \
+ erts_free(s.alloc_type, s.start); \
+ } \
+} while(0)
+
+
/*
- * Do not free the stack after this, it may have pointers into what
- * was saved in 'v'. 'v' and 'vsize' are changed by this macro. If
- * 'v' points to anything, it should have been allocated by a previous
- * call to this macro. Be careful to set a correct allocator prior to
- * saving.
- * 'v' can be any lvalue pointer, it will point to an array of UWord
- * after calling this macro.
+ * Do not free the stack after this, it may have pointers into what
+ * was saved in 'dst'.
*/
-#define ESTACK_SAVE(s,v,vsize) /* v and vsize are "name parameters" */ \
-do { \
- Uint _esz = ESTACK_COUNT(s); \
- if (ESTK_CONCAT(s,_start) == ESTK_CONCAT(s,_default_stack)) { \
- if ((v) == NULL) { \
- (v) = erts_alloc(ESTK_CONCAT(s,_alloc_type), \
- DEF_ESTACK_SIZE * sizeof(Eterm)); \
- } \
- memcpy((v),ESTK_CONCAT(s,_start),_esz*sizeof(Eterm)); \
- } else { \
- (v) = (void *) ESTK_CONCAT(s,_start); \
- } \
- (vsize) = _esz; \
+#define ESTACK_SAVE(s,dst)\
+do {\
+ if (s.start == ESTK_DEF_STACK(s)) {\
+ UWord _wsz = ESTACK_COUNT(s);\
+ (dst)->start = erts_alloc(s.alloc_type,\
+ DEF_ESTACK_SIZE * sizeof(Eterm));\
+ memcpy((dst)->start, s.start,_wsz*sizeof(Eterm));\
+ (dst)->sp = (dst)->start + _wsz;\
+ (dst)->end = (dst)->start + DEF_ESTACK_SIZE;\
+ (dst)->alloc_type = s.alloc_type;\
+ } else\
+ *(dst) = s;\
} while (0)
-/*
- * Use on empty stack, only the allocator can be changed before this
- * The vector parameter is reset to NULL if the vector is moved to stack,
- * otherwise it's kept for reuse, so a saved and restored vector might
- * need freeing using the correct allocator parameter.
- * 'v' can be any lvalue pointer, it's cast to an (Eterm *).
+#define DESTROY_SAVED_ESTACK(estack)\
+do {\
+ if ((estack)->start) {\
+ erts_free((estack)->alloc_type, (estack)->start);\
+ (estack)->start = NULL;\
+ }\
+} while(0)
+
+/*
+ * Use on empty stack, only the allocator can be changed before this.
+ * The src stack is reset to NULL.
*/
-#define ESTACK_RESTORE(s, v, vsize) /*v is a "name parameter"*/ \
-do { \
- if ((vsize) > DEF_ESTACK_SIZE) { \
- Uint _ca = DEF_ESTACK_SIZE; \
- while (_ca < (vsize)) \
- _ca = _ca * 2; \
- ESTK_CONCAT(s,_start) = (Eterm *) (v); \
- ESTK_CONCAT(s,_end) = ((Eterm *)(v)) + _ca; \
- ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start) + (vsize); \
- (v) = NULL; \
- } else { \
- memcpy(ESTK_CONCAT(s,_start),(v),(vsize)*sizeof(Eterm));\
- ESTK_CONCAT(s,_sp) = ESTK_CONCAT(s,_start) + (vsize); \
- } \
- } while (0)
+#define ESTACK_RESTORE(s, src) \
+do { \
+ ASSERT(s.start == ESTK_DEF_STACK(s)); \
+ s = *(src); /* struct copy */ \
+ (src)->start = NULL; \
+ ASSERT(s.sp >= s.start); \
+ ASSERT(s.sp <= s.end); \
+} while (0)
-#define ESTACK_IS_STATIC(s) (ESTK_CONCAT(s,_start) == ESTK_CONCAT(s,_default_stack))
+#define ESTACK_IS_STATIC(s) (s.start == ESTK_DEF_STACK(s)))
-#define DESTROY_ESTACK(s) \
-do { \
- if (ESTK_CONCAT(s,_start) != ESTK_CONCAT(s,_default_stack)) { \
- erts_free(ESTK_CONCAT(s,_alloc_type), ESTK_CONCAT(s,_start)); \
- } \
+#define ESTACK_PUSH(s, x) \
+do { \
+ if (s.sp == s.end) { \
+ erl_grow_estack(&s, ESTK_DEF_STACK(s)); \
+ } \
+ *s.sp++ = (x); \
} while(0)
-#define ESTACK_PUSH(s, x) \
-do { \
- if (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_end)) { \
- erl_grow_stack(ESTK_CONCAT(s,_alloc_type),&ESTK_CONCAT(s,_start), \
- &ESTK_CONCAT(s,_sp), &ESTK_CONCAT(s,_end)); \
- } \
- *ESTK_CONCAT(s,_sp)++ = (x); \
+#define ESTACK_PUSH2(s, x, y) \
+do { \
+ if (s.sp > s.end - 2) { \
+ erl_grow_estack(&s, ESTK_DEF_STACK(s)); \
+ } \
+ *s.sp++ = (x); \
+ *s.sp++ = (y); \
} while(0)
-#define ESTACK_PUSH2(s, x, y) \
-do { \
- if (ESTK_CONCAT(s,_sp) > ESTK_CONCAT(s,_end) - 2) { \
- erl_grow_stack(ESTK_CONCAT(s,_alloc_type),&ESTK_CONCAT(s,_start), \
- &ESTK_CONCAT(s,_sp), &ESTK_CONCAT(s,_end)); \
- } \
- *ESTK_CONCAT(s,_sp)++ = (x); \
- *ESTK_CONCAT(s,_sp)++ = (y); \
+#define ESTACK_PUSH3(s, x, y, z) \
+do { \
+ if (s.sp > s.end - 3) { \
+ erl_grow_estack(&s, ESTK_DEF_STACK(s)); \
+ } \
+ *s.sp++ = (x); \
+ *s.sp++ = (y); \
+ *s.sp++ = (z); \
} while(0)
-#define ESTACK_PUSH3(s, x, y, z) \
-do { \
- if (ESTK_CONCAT(s,_sp) > ESTK_CONCAT(s,_end) - 3) { \
- erl_grow_stack(&ESTK_CONCAT(s,_start), &ESTK_CONCAT(s,_sp), \
- &ESTK_CONCAT(s,_end)); \
- } \
- *ESTK_CONCAT(s,_sp)++ = (x); \
- *ESTK_CONCAT(s,_sp)++ = (y); \
- *ESTK_CONCAT(s,_sp)++ = (z); \
-} while(0)
+#define ESTACK_COUNT(s) (s.sp - s.start)
+#define ESTACK_ISEMPTY(s) (s.sp == s.start)
+#define ESTACK_POP(s) (*(--s.sp))
-#define ESTACK_COUNT(s) (ESTK_CONCAT(s,_sp) - ESTK_CONCAT(s,_start))
-#define ESTACK_ISEMPTY(s) (ESTK_CONCAT(s,_sp) == ESTK_CONCAT(s,_start))
-#define ESTACK_POP(s) (*(--ESTK_CONCAT(s,_sp)))
+/*
+ * WSTACK: same as ESTACK but with UWord instead of Eterm
+ */
+typedef struct {
+ UWord* wstart;
+ UWord* wsp;
+ UWord* wend;
+ ErtsAlcType_t alloc_type;
+}ErtsWStack;
-void erl_grow_wstack(ErtsAlcType_t a_type, UWord** start, UWord** sp, UWord** end);
-#define WSTK_CONCAT(a,b) a##b
-#define WSTK_SUBSCRIPT(s,i) *((UWord *)((byte *)WSTK_CONCAT(s,_start) + (i)))
#define DEF_WSTACK_SIZE (16)
-#define DECLARE_WSTACK(s) \
- UWord WSTK_CONCAT(s,_default_stack)[DEF_WSTACK_SIZE]; \
- UWord* WSTK_CONCAT(s,_start) = WSTK_CONCAT(s,_default_stack); \
- UWord* WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start); \
- UWord* WSTK_CONCAT(s,_end) = WSTK_CONCAT(s,_start) + DEF_WSTACK_SIZE; \
- ErtsAlcType_t WSTK_CONCAT(s,_alloc_type) = ERTS_ALC_T_ESTACK
+void erl_grow_wstack(ErtsWStack*, UWord* def_stack);
+#define WSTK_CONCAT(a,b) a##b
+#define WSTK_DEF_STACK(s) WSTK_CONCAT(s,_default_wstack)
+
+#define DECLARE_WSTACK(s) \
+ UWord WSTK_DEF_STACK(s)[DEF_WSTACK_SIZE]; \
+ ErtsWStack s = { \
+ WSTK_DEF_STACK(s), /* wstart */ \
+ WSTK_DEF_STACK(s), /* wsp */ \
+ WSTK_DEF_STACK(s) + DEF_WSTACK_SIZE, /* wend */ \
+ ERTS_ALC_T_ESTACK /* alloc_type */ \
+ }
#define WSTACK_CHANGE_ALLOCATOR(s,t) \
do { \
- if (WSTK_CONCAT(s,_start) != WSTK_CONCAT(s,_default_stack)) { \
+ if (s.wstart != WSTK_DEF_STACK(s)) { \
erl_exit(1, "Internal error - trying to change allocator " \
"type of active wstack\n"); \
} \
- WSTK_CONCAT(s,_alloc_type) = (t); \
+ s.alloc_type = (t); \
} while (0)
-#define DESTROY_WSTACK(s) \
-do { \
- if (WSTK_CONCAT(s,_start) != WSTK_CONCAT(s,_default_stack)) { \
- erts_free(WSTK_CONCAT(s,_alloc_type), WSTK_CONCAT(s,_start)); \
- } \
+#define DESTROY_WSTACK(s) \
+do { \
+ if (s.wstart != WSTK_DEF_STACK(s)) { \
+ erts_free(s.alloc_type, s.wstart); \
+ } \
} while(0)
+
/*
- * Do not free the stack after this, it may have pointers into what
- * was saved in 'v'. 'v' and 'vsize' are changed by this macro. If
- * 'v' points to anything, it should have been allocated by a previous
- * call to this macro. Be careful to set a correct allocator prior to
- * saving.
- * 'v' can be any lvalue pointer, it will point to an array of UWord
- * after calling this macro.
+ * Do not free the stack after this, it may have pointers into what
+ * was saved in 'dst'.
*/
-#define WSTACK_SAVE(s,v,vsize) /* v and vsize are "name parameters" */ \
-do { \
- Uint _wsz = WSTACK_COUNT(s); \
- if (WSTK_CONCAT(s,_start) == WSTK_CONCAT(s,_default_stack)) { \
- if ((v) == NULL) { \
- (v) = erts_alloc(WSTK_CONCAT(s,_alloc_type), \
- DEF_WSTACK_SIZE * sizeof(UWord)); \
- } \
- memcpy((v),WSTK_CONCAT(s,_start),_wsz*sizeof(UWord)); \
- } else { \
- (v) = (void *) WSTK_CONCAT(s,_start); \
- } \
- (vsize) = _wsz; \
+#define WSTACK_SAVE(s,dst)\
+do {\
+ if (s.wstart == WSTK_DEF_STACK(s)) {\
+ UWord _wsz = WSTACK_COUNT(s);\
+ (dst)->wstart = erts_alloc(s.alloc_type,\
+ DEF_WSTACK_SIZE * sizeof(UWord));\
+ memcpy((dst)->wstart, s.wstart,_wsz*sizeof(UWord));\
+ (dst)->wsp = (dst)->wstart + _wsz;\
+ (dst)->wend = (dst)->wstart + DEF_WSTACK_SIZE;\
+ (dst)->alloc_type = s.alloc_type;\
+ } else\
+ *(dst) = s;\
} while (0)
-/*
- * Use on empty stack, only the allocator can be changed before this
- * The vector parameter is reset to NULL if the vector is moved to stack,
- * otherwise it's kept for reuse, so a saved and restored vector might
- * need freeing using the correct allocator parameter.
- * 'v' can be any lvalue pointer, it's cast to an (UWord *).
+#define DESTROY_SAVED_WSTACK(wstack)\
+do {\
+ if ((wstack)->wstart) {\
+ erts_free((wstack)->alloc_type, (wstack)->wstart);\
+ (wstack)->wstart = NULL;\
+ }\
+} while(0)
+
+/*
+ * Use on empty stack, only the allocator can be changed before this.
+ * The src stack is reset to NULL.
*/
-#define WSTACK_RESTORE(s, v, vsize) /*v is a "name parameter"*/ \
-do { \
- if ((vsize) > DEF_WSTACK_SIZE) { \
- Uint _ca = DEF_WSTACK_SIZE; \
- while (_ca < (vsize)) \
- _ca = _ca * 2; \
- WSTK_CONCAT(s,_start) = (UWord *) (v); \
- WSTK_CONCAT(s,_end) = ((UWord *)(v)) + _ca; \
- WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start) + (vsize); \
- (v) = NULL; \
- } else { \
- memcpy(WSTK_CONCAT(s,_start),(v),(vsize)*sizeof(UWord));\
- WSTK_CONCAT(s,_sp) = WSTK_CONCAT(s,_start) + (vsize); \
- } \
- } while (0)
+#define WSTACK_RESTORE(s, src) \
+do { \
+ ASSERT(s.wstart == WSTK_DEF_STACK(s)); \
+ s = *(src); /* struct copy */ \
+ (src)->wstart = NULL; \
+ ASSERT(s.wsp >= s.wstart); \
+ ASSERT(s.wsp <= s.wend); \
+} while (0)
-#define WSTACK_IS_STATIC(s) (WSTK_CONCAT(s,_start) == WSTK_CONCAT(s,_default_stack))
+#define WSTACK_IS_STATIC(s) (s.wstart == WSTK_DEF_STACK(s)))
-#define WSTACK_PUSH(s, x) \
-do { \
- if (WSTK_CONCAT(s,_sp) == WSTK_CONCAT(s,_end)) { \
- erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \
- &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \
- } \
- *WSTK_CONCAT(s,_sp)++ = (x); \
+#define WSTACK_PUSH(s, x) \
+do { \
+ if (s.wsp == s.wend) { \
+ erl_grow_wstack(&s, WSTK_DEF_STACK(s)); \
+ } \
+ *s.wsp++ = (x); \
} while(0)
-#define WSTACK_PUSH2(s, x, y) \
-do { \
- if (WSTK_CONCAT(s,_sp) > WSTK_CONCAT(s,_end) - 2) { \
- erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \
- &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \
- } \
- *WSTK_CONCAT(s,_sp)++ = (x); \
- *WSTK_CONCAT(s,_sp)++ = (y); \
+#define WSTACK_PUSH2(s, x, y) \
+do { \
+ if (s.wsp > s.wend - 2) { \
+ erl_grow_wstack(&s, WSTK_DEF_STACK(s)); \
+ } \
+ *s.wsp++ = (x); \
+ *s.wsp++ = (y); \
} while(0)
-#define WSTACK_PUSH3(s, x, y, z) \
-do { \
- if (WSTK_CONCAT(s,_sp) > WSTK_CONCAT(s,_end) - 3) { \
- erl_grow_wstack(WSTK_CONCAT(s,_alloc_type), &WSTK_CONCAT(s,_start), \
- &WSTK_CONCAT(s,_sp), &WSTK_CONCAT(s,_end)); \
- } \
- *WSTK_CONCAT(s,_sp)++ = (x); \
- *WSTK_CONCAT(s,_sp)++ = (y); \
- *WSTK_CONCAT(s,_sp)++ = (z); \
+#define WSTACK_PUSH3(s, x, y, z) \
+do { \
+ if (s.wsp > s.wend - 3) { \
+ erl_grow_wstack(&s, WSTK_DEF_STACK(s)); \
+ } \
+ *s.wsp++ = (x); \
+ *s.wsp++ = (y); \
+ *s.wsp++ = (z); \
} while(0)
-#define WSTACK_COUNT(s) (WSTK_CONCAT(s,_sp) - WSTK_CONCAT(s,_start))
+#define WSTACK_COUNT(s) (s.wsp - s.wstart)
+#define WSTACK_ISEMPTY(s) (s.wsp == s.wstart)
+#define WSTACK_POP(s) (*(--s.wsp))
-#define WSTACK_ISEMPTY(s) (WSTK_CONCAT(s,_sp) == WSTK_CONCAT(s,_start))
-#define WSTACK_POP(s) (*(--WSTK_CONCAT(s,_sp)))
/* binary.c */
@@ -921,7 +923,8 @@ char *erts_convert_filename_to_encoding(Eterm name, char *statbuf,
ErtsAlcType_t alloc_type,
int allow_empty, int allow_atom,
int encoding,
- Sint *used /* out */);
+ Sint *used /* out */,
+ Uint extra);
char* erts_convert_filename_to_wchar(byte* bytes, Uint size,
char *statbuf, size_t statbuf_size,
ErtsAlcType_t alloc_type, Sint* used,
diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index d4623c0450..49af86b36a 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -7061,7 +7061,7 @@ void *driver_dl_open(char * path)
int res;
int *last_error_p = erts_smp_tsd_get(driver_list_last_error_key);
int locked = maybe_lock_driver_list();
- if ((res = erts_sys_ddll_open(path, &ptr)) == 0) {
+ if ((res = erts_sys_ddll_open(path, &ptr, NULL)) == 0) {
maybe_unlock_driver_list(locked);
return ptr;
} else {
diff --git a/erts/emulator/beam/sys.h b/erts/emulator/beam/sys.h
index 31252ed78f..189d9ebac8 100644
--- a/erts/emulator/beam/sys.h
+++ b/erts/emulator/beam/sys.h
@@ -279,18 +279,21 @@ typedef unsigned long UWord;
typedef long SWord;
#define SWORD_CONSTANT(Const) Const##L
#define UWORD_CONSTANT(Const) Const##UL
+#define ERTS_UWORD_MAX ULONG_MAX
#define ERTS_SWORD_MAX LONG_MAX
#elif SIZEOF_VOID_P == SIZEOF_INT
typedef unsigned int UWord;
typedef int SWord;
#define SWORD_CONSTANT(Const) Const
#define UWORD_CONSTANT(Const) Const##U
+#define ERTS_UWORD_MAX UINT_MAX
#define ERTS_SWORD_MAX INT_MAX
#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG
typedef unsigned long long UWord;
typedef long long SWord;
#define SWORD_CONSTANT(Const) Const##LL
#define UWORD_CONSTANT(Const) Const##ULL
+#define ERTS_UWORD_MAX ULLONG_MAX
#define ERTS_SWORD_MAX LLONG_MAX
#else
#error Found no appropriate type to use for 'Eterm', 'Uint' and 'Sint'
@@ -304,6 +307,7 @@ typedef unsigned long Uint;
typedef long Sint;
#define SWORD_CONSTANT(Const) Const##L
#define UWORD_CONSTANT(Const) Const##UL
+#define ERTS_UWORD_MAX ULONG_MAX
#define ERTS_SWORD_MAX LONG_MAX
#define ERTS_SIZEOF_ETERM SIZEOF_LONG
#define ErtsStrToSint strtol
@@ -313,6 +317,7 @@ typedef unsigned int Uint;
typedef int Sint;
#define SWORD_CONSTANT(Const) Const
#define UWORD_CONSTANT(Const) Const##U
+#define ERTS_UWORD_MAX UINT_MAX
#define ERTS_SWORD_MAX INT_MAX
#define ERTS_SIZEOF_ETERM SIZEOF_INT
#define ErtsStrToSint strtol
@@ -322,6 +327,7 @@ typedef unsigned long long Uint;
typedef long long Sint;
#define SWORD_CONSTANT(Const) Const##LL
#define UWORD_CONSTANT(Const) Const##ULL
+#define ERTS_UWORD_MAX ULLONG_MAX
#define ERTS_SWORD_MAX LLONG_MAX
#define ERTS_SIZEOF_ETERM SIZEOF_LONG_LONG
#if defined(__WIN32__)
@@ -661,8 +667,7 @@ typedef struct {
#define ERTS_SYS_DDLL_ERROR_INIT {NULL}
extern void erts_sys_ddll_free_error(ErtsSysDdllError*);
extern void erl_sys_ddll_init(void); /* to initialize mutexes etc */
-extern int erts_sys_ddll_open2(const char *path, void **handle, ErtsSysDdllError*);
-#define erts_sys_ddll_open(P,H) erts_sys_ddll_open2(P,H,NULL)
+extern int erts_sys_ddll_open(const char *path, void **handle, ErtsSysDdllError*);
extern int erts_sys_ddll_open_noext(char *path, void **handle, ErtsSysDdllError*);
extern int erts_sys_ddll_load_driver_init(void *handle, void **function);
extern int erts_sys_ddll_load_nif_init(void *handle, void **function,ErtsSysDdllError*);
diff --git a/erts/emulator/beam/utils.c b/erts/emulator/beam/utils.c
index 297c4bf439..e0776cf67d 100644
--- a/erts/emulator/beam/utils.c
+++ b/erts/emulator/beam/utils.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 1996-2013. All Rights Reserved.
+ * Copyright Ericsson AB 1996-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -185,39 +185,41 @@ erts_set_hole_marker(Eterm* ptr, Uint sz)
* Helper function for the ESTACK macros defined in global.h.
*/
void
-erl_grow_stack(ErtsAlcType_t a_type, Eterm** start, Eterm** sp, Eterm** end)
+erl_grow_estack(ErtsEStack* s, Eterm* default_estack)
{
- Uint old_size = (*end - *start);
+ Uint old_size = (s->end - s->start);
Uint new_size = old_size * 2;
- Uint sp_offs = *sp - *start;
- if (new_size > 2 * DEF_ESTACK_SIZE) {
- *start = erts_realloc(a_type, (void *) *start, new_size*sizeof(Eterm));
+ Uint sp_offs = s->sp - s->start;
+ if (s->start != default_estack) {
+ s->start = erts_realloc(s->alloc_type, s->start,
+ new_size*sizeof(Eterm));
} else {
- Eterm* new_ptr = erts_alloc(a_type, new_size*sizeof(Eterm));
- sys_memcpy(new_ptr, *start, old_size*sizeof(Eterm));
- *start = new_ptr;
+ Eterm* new_ptr = erts_alloc(s->alloc_type, new_size*sizeof(Eterm));
+ sys_memcpy(new_ptr, s->start, old_size*sizeof(Eterm));
+ s->start = new_ptr;
}
- *end = *start + new_size;
- *sp = *start + sp_offs;
+ s->end = s->start + new_size;
+ s->sp = s->start + sp_offs;
}
/*
- * Helper function for the ESTACK macros defined in global.h.
+ * Helper function for the WSTACK macros defined in global.h.
*/
void
-erl_grow_wstack(ErtsAlcType_t a_type, UWord** start, UWord** sp, UWord** end)
+erl_grow_wstack(ErtsWStack* s, UWord* default_wstack)
{
- Uint old_size = (*end - *start);
+ Uint old_size = (s->wend - s->wstart);
Uint new_size = old_size * 2;
- Uint sp_offs = *sp - *start;
- if (new_size > 2 * DEF_ESTACK_SIZE) {
- *start = erts_realloc(a_type, (void *) *start, new_size*sizeof(UWord));
+ Uint sp_offs = s->wsp - s->wstart;
+ if (s->wstart != default_wstack) {
+ s->wstart = erts_realloc(s->alloc_type, s->wstart,
+ new_size*sizeof(UWord));
} else {
- UWord* new_ptr = erts_alloc(a_type, new_size*sizeof(UWord));
- sys_memcpy(new_ptr, *start, old_size*sizeof(UWord));
- *start = new_ptr;
+ UWord* new_ptr = erts_alloc(s->alloc_type, new_size*sizeof(UWord));
+ sys_memcpy(new_ptr, s->wstart, old_size*sizeof(UWord));
+ s->wstart = new_ptr;
}
- *end = *start + new_size;
- *sp = *start + sp_offs;
+ s->wend = s->wstart + new_size;
+ s->wsp = s->wstart + sp_offs;
}
/* CTYPE macros */
@@ -2686,11 +2688,6 @@ tailrecur_ne:
{
FloatDef f1, f2;
Eterm big;
-#if HEAP_ON_C_STACK
- Eterm big_buf[CMP_TMP_HEAP_SIZE]; /* If HEAP_ON_C_STACK */
-#else
- Eterm *big_buf = erts_get_scheduler_data()->cmp_tmp_heap;
-#endif
#if HALFWORD_HEAP
Wterm aw = is_immed(a) ? a : rterm2wterm(a,a_base);
Wterm bw = is_immed(b) ? b : rterm2wterm(b,b_base);
@@ -2701,6 +2698,8 @@ tailrecur_ne:
#define MAX_LOSSLESS_FLOAT ((double)((1LL << 53) - 2))
#define MIN_LOSSLESS_FLOAT ((double)(((1LL << 53) - 2)*-1))
#define BIG_ARITY_FLOAT_MAX (1024 / D_EXP) /* arity of max float as a bignum */
+ Eterm big_buf[BIG_NEED_SIZE(BIG_ARITY_FLOAT_MAX)];
+
b_tag = tag_val_def(bw);
switch(_NUMBER_CODE(a_tag, b_tag)) {
@@ -2716,8 +2715,9 @@ tailrecur_ne:
/* Float is within the no loss limit */
f1.fd = signed_val(aw);
j = float_comp(f1.fd, f2.fd);
+ }
#if ERTS_SIZEOF_ETERM == 8
- } else if (f2.fd > (double) (MAX_SMALL + 1)) {
+ else if (f2.fd > (double) (MAX_SMALL + 1)) {
/* Float is a positive bignum, i.e. bigger */
j = -1;
} else if (f2.fd < (double) (MIN_SMALL - 1)) {
@@ -2728,7 +2728,7 @@ tailrecur_ne:
j = signed_val(aw) - (Sint) f2.fd;
}
#else
- } else {
+ else {
/* If float is positive it is bigger than small */
j = (f2.fd > 0.0) ? -1 : 1;
}
@@ -2762,8 +2762,8 @@ tailrecur_ne:
j = float_comp(f1.fd, f2.fd);
}
} else {
- big = double_to_big(f2.fd, big_buf);
- j = big_comp(aw, big);
+ big = double_to_big(f2.fd, big_buf, sizeof(big_buf)/sizeof(Eterm));
+ j = big_comp(aw, rterm2wterm(big,big_buf));
}
if (_NUMBER_CODE(a_tag, b_tag) == FLOAT_BIG) {
j = -j;
@@ -2775,8 +2775,9 @@ tailrecur_ne:
/* Float is within the no loss limit */
f2.fd = signed_val(bw);
j = float_comp(f1.fd, f2.fd);
+ }
#if ERTS_SIZEOF_ETERM == 8
- } else if (f1.fd > (double) (MAX_SMALL + 1)) {
+ else if (f1.fd > (double) (MAX_SMALL + 1)) {
/* Float is a positive bignum, i.e. bigger */
j = 1;
} else if (f1.fd < (double) (MIN_SMALL - 1)) {
@@ -2787,7 +2788,7 @@ tailrecur_ne:
j = (Sint) f1.fd - signed_val(bw);
}
#else
- } else {
+ else {
/* If float is positive it is bigger than small */
j = (f1.fd > 0.0) ? 1 : -1;
}
@@ -2846,7 +2847,7 @@ pop_next:
return 0;
not_equal:
- DESTROY_ESTACK(stack);
+ DESTROY_WSTACK(stack);
return j;
#undef CMP_NODES
diff --git a/erts/emulator/drivers/common/efile_drv.c b/erts/emulator/drivers/common/efile_drv.c
index 8de578d8b7..dca979c13a 100644
--- a/erts/emulator/drivers/common/efile_drv.c
+++ b/erts/emulator/drivers/common/efile_drv.c
@@ -111,7 +111,6 @@
#include "erl_driver.h"
#include "erl_efile.h"
#include "erl_threads.h"
-#include "zlib.h"
#include "gzio.h"
#include "dtrace-wrapper.h"
#include <ctype.h>
@@ -818,7 +817,7 @@ file_start(ErlDrvPort port, char* command)
static void do_close(int flags, SWord fd) {
if (flags & EFILE_COMPRESSED) {
- erts_gzclose((gzFile)(fd));
+ erts_gzclose((ErtsGzFile)(fd));
} else {
efile_closefile((int) fd);
}
@@ -1136,7 +1135,7 @@ static void invoke_read(void *data)
}
read_size = size;
if (d->flags & EFILE_COMPRESSED) {
- read_size = erts_gzread((gzFile)d->fd,
+ read_size = erts_gzread((ErtsGzFile)d->fd,
d->c.read.binp->orig_bytes + d->c.read.bin_offset,
size);
status = (read_size != (size_t) -1);
@@ -1209,7 +1208,7 @@ static void invoke_read_line(void *data)
size = need - d->c.read_line.read_size;
}
if (d->flags & EFILE_COMPRESSED) {
- read_size = erts_gzread((gzFile)d->fd,
+ read_size = erts_gzread((ErtsGzFile)d->fd,
d->c.read_line.binp->orig_bytes +
d->c.read_line.read_offset + d->c.read_line.read_size,
size);
@@ -1250,7 +1249,7 @@ static void invoke_read_line(void *data)
d->c.read_line.read_size -= too_much;
ASSERT(d->c.read_line.read_size >= 0);
if (d->flags & EFILE_COMPRESSED) {
- Sint64 location = erts_gzseek((gzFile)d->fd,
+ Sint64 location = erts_gzseek((ErtsGzFile)d->fd,
-((Sint64) too_much), EFILE_SEEK_CUR);
if (location == -1) {
d->result_ok = 0;
@@ -1535,7 +1534,7 @@ static void invoke_writev(void *data) {
*/
errno = EINVAL;
if (! (status =
- erts_gzwrite((gzFile)d->fd,
+ erts_gzwrite((ErtsGzFile)d->fd,
iov[i].iov_base,
iov[i].iov_len)) == iov[i].iov_len) {
d->errInfo.posix_errno =
@@ -1797,7 +1796,7 @@ static void invoke_lseek(void *data)
d->errInfo.posix_errno = EINVAL;
status = 0;
} else {
- d->c.lseek.location = erts_gzseek((gzFile)d->fd,
+ d->c.lseek.location = erts_gzseek((ErtsGzFile)d->fd,
offset, d->c.lseek.origin);
if (d->c.lseek.location == -1) {
d->errInfo.posix_errno = errno;
@@ -1885,7 +1884,7 @@ static void invoke_open(void *data)
if (status || (d->errInfo.posix_errno != EISDIR)) {
mode = (d->flags & EFILE_MODE_READ) ? "rb" : "wb";
d->fd = (SWord) erts_gzopen(d->b, mode);
- if ((gzFile)d->fd) {
+ if ((ErtsGzFile)d->fd) {
status = 1;
} else {
if (errno == 0) {
diff --git a/erts/emulator/drivers/common/gzio.c b/erts/emulator/drivers/common/gzio.c
index e085c262b0..653f3954b1 100644
--- a/erts/emulator/drivers/common/gzio.c
+++ b/erts/emulator/drivers/common/gzio.c
@@ -77,7 +77,7 @@ typedef struct gz_stream {
* this structure. */
} gz_stream;
-local gzFile gz_open OF((const char *path, const char *mode));
+local ErtsGzFile gz_open OF((const char *path, const char *mode));
local int get_byte OF((gz_stream *s));
local void check_header OF((gz_stream *s));
local int destroy OF((gz_stream *s));
@@ -144,7 +144,7 @@ local uLong getLong OF((gz_stream *s));
can be checked to distinguish the two cases (if errno is zero, the
zlib error is Z_MEM_ERROR).
*/
-local gzFile gz_open (path, mode)
+local ErtsGzFile gz_open (path, mode)
const char *path;
const char *mode;
{
@@ -179,7 +179,7 @@ local gzFile gz_open (path, mode)
s->path = (char*)ALLOC(FILENAME_BYTELEN(path)+FILENAME_CHARSIZE);
if (s->path == NULL) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
FILENAME_COPY(s->path, path); /* do this early for debugging */
@@ -197,7 +197,7 @@ local gzFile gz_open (path, mode)
} while (*p++ && m < fmode + sizeof(fmode) - 1);
*m = '\0';
if (s->mode == '\0')
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
if (s->mode == 'w') {
err = deflateInit2(&(s->stream), level,
@@ -207,7 +207,7 @@ local gzFile gz_open (path, mode)
s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
if (err != Z_OK || s->outbuf == Z_NULL) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
} else {
/*
@@ -221,7 +221,7 @@ local gzFile gz_open (path, mode)
s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
if (err != Z_OK || s->inbuf == Z_NULL) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
}
s->stream.avail_out = Z_BUFSIZE;
@@ -229,17 +229,16 @@ local gzFile gz_open (path, mode)
errno = 0;
#if defined(FILENAMES_16BIT)
{
- char wfmode[160];
- int i=0,j;
- for(j=0;fmode[j] != '\0';++j) {
- wfmode[i++]=fmode[j];
- wfmode[i++]='\0';
+ WCHAR wfmode[80];
+ int i = 0;
+ int j;
+ for(j = 0; fmode[j] != '\0'; ++j) {
+ wfmode[i++] = (WCHAR) fmode[j];
}
- wfmode[i++] = '\0';
- wfmode[i++] = '\0';
- s->file = F_OPEN(path, wfmode);
+ wfmode[i++] = L'\0';
+ s->file = _wfopen((WCHAR *)path, wfmode);
if (s->file == NULL) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
}
#elif defined(UNIX)
@@ -249,18 +248,18 @@ local gzFile gz_open (path, mode)
s->file = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
}
if (s->file == -1) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
#else
- s->file = F_OPEN(path, fmode);
+ s->file = fopen(path, fmode);
if (s->file == NULL) {
- return s->destroy(s), (gzFile)Z_NULL;
+ return s->destroy(s), (ErtsGzFile)Z_NULL;
}
#endif
if (s->mode == 'r') {
check_header(s); /* skip the .gz header */
}
- return (gzFile)s;
+ return (ErtsGzFile)s;
}
/* ===========================================================================
@@ -296,7 +295,7 @@ local int gz_rewind (gz_stream *s)
/* ===========================================================================
Opens a gzip (.gz) file for reading or writing.
*/
-gzFile erts_gzopen (path, mode)
+ErtsGzFile erts_gzopen (path, mode)
const char *path;
const char *mode;
{
@@ -447,7 +446,7 @@ local int destroy (s)
gzread returns the number of bytes actually read (0 for end of file).
*/
int
-erts_gzread(gzFile file, voidp buf, unsigned len)
+erts_gzread(ErtsGzFile file, voidp buf, unsigned len)
{
gz_stream *s = (gz_stream*)file;
Bytef *start = buf; /* starting point for crc computation */
@@ -557,7 +556,7 @@ erts_gzread(gzFile file, voidp buf, unsigned len)
gzwrite returns the number of bytes actually written (0 in case of error).
*/
int
-erts_gzwrite(gzFile file, voidp buf, unsigned len)
+erts_gzwrite(ErtsGzFile file, voidp buf, unsigned len)
{
gz_stream *s = (gz_stream*)file;
@@ -593,7 +592,7 @@ erts_gzwrite(gzFile file, voidp buf, unsigned len)
*/
int
-erts_gzseek(gzFile file, int offset, int whence)
+erts_gzseek(ErtsGzFile file, int offset, int whence)
{
int pos;
gz_stream* s = (gz_stream *) file;
@@ -655,7 +654,7 @@ erts_gzseek(gzFile file, int offset, int whence)
degrade compression.
*/
int
-erts_gzflush(gzFile file, int flush)
+erts_gzflush(ErtsGzFile file, int flush)
{
uInt len;
int done = 0;
@@ -714,7 +713,7 @@ local uLong getLong (s)
and deallocates all the (de)compression state.
*/
int
-erts_gzclose(gzFile file)
+erts_gzclose(ErtsGzFile file)
{
int err;
gz_stream *s = (gz_stream*)file;
@@ -723,9 +722,9 @@ erts_gzclose(gzFile file)
if (s->mode == 'w') {
err = erts_gzflush (file, Z_FINISH);
- if (err != Z_OK) return s->destroy(file);
+ if (err != Z_OK) return s->destroy(s);
}
- return s->destroy(file);
+ return s->destroy(s);
}
diff --git a/erts/emulator/drivers/common/gzio.h b/erts/emulator/drivers/common/gzio.h
index 3f1e546140..ea50d922ec 100644
--- a/erts/emulator/drivers/common/gzio.h
+++ b/erts/emulator/drivers/common/gzio.h
@@ -17,11 +17,15 @@
* %CopyrightEnd%
*/
-gzFile erts_gzopen (const char *path, const char *mode);
-int erts_gzread(gzFile file, voidp buf, unsigned len);
-int erts_gzwrite(gzFile file, voidp buf, unsigned len);
-int erts_gzseek(gzFile, int, int);
-int erts_gzflush(gzFile file, int flush);
-int erts_gzclose(gzFile file);
+#include "zlib.h"
+
+typedef struct erts_gzFile* ErtsGzFile;
+
+ErtsGzFile erts_gzopen (const char *path, const char *mode);
+int erts_gzread(ErtsGzFile file, voidp buf, unsigned len);
+int erts_gzwrite(ErtsGzFile file, voidp buf, unsigned len);
+int erts_gzseek(ErtsGzFile, int, int);
+int erts_gzflush(ErtsGzFile file, int flush);
+int erts_gzclose(ErtsGzFile file);
ErlDrvBinary* erts_gzinflate_buffer(char*, uLong);
ErlDrvBinary* erts_gzdeflate_buffer(char*, uLong);
diff --git a/erts/emulator/drivers/common/gzio_zutil.h b/erts/emulator/drivers/common/gzio_zutil.h
index 00eccc80fc..854205cc2c 100644
--- a/erts/emulator/drivers/common/gzio_zutil.h
+++ b/erts/emulator/drivers/common/gzio_zutil.h
@@ -23,12 +23,6 @@
* that may change or not exist at all.
*/
-#ifndef HAVE_LIBZ
-/* Use our "real" copy of zutil.h if we don't use shared zlib */
-#include "zutil.h"
-
-#else /* HAVE_LIBZ: Shared zlib is used */
-
#define local static
#define DEF_MEM_LEVEL 8
#define zmemcpy sys_memcpy
@@ -77,6 +71,3 @@
# define OS_CODE 0x03 /* assume Unix */
#endif
-
-#endif /* HAVE_LIBZ */
-
diff --git a/erts/emulator/drivers/common/inet_drv.c b/erts/emulator/drivers/common/inet_drv.c
index 978a766de9..4a861b121c 100644
--- a/erts/emulator/drivers/common/inet_drv.c
+++ b/erts/emulator/drivers/common/inet_drv.c
@@ -854,9 +854,10 @@ static int my_strncasecmp(const char *s1, const char *s2, size_t n)
#define INET_IFNAMSIZ 16
/* INET Ignore states */
-#define INET_IGNORE_NONE 0
-#define INET_IGNORE_READ 1
-#define INET_IGNORE_WRITE 1 << 1
+#define INET_IGNORE_NONE 0
+#define INET_IGNORE_READ (1 << 0)
+#define INET_IGNORE_WRITE (1 << 1)
+#define INET_IGNORE_PASSIVE (1 << 2)
/* Max length of Erlang Term Buffer (for outputting structured terms): */
#ifdef HAVE_SCTP
@@ -1490,8 +1491,8 @@ static int load_ip_and_port
unsigned int alen = len;
char abuf [len];
int res = inet_get_address(abuf, (inet_address*) addr, &alen);
- ASSERT(res==0);
- res = 0;
+ ASSERT(res==0); (void)res;
+
/* Now "abuf" contains: Family(1b), Port(2b), IP(4|16b) */
/* NB: the following functions are safe to use, as they create tuples
@@ -8307,11 +8308,19 @@ static ErlDrvSSizeT inet_ctl(inet_descriptor* desc, int cmd, char* buf,
if (*buf == 1 && !desc->is_ignored) {
sock_select(desc, (FD_READ|FD_WRITE|FD_CLOSE|ERL_DRV_USE_NO_CALLBACK), 0);
- desc->is_ignored = INET_IGNORE_READ;
+ if (desc->active)
+ desc->is_ignored = INET_IGNORE_READ;
+ else
+ desc->is_ignored = INET_IGNORE_PASSIVE;
} else if (*buf == 0 && desc->is_ignored) {
- int flags = (FD_READ|FD_CLOSE|((desc->is_ignored & INET_IGNORE_WRITE)?FD_WRITE:0));
+ int flags = FD_CLOSE;
+ if (desc->is_ignored & INET_IGNORE_READ)
+ flags |= FD_READ;
+ if (desc->is_ignored & INET_IGNORE_WRITE)
+ flags |= FD_WRITE;
desc->is_ignored = INET_IGNORE_NONE;
- sock_select(desc, flags, 1);
+ if (flags != FD_CLOSE)
+ sock_select(desc, flags, 1);
} else
return ctl_error(EINVAL, rbuf, rsize);
@@ -8988,6 +8997,8 @@ static ErlDrvSSizeT tcp_inet_ctl(ErlDrvData e, unsigned int cmd,
driver_set_timer(desc->inet.port, timeout);
if (!INETP(desc)->is_ignored)
sock_select(INETP(desc),(FD_READ|FD_CLOSE),1);
+ else
+ INETP(desc)->is_ignored |= INET_IGNORE_READ;
}
}
return ctl_reply(INET_REP_OK, tbuf, 2, rbuf, rsize);
diff --git a/erts/emulator/internal_doc/CarrierMigration.md b/erts/emulator/internal_doc/CarrierMigration.md
new file mode 100644
index 0000000000..b93c11c6ec
--- /dev/null
+++ b/erts/emulator/internal_doc/CarrierMigration.md
@@ -0,0 +1,201 @@
+Carrier Migration
+=================
+
+The ERTS memory allocators manage memory blocks in two types of raw
+memory chunks. We call these chunks of raw memory
+*carriers*. Singleblock carriers which only contain one large block,
+and multiblock carriers which contain multiple blocks. A carrier is
+typically created using `mmap()` on unix systems. However, how a
+carrier is created is of minor importance. An allocator instance
+typically manages a mixture of single- and multiblock carriers.
+
+Problem
+-------
+
+When a carrier is empty, i.e. contains only one large free block, it
+is deallocated. Since multiblock carriers can contain both allocated
+blocks and free blocks at the same time, an allocator instance might
+be stuck with a large amount of poorly utilized carriers if the memory
+load decrease. After a peak in memory usage it is expected that not
+all memory can be returned since the blocks still allocated is likely
+to be dispersed over multiple carriers. Such poorly utilized carriers
+can usually be reused if the memory load increase again. However,
+since each scheduler thread manages its own set of allocator
+instances, and memory load is not necessarily connected to CPU load we
+might get into a situation where there are lots of poorly utilized
+multiblock carriers on some allocator instances while we need to
+allocate new multiblock carriers on other allocator instances. In
+scenarios like this, the demand for multiblock carriers in the system
+might increase at the same time as the actual memory demand in the
+system has decreased which is both unwanted and quite unexpected for
+the end user.
+
+Solution
+--------
+
+In order to prevent scenarios like this we've implemented support for
+migration of multiblock carriers between allocator instances of the
+same type.
+
+### Management of Free Blocks ###
+
+In order to be able to remove a carrier from one allocator instance
+and add it to another we need to be able to move references to the
+free blocks of the carrier between the allocator instances. The
+allocator instance specific data structure referring to the free
+blocks it manages often refers to the same carrier from multiple
+places. For example, when the address order bestfit strategy is used
+this data structure is a binary search tree spanning all carriers that
+the allocator instance manages. Free blocks in one specific carrier
+can be referred to from potentially every other carrier that is
+managed, and the amount of such references can be huge. That is, the
+work of removing the free blocks of such a carrier from the search
+tree will be huge. One way of solving this could be to not migrate
+carriers that contain lots of free blocks, but this would prevent us
+from migrating carriers that potentially needs to be migrated in order
+to solve the problem we set out to solve.
+
+By using one data structure of free blocks in each carrier and an
+allocator instance wide data structure of carriers managed by the
+allocator instance, the work needed in order to remove and add
+carriers can be kept to a minimum. When migration of carriers is
+enabled on a specific allocator type, we require that an allocation
+strategy with such an implementation is used. Currently we've
+implemented this for three different allocation strategies. All of
+these strategies use a search tree of carriers sorted so that we can
+find the carrier with the lowest address that can satisfy the
+request. Internally in carriers we use yet another search tree that
+either implement address order first fit, address order best fit,
+or best fit. The abbreviations used for these different allocation
+strategies are `aoff`, and `aoffcaobf`, `aoffcbf`.
+
+### Carrier Pool ###
+
+In order to migrate carriers between allocator instances we move them
+through a pool of carriers. In order for a carrier migration to
+complete, one scheduler needs to move the carrier into the pool, and
+another scheduler needs to take the carrier out of the pool.
+
+The pool is implemented as a lock free, circular, double linked,
+list. The list contains a sentinel which is used as the starting point
+when inserting to, or fetching from the pool. Carriers in the pool are
+elements in this list.
+
+The list can be modified by all scheduler threads
+simultaneously. During modifications the double linked list is allowed
+to get a bit "out of shape". For example, following the `next` pointer
+to the next element and then following the `prev` pointer does not
+always take you back to were you started. The following is however
+always true:
+
+* Repeatedly following `next` pointers will eventually take you to the
+ sentinel.
+* Repeatedly following `prev` pointers will eventually take you to the
+ sentinel.
+* Following a `next` or a `prev` pointer will take you to either an
+ element in the pool, or an element that used to be in the pool.
+
+When inserting a new element we search for a place to insert the
+element by only following `next` pointers, and we always begin by
+skipping the first element encountered. When trying to fetch an
+element we do the same thing, but instead only follow `prev` pointers.
+
+By going different directions when inserting and fetching, we avoid
+contention between threads inserting and threads fetching as much as
+possible. By skipping one element when we begin searching, we preserve
+the sentinel unmodified as much as possible. This is beneficial since
+all search operations need to read the content of the sentinel. If we
+were to modify the sentinel, the cache line containing the sentinel
+would unnecessarily be bounced between processors.
+
+The `prev`, and `next` fields in the elements of the list contains the
+value of the pointer, a modification marker, and a deleted
+marker. Memory operations on these fields are done using atomic memory
+operations. When a thread has set the modification marker in a field,
+no-one except the thread that set the marker is allowed to modify the
+field. If multiple modification markers needs to be set, we always
+begin with `next` fields followed by `prev` fields in the order
+following the actual pointers. This guarantees that no deadlocks will
+occur.
+
+When a carrier is being removed from a pool, we mark it with a thread
+progress value that needs to be reached before we are allowed to
+modify the `next`, and `prev` fields. That is, until we reach this
+thread progress we are not allowed to insert the carrier into the pool
+again, and we are not allowed to deallocate the carrier. This ensures
+that threads inspecting the pool always will be able to traverse the
+pool and reach valid elements. Once we have reached the thread
+progress value that the carrier was tagged with, we know that no
+threads may have references to it via the pool.
+
+### Migration ###
+
+There exist one pool for each allocator type enabling migration of
+carriers between scheduler specific allocator instances of the same
+allocator type.
+
+Each allocator instance keeps track of the current utilization of its
+multiblock carriers. When the utilization falls below the "abandon
+carrier utilization limit" it starts to inspect the utilization of the
+current carrier when deallocations are made. If also the utilization
+of the carrier falls below the "abandon carrier utilization limit" it
+unlinks the carrier from its data structure of available free blocks
+and inserts the carrier into the pool.
+
+Since the carrier has been unlinked from the data structure of
+available free blocks, no more allocations will be made in the
+carrier. The allocator instance putting the carrier into the pool,
+however, still has the responsibility of performing deallocations in
+it while it remains in the pool.
+
+Each carrier has a flag field containing information about allocator
+instance owning the carrier, a flag indicating if the carrier is in
+the pool or not, and a flag indicating if it is busy or not. When the
+carrier is in the pool, the owning allocator instance needs to mark it
+as busy while operating on it. If another thread inspects it in order
+to try to fetch it from the pool, it will abort the fetch if it is
+busy. When fetching the carrier from the pool, ownership will changed
+and further deallocations in the carrier will be redirected to the new
+owner using the delayed dealloc functionality.
+
+If a carrier in the pool becomes empty, it will be withdrawn from the
+pool. All carriers that become empty are also always passed to its
+originating allocator instance for deallocation using the delayed
+dealloc functionality. Since carriers this way always will be
+deallocated by the allocator instance that allocated the carrier the
+underlying functionality of allocating and deallocating carriers can
+remain simple and doesn't have to bother about multiple threads. In a
+NUMA system we will also not mix carriers originating from multiple
+NUMA nodes.
+
+When an allocator instance needs more carrier space, it always begins
+by inspecting its own carriers that are waiting for thread progress
+before they can be deallocated. If no such carrier could be found, it
+then inspects the pool. If no carrier could be fetched from the pool,
+it will allocate a new carrier. Regardless of where the allocator
+instance gets the carrier from it the just links in the carrier into
+its data structure of free blocks.
+
+### Result ###
+
+The use of this strategy of abandoning carriers with poor utilization
+and reusing these in allocator instances with an increased carrier
+demand is extremely effective and completely eliminates the problems
+that otherwise sometimes occurred when CPU load dropped while memory
+load did not.
+
+When using the `aoffcaobf` or `aoff` strategies compared to `gf` or
+`bf`, we loose some performance since we get more modifications in the
+data structure of free blocks. This performance penalty is however
+reduced using the `aoffcbf` strategy. A tradeoff between memory
+consumption and performance is however inevitable, and it is up to
+the user to decide what is most important.
+
+Further work
+------------
+
+It would be quite easy to extend this to allow migration of multiblock
+carriers between all allocator types. More or less the only obstacle
+is maintenance of the statistics information.
+
+
diff --git a/erts/emulator/internal_doc/CodeLoading.md b/erts/emulator/internal_doc/CodeLoading.md
new file mode 100644
index 0000000000..151b9cd57c
--- /dev/null
+++ b/erts/emulator/internal_doc/CodeLoading.md
@@ -0,0 +1,186 @@
+Non-Blocking Code Loading
+=========================
+
+Introduction
+------------
+
+Before OTP R16 when an Erlang code module was loaded, all other
+execution in the VM were halted while the load operation was carried
+out in single threaded mode. This might not be a big problem for
+initial loading of modules during VM boot, but it can be a severe
+problem for availability when upgrading modules or adding new code on
+a VM with running payload. This problem grows with the number of cores
+as both the time it takes to wait for all schedulers to stop increases
+as well as the potential amount of halted ongoing work.
+
+In OTP R16, modules are loaded without blocking the VM.
+Erlang processes may continue executing undisturbed in parallel during
+the entire load operation. The code loading is carried out by a normal
+Erlang process that is scheduled like all the others. The load
+operation is completed by making the loaded code visible to all
+processes in a consistent way with one single atomic
+instruction. Non-blocking code loading will improve real-time
+characteristics when modules are loaded/upgraded on a running SMP
+system.
+
+
+The Load Phases
+---------------
+
+The loading of a module is divided into two phases; a *prepare phase*
+and a *finishing phase*. The prepare phase contains reading the BEAM
+file format and all the preparations of the loaded code that can
+easily be done without interference with the running code. The
+finishing phase will make the loaded (and prepared) code accessible
+from the running code. Old module versions (replaced or deleted) will
+also be made inaccessible by the finishing phase.
+
+The prepare phase is designed to allow several "loader" processes to
+prepare separate modules in parallel while the finishing phase can
+only be done by one loader process at a time. A second loader process
+trying to enter finishing phase will be suspended until the first
+loader is done. This will only block the process, the scheduler is
+free to schedule other work while the second loader is waiting. (See
+`erts_try_seize_code_write_permission` and
+`erts_release_code_write_permission`).
+
+The ability to prepare several modules in parallel is not currently
+used as almost all code loading is serialized by the code_server
+process. The BIF interface is however prepared for this.
+
+ erlang:prepare_loading(Module, Code) -> LoaderState
+ erlang:finish_loading([LoaderState])
+
+The idea is that `prepare_loading` could be called in parallel for
+different modules and returns a "magic binary" containing the internal
+state of each prepared module. Function `finish_loading` could take a
+list of such states and do the finishing of all of them in one go.
+
+Currenlty we use the legacy BIF `erlang:load_module` which is now
+implemented in Erlang by calling the above two functions in
+sequence. Function `finish_loading` is limited to only accepts a list
+with one module state as we do not yet use the multi module loading
+feature.
+
+
+The Finishing Sequence
+----------------------
+
+During VM execution, code is accessed through a number of data
+structures. These *code access structures* are
+
+* Export table. One entry for every exported function.
+* Module table. One entry for each loaded module.
+* "beam_catches". Identifies jump destinations for catch instructions.
+* "beam_ranges". Map code address to function and line in source file.
+
+The most frequently used of these structures is the export table that
+is accessed in run time for every executed external function call to
+get the address of the callee. For performance reasons, we want to
+access all these structures without any overhead from thread
+synchronization. Earlier this was solved with an emergency break. Stop
+the entire VM to mutate these code access structures, otherwise treat
+them as read-only.
+
+The solution in R16 is instead to *replicate* the code access
+structures. We have one set of active structures read by the running
+code. When new code is loaded the active structures are copied, the
+copy is updated to include the newly loaded module and then a switch
+is made to make the updated copy the new active set. The active set is
+identified by a single global atomic variable
+`the_active_code_index`. The switch can thus be made by a single
+atomic write operation. The running code have to read this atomic
+variable when using the active access structures, which means one
+atomic read operation per external function call for example. The
+performance penalty from this extra atomic read is however very small
+as it can be done without any memory barriers at all (as described
+below). With this solution we also preserve the transactional feature
+of a load operation. Running code will never see the intermediate
+result of a half loaded module.
+
+The finishing phase is carried out in the following sequence by the
+BIF `erlang:finish_loading`:
+
+1. Seize exclusive code write permission (suspend process if needed
+ until we get it).
+
+2. Make a full copy of all the active access structures. This copy is
+ called the staging area and is identified by the global atomic
+ variable `the_staging_code_index`.
+
+3. Update all access structures in the staging area to include the
+ newly prepared module.
+
+4. Schedule a thread progress event. That is a time in the future when
+ all schedulers have yielded and executed a full memory barrier.
+
+5. Suspend the loader process.
+
+6. After thread progress, commit the staging area by assigning
+ `the_staging_code_index` to `the_active_code_index`.
+
+7. Release the code write permission allowing other processes to stage
+ new code.
+
+8. Resume the loader process allowing it to return from
+ `erlang:finish_loading`.
+
+
+### Thread Progress
+
+The waiting for thread progress in 4-6 is necessary in order for
+processes to read `the_active_code_index` atomic during normal
+execution without any expensive memory barriers. When we write a new
+value into `the_active_code_index` in step 6, we know that all
+schedulers will see an updated and consistent view of all the new
+active access structures once they become reachable through
+`the_active_code_index`.
+
+The total lack of memory barrier when reading `the_active_code_index`
+has one interesting consequence however. Different processes may see
+the new code at different point in time depending on when different
+cores happen to refresh their hardware caches. This may sound unsafe
+but it actually does not matter. The only property we must guarantee
+is that the ability to see the new code must spread with process
+communication. After receiving a message that was triggered by new
+code, the receiver must be guaranteed to also see the new code. This
+will be guaranteed as all types of process communication involves
+memory barriers in order for the receiver to be sure to read what the
+sender has written. This implicit memory barrier will then also make
+sure that the receiver reads the new value of `the_active_code_index`
+and thereby also sees the new code. This is true for all kinds of
+inter process communication (TCP, ETS, process name registering,
+tracing, drivers, NIFs, etc) not just Erlang messages.
+
+### Code Index Reuse
+
+To optimize the copy operation in step 2, code access structures are
+reused. In current solution we have three sets of code access
+structures, identified by a code index of 0, 1 and 2. These indexes
+are used in a round robin fashion. Instead of having to initialize a
+completely new copy of all access structures for every load operation
+we just have to update with the changes that have happened since the
+last two code load operations. We could get by with only two code
+indexes (0 and 1), but that would require yet another round of waiting
+for thread progress before step 2 in the `finish_loading` sequence. We
+cannot start reusing a code index as staging area until we know that
+no lingering scheduler thread is still using it as the active code
+index. With three generations of code indexes, the waiting for thread
+progress in step 4-6 will give this guarantee for us. Thread progress
+will wait for all running schedulers to reschedule at least one
+time. No ongoing execution reading code access structures reached from
+an old value of `the_active_code_index` can exist after a second round
+of thread progress.
+
+The design choice between two or three generations of code access
+structures is a trade-off between memory consumption and code loading
+latency.
+
+### A Consistent Code View
+
+Some native BIFs may need to get a consistent snapshot view of the
+active code. To do this it is important to only read
+`the_active_code_index` one time and then use that index value for all
+code accessing during the BIF. If a load operation is executed in
+parallel, reading `the_active_code_index` a second time might result
+in a different value, and thereby a different view of the code.
diff --git a/erts/emulator/internal_doc/DelayedDealloc.md b/erts/emulator/internal_doc/DelayedDealloc.md
new file mode 100644
index 0000000000..b7d87b839f
--- /dev/null
+++ b/erts/emulator/internal_doc/DelayedDealloc.md
@@ -0,0 +1,175 @@
+Delayed Dealloc
+===============
+
+Problem
+-------
+
+An easy way to handle memory allocation in a multi-threaded
+environment is to protect the memory allocator with a global lock
+which threads performing memory allocations or deallocations have to
+have locked during the whole operation. This solution of course scales
+very poorly, due to heavy lock contention. An improved solution of
+this scheme is to use multiple thread specific instances of such an
+allocator. That is, each thread allocates in its own allocator
+instance which is protected by a lock. In the general case references
+to memory need to be passed between threads. In the case where a
+thread that needs to deallocate memory that originates from another
+threads allocator instance a lock conflict is possible. In a system as
+the Erlang VM where memory allocation/deallocation is frequent and
+references to memory also are passed around between threads this
+solution will also scale poorly due to lock contention.
+
+Functionality Used to Adress This problem
+-----------------------------------------
+
+In order to reduce contention due to locking of allocator instances we
+introduced completely lock free instances tied to each scheduler
+thread, and an extra locked instance for other threads. The scheduler
+threads in the system is expected to do the major part of the
+work. Other threads may still be needed but should not perform any
+major and/or time critical work. The limited amount of contention that
+appears on the locked allocator instance can more or less be
+disregarded.
+
+Since we still need to be able to pass references to memory between
+scheduler threads we need some way to manage this. An allocator
+instance belonging to one scheduler thread is only allowed to be
+manipulated by that scheduler thread. When other threads need to
+deallocate memory originating from a foreign allocator instance, they
+only pass the memory block to a "message box" containing deallocation
+jobs attached to the originating allocator instance. When a scheduler
+thread detects such deallocation job it performs the actual
+deallocation.
+
+The "message box" is implemented using a lock free single linked list
+through the memory blocks to deallocate. The order of the elements in
+this list is not important. Insertion of new free blocks will be made
+somewhere near the end of this list. Requirering that the new blocks
+need to be inserted at the end would cause unnecessary contention when
+large amount of memory blocks are inserted simultaneous by multiple
+threads.
+
+The data structure refering to this single linked list cover two cache
+lines. One cache line containing information about the head of the
+list, and one cache line containing information about the tail of the
+list. This in order to reduce cache line ping ponging of this data
+structure. The head of the list will only be manipulated by the thread
+owning the allocator instance, and the tail will be manipulated by
+other threads inserting deallocation jobs.
+
+### Tail ###
+
+In the tail part of the data structure we find a pointer to the last
+element of the list, or at least something that is near the end of the
+list. In the uncontended case it will point to the end of the list,
+but when simultaneous insert operations are performed it will point to
+something near the end of the list.
+
+When insterting an element one will try to write a pointer to the new
+element in the next pointer of the element pointed to by the last
+pointer. This is done using an atomic compare and swap that expects
+the next pointer to be `NULL`. If this succeds the thread performing
+this operation moves the last pointer to point to the newly inserted
+element.
+
+If the atomic compare and swap described above failed, the last
+pointer didn't point to the last element. In this case we need to
+insert the new element somewhere inbetween the element that the last
+pointer pointed to and the actual last element. If we do it this way
+the last pointer will eventually end up at the last element when
+threads stop adding new elements. When trying to insert somewhere near
+the end and failing to do so, the inserting thread sometimes moves to
+the next element and somtimes tries with the same element again. This
+in order to spread the inserted elements during heavy contention. That
+is, we try to spread the modifications of memory to different
+locations instead of letting all threads continue to try to modify the
+same location in memory.
+
+### Head ###
+
+The head contains pointers to begining of the list (`head.first`), and
+to the first block which other threads may refer to
+(`head.unref_end`). Blocks between these pointers are only refered to
+by the head part of the data structure which is only used by the
+thread owning the allocator instance. When these two pointers are not
+equal the thread owning the allocator instance deallocate block after
+block until `head.first` reach `head.unref_end`.
+
+We of course periodically need to move the `head.unref_end` closer to
+the end in order to be able to continue deallocating memory
+blocks. Since all threads inserting new elements in the linked list
+will enter the list using the last pointer we can use this
+knowledge. If we call `erts_thr_progress_later()` and wait until we
+have reached that thread progress we know that no managed threads can
+refer the elements up to the element pointed to by the last pointer at
+the time when we called `erts_thr_progress_later()`. This since, all
+managed threads must have left the code implementing this at least
+once, and they always enters into the list via the last pointer. The
+`tail.next` field contains information about next `head.unref_end`
+pointer and thread progress that needs to be reached before we can
+move `head.unref_end`.
+
+Unfortunately not only threads managed by the thread progress
+functionality may insert memory blocks. Other threads also needs to be
+taken care of. Other threads will not be as frequent users of this
+functionality as managed threads, so using a less efficient scheme for
+them is not that big of a problem. In order to handle unmanaged
+threads we use two reference counters. When an unmanaged thread enters
+this implementation it increments the reference counter currently
+used, and when it leaves this implementation it decrements the same
+reference counter. When the consumer thread calls
+`erts_thr_progress_later()` in order to determine when it is safe to
+move `head.unref_end`, it also swaps reference counters for unmanaged
+threads. The previous current represents outstanding references from
+the time up to this point. The new current represents future reference
+following this point. When the consumer thread detects that we have
+both reached the desired thread progress and when the previous current
+reference counter reach zero it is safe to move the `head.unref_end`.
+
+The reason for using two reference counters is that we need to know
+that the reference counter eventually will reach zero. If we only used
+one reference counter it would potentially be held above zero for ever
+by different unmanaged threads.
+
+### Empty List ###
+
+If no new memory blocks are inserted into the list, it should
+eventually be emptied. All pointers to the list however expect to
+always point to something. This is solved by inserting an empty
+"marker" element, which only has to purpose of being there in the
+absense of other elements. That is when the list is empty it only
+contains this "marker" element.
+
+### Contention ###
+
+When elements are continously inserted by threads not owning the
+allocator instance, the thread owning the allocator instance will be
+able to work more or less undisturbed by other threads at the head end
+of the list. At the tail end large amounts of simultaneous inserts may
+cause contention, but we reduce such contention by spreading inserts
+of new elements near the end instead of requiring all new elements to
+be inserted at the end.
+
+### Schedulers and The Locked Allocator Instance ###
+
+Also the locked allocator instance for use by non-scheduler threads
+have a message box for deallocation jobs just as all the other
+allocator instances. The reason for this is that other threads may
+allocate memory pass it to a scheduler that then needs to deallocate
+it. We do not want the scheduler to have to wait for the lock on this
+locked instance. Since also locked instances has message boxes for
+deallocation jobs, the scheduler can just insert the job and avoid the
+locking.
+
+
+### A Benchmark Result ###
+
+When running the ehb benchmark, large amount of messages are passed
+around between schedulers. All message passing will in some way or the
+other cause memory allocation and deallocation. Since messages are
+passed between different schedulers we will get contention on the
+allocator instances where messages were allocated. By the introduction
+of the delayed dealloc feature, we got a speedup of between 25-45%,
+depending on configuration of the benchmark, when running on a
+relatively new machine with an Intel i7 quad core processor with
+hyper-threading using 8 schedulers. \ No newline at end of file
diff --git a/erts/emulator/internal_doc/PTables.md b/erts/emulator/internal_doc/PTables.md
new file mode 100644
index 0000000000..6fe0e7665d
--- /dev/null
+++ b/erts/emulator/internal_doc/PTables.md
@@ -0,0 +1,356 @@
+Process and Port Tables
+=======================
+
+Problems
+--------
+
+The process table is a mapping from process identifiers to process
+structure pointers. The process structure contains miscellaneous
+information about a process, as for example pointers to its heap,
+message queue, etc. When the runtime system needs to operate on a
+process, it looks up the process structure in the process table using
+the process identifier. An example of this is when passing a message
+to a process.
+
+The process table has for a very long time just been an array of
+pointers to process structures. Since process identifiers internally
+in the runtime system are 28-bit integers it is quite easy to map a
+process identifier to index into the array. The 28-bits were divided
+into two sets. The least significant set of bits was used as index
+into the array. The most significant set of bits was only used to be
+able to distinguish between a number of identifiers with which map to
+the same index in the array. As long as process table sizes of a power
+of two was used we had 2^28 unique process identifiers.
+
+When the first SMP support was implemented, the table still was kept
+more or less the same way, but protected by two types of locks. One
+lock that protected the whole table against modifications and an array
+of locks protecting different parts of the table. The exact locking
+strategy previously used isn't interesting. What is interesting is
+that it suffered from heavy lock contention especially when lots of
+modifications was being made, but also when only performing lookups.
+
+In order to be able to detect when it is safe to deallocate a
+previously used process structure, reference counting of the structure
+was used. Also this was problematic, since simultaneous lookups needed
+to modify the reference counter which also caused contention on the
+cache line where the reference counter was located. This since all
+modifications needs to be communicated between all involved
+processors.
+
+The port table is very similar to the process table. The major
+difference, at least in concept, is that it is a mapping from port
+identifiers to port structures. It had a similar implementation, but
+with some differences. Instead of being an array of pointers it was an
+array of structures, and instead of being protected by two types of
+locks it was only protected by one global lock. This table also
+suffered from lock contention in various situations.
+
+Solution
+--------
+
+The process table was the major problem to address since processes are
+much more frequently used than ports. The first implementation only
+implemented this for processes, but since the port table is very
+similar and very similar problems occur on the port table, the process
+table implementation was later generalized so that it could also be
+used implementing the port table. For simplicity I will only talk
+about the process table in the following text, but the same will apply
+to the port table unless otherwise stated.
+
+If we disregard the locking issues, the original solution is very
+appealing. The mapping from process identifier to index into the array
+is very fast, and this property is something we would like to
+keep. The vast majority of operations on these tables are lookups so
+optimizing for lookups is what we want to do.
+
+### Lookup ###
+
+Using a set of bits in the process identifier as index into an array
+seems hard to beat. By replacing the array of pointers with an array
+of our pointer sized atomic data type, a lookup will consist of the
+following:
+
+1. Mapping the 28-bit integer to an index into the array.
+
+ More about this mapping later.
+
+2. Read the pointer using an atomic memory operation at determined
+ index in array.
+
+ On all platforms that we provide atomic memory operations, this is
+ just a `volatile` read, preventing the compiler to use values in
+ registers, forcing the a read from memory.
+
+3. Depending on use, issue appropriate memory barrier.
+
+ A common barrier used is a barrier with acquire semantics. On
+ x86/x86_64 this maps to a compiler barrier preventing the compiler
+ to reorder instructions, but on other hardware often some kind of
+ light weight hardware memory barrier is also needed.
+
+ When comparing with a locked approach, at least one heavy weight
+ memory barrier will be issued when locking the lock on most, if
+ not all, hardware architectures (including x86/x86_64), and often
+ some kind of light weight memory barrier will be issued when
+ unlocking the lock.
+
+When looking at this very simple solution with very little overhead
+you might wonder why we didn't implement it this way from the
+beginning. It all boils down to the read operation of the pointer. We
+need some way to know that it is safe to access the memory pointed
+to. One way of doing this is to place a reference counter in the
+process structure. Increment of the reference counter at lookup needs
+to be done atomically with the lookup. A lock can typically provide
+this service for us, which was the approach we previously
+used. Another approach could be to co-locate the reference counter
+with the pointer in the table. The major problem with this approach is
+the modifications of the reference counter. This since these
+modification would have to be communicated between all involved
+processor cause contention on the cache line containing the reference
+counter. The new lookup approach above is possible since we can use
+the "thread progress" functionality in order to determine when it is
+safe to deallocate the process structure. We'll get back to this when
+describing deletion in the table.
+
+Using this new lookup approach we wont modify any memory at all which
+is important. A lookup conceptually only read memory, now this is true
+in the implementation also which is important from a scalability
+perspective. The previous implementation modified the cache line
+containing the reference counter two times, and the cache line
+containing the corresponding lock two times at each lookup.
+
+### Modifications of the Table ###
+
+A lightweight lookup in the table was the most important feature, but
+we also wanted to improve modifications of the table. The process
+table is modified when a new process is spawned, i.e. a new pointer is
+inserted into the table, and when a process terminates, i.e. a pointer
+is deleted in the table.
+
+Assuming that we spawn fewer processes than the maximum amount of
+unique process identifiers in the system, one has always been able to
+determine the order of process creation just by comparing process
+identifiers. If PidX is larger than PidY, then PidX was created after
+PidY assuming both identifiers originates from the same node. However,
+since we have a quite limited amount of unique identifiers today
+(2^28), this property cannot be relied upon if we create large amount
+of processes. But never the less, this is a property the system always
+have had.
+
+If we would have had a huge amount of unique identifiers available, it
+would have tempting to drop or modify this ordering property as
+described above. The ordering property could for example be based on
+the scheduler performing the spawn operation. It would have been
+possible to reserve large ranges of identifiers exclusive for each
+scheduler thread which could be used minimizing the need for
+communication when allocating identifiers. The amount of identifiers
+we got to work with today is, however, not even close to be enough for
+such an approach.
+
+Since we have a limited amount of unique identifiers, we need to be
+careful not to waste them. If previously used identifiers are reused
+too quick, identifiers originating from terminated processes will
+refer to newly created processes, and mixups will occur. The
+previously used approach was quite good at not wasting
+identifiers. Using a modified version of the same approach also lets
+us keep the ordering property that we have always had.
+
+#### Insert ####
+
+The original approach is more or less to search for next free index or
+slot in the array. The search starts from the last slot allocated. If
+we reach the end of the array we increase a "wrapped counter" and then
+continue the search. The process identifier is constructed by writing
+the index to the least significant set of bits, and the "wrapped
+counter" to the most significant set of bits. The amount of bits in
+each set of bits is decided at boot time, so that maximum index will
+just fit into the least significant set of bits.
+
+In the modified lock free version of this approach we more or less do
+it the same way, but with some important modifications trying to avoid
+unnecessary contention when multiple schedulers create processes
+simultaneously. Since multiple threads might be trying to search for
+the next free slot at the same time from the same starting point we
+want subsequent slots to be located in different cache lines. Multiple
+schedulers simultaneously writing new pointers into the table are
+therefore very likely to write into adjacent slots. If adjacent slots
+are located in the same cache line all modification of this cache line
+needs to be communicated between all involved processors which will be
+very expensive and scale very poor. By locating adjacent slots in
+different cache lines only true conflicts will trigger communication
+between involved processors, i.e., avoiding false sharing.
+
+A cache line is larger than a pointer, typically 8 or 16 times larger,
+so using one cache line for each slot only containing one pointer
+would be a waste of space. Each cache line will be able to hold a
+fixed amount of slots. The first slot of the table will be the first
+slot of the first cache line, the second slot of the table will be the
+first slot of the second cache line until we reach the end of the
+array. The next slot after that will be the second slot of the first
+cache line, etc, moving forward one cache line internal slot each time
+we wrap. This way we will be able to fit the same amount of pointers
+into an array of the same size while always keeping adjacent slots in
+different cache lines.
+
+The mapping from identifier to slot or index into the array gets a bit
+more complicated than before. Instead of a `shift` and a bitwise
+`and`, we get two `shift`s, two bitwise `and`s, and an `add` (see
+implementation of `erts_ptab_data2pix()` in `erl_ptab.h`). However, by
+storing this information optimized for lookup we only need a `shift`
+and a bitwise `and` on 32-bit platforms. On 64-bit platforms we got
+enough room for the 28-bit identifier in the least significant
+halfword, and the index in the most significant halfword, in other
+words, we just need to read the most significant halfword to get the
+index. That is, this operation is as fast, or faster than before. The
+downside is that on 32-bit platforms we need to convert this
+information into the 28-bit identifier number when printing, or when
+ordering identifiers from the same node. These operations are,
+however, extremely infrequent compared to lookups.
+
+When we insert a new element in the table we do the following:
+
+1. We begin by reserving space in the table by atomically
+ incrementing a counter of processes in the table. If our increment
+ brings the counter above the maximum size of the table, the
+ operation fail and a `system_limit` exception is raised.
+
+2. The table contains a 64-bit atomic variable of the last identifier
+ used. Only the least significant bits will be used when actually
+ creating the identifier. This identifier is where the search
+ begin.
+
+3. We increment last identifier value used. In order determine the
+ slot that corresponds to this identifier we call
+ `erts_ptab_data2pix()` that maps identifier to slot. We read the
+ content of the slot. If the slot is free we try to write a
+ reservation marker using an atomic compare and swap. If this fails
+ we repeat this step until it succeeds.
+
+4. Change the table variable of last identifier used. Since multiple
+ writes might occur at the same time this value may already have
+ been changed by to an identifier larger that the one we got. In
+ this case we can continue; otherwise, we need to change it to the
+ identifier we got.
+
+5. We now do some initializations of the process structure that
+ cannot be done before we know the process identifier, and have to
+ be done before we publish the structure in the table. This, for
+ example, includes storing the identifier in the process structure.
+
+6. Now we can publish the structure in the table by writing the the
+ pointer to the process structure in the slot previously reserved
+ in 3.
+
+Using this approach we keep the properties like identifier ordering,
+and identifier reuse while improving performance and scalability. It
+has one flaw, though. There is no guarantee that the operation will
+terminate. This can quite easily be fixed though, and will be fixed in
+the next release. We will get back to this below.
+
+#### Delete ####
+
+When a process terminates, we mark the process as terminated in the
+process structure, the counter of number of processes in the table is
+decreased, and the reference to the process structure is removed by
+writing a `NULL` pointer into the corresponding slot. The scheduler
+thread performing this then schedule a thread progress later job which
+will do the final cleanup and deallocate the process structure. The
+thread progress functionality will make sure that this job will not
+execute until it is certain that all managed threads have dropped all
+references to the process structure.
+
+### BIF Iterating Over the Table ###
+
+The `erlang:processes/1` and `erlang:port/1` BIFs iterate over the
+tables and return corresponding identifiers. These BIF should return a
+consistent snapshot of the table content during some time when the BIF
+is executing. In order to implement this we use locking in a strange
+way. We use an "inverted rwlock".
+
+When performing lookups in the table we do not need to bother about
+the locking at all, but when modifying the table we read lock the
+rwlock protecting the table which allows for multiple writers during
+normal operation. When the BIF that iterates over the table need
+access to the table it write locks the rwlock and reads content of the
+table. The BIF do not read the whole table in one go but instead read
+small chunks at time only write locking while reading. The actual
+implementation of the BIFs is out of the scope of this document.
+
+An out of the box rwlock will typically suffer from contention on the
+single cache line containing the state of the rwlock even in the case
+we are only read locking. Instead of using such an rwlock, we have our
+own implementation of reader optimized rwlocks which keeps track of
+reader threads in separate thread specific cache lines. This in order
+to avoid contention on a singe cache line. As long as we only do read
+lock operations, threads only need to read a global cache line and
+modify its own cache line, and by this minimize communication between
+involved processors. The iterating BIFs are normally very infrequently
+used, so in the normal case we will only do read lock operations on
+the table global rwlock.
+
+### Future Improvements ###
+
+The first improvement is to fix the guarantee so that insert
+operations will be guaranteed to terminate. When the operation starts
+we verify that there actually exist a free slot that we can use. The
+problem is that we might not find it since it may move when multiple
+threads modify the table at the same time as we are trying to find the
+slot. The easy fix is to abort the operation if an empty slot could
+not be found in a finite number operation, and then restart the
+operation under a write lock. This will be implemented in next
+release, but furter work should be made trying to find a better
+solution.
+
+This and also previous implementation do not work well when the table
+is nearly full. We will both get long search times for free slots, and
+we will reuse identifiers more frequently since we more frequently
+wrap during the search. These tables works best when the table is much
+larger than the amount of simultaneous existing processes. One easy
+improvement is to always have room for more processes than we allow in
+the table. This will also be implemented in the next release, but this
+should probably also be worked more on trying to find an even better
+solution.
+
+It would also be nice to get rid of the rwlock all together. The use
+of a reader optimized rwlock makes sure we do not any contention on
+the lock, but unnecessary memory barriers will be issued due to the
+lock. The main issue here is to modify iterating BIFs so that they do
+not require exclusive access to the table while reading a sequence of
+slots. In principle this should be rather easy, the code can handle
+sequences of variable sizes, so shrinking the sequence size of slots
+to one would solv the problem. This will, however, need some tweeks
+and modifications of not trival code, but is something that should be
+looked at in the future.
+
+By increasing the size of identifiers, at least on 64-bit machines
+(which isn't as easy as it first might seem) we get further room for
+improvement. Besides the obvious improvement of not reusing
+identifiers as fast as we currently do, it makes it possible to
+further avoid contention when inserting elements in the table. At
+least if we drop this ordering property, which isn't that useful
+anyway.
+
+### Some Benchmark Results ###
+
+In order to test modifications of the process table we ran a couple of
+benchmarks where lots of processes are spawned and terminated
+simultaneously, and got a speedup of between 150-200%. Running a
+similar benchmark but with ports we got a speedup of about 130%.
+
+The BIF `erlang:is_process_alive/1` is the closest you can get to a
+process table lookup only. The BIF looks up the process corresponding
+to the process identifier passed as argument, and then checks if it is
+alive. By running multiple processes looping over this BIF checking
+the same process, we get a speedup between 20000-23000%. Conceptually
+this operation only involve read operations. In the implementation
+used in R16B also only read operation are performed, while the
+previous implementation need to lock structures in order to read the
+data, suffering from both lock contention and contention due to
+modifications of cache lines used by lock internal data structures and
+the reference counter on the process being looked up.
+
+The benchmarks were run on a relatively new machine with an Intel i7
+quad core processor with hyper-threading using 8 schedulers. On a
+machine with more communication overhead and/or larger amount of
+logical processors the speedups are expected to be even larger.
diff --git a/erts/emulator/internal_doc/PortSignals.md b/erts/emulator/internal_doc/PortSignals.md
new file mode 100644
index 0000000000..b1afb7c5cb
--- /dev/null
+++ b/erts/emulator/internal_doc/PortSignals.md
@@ -0,0 +1,267 @@
+Port Signals
+============
+
+Problems
+--------
+
+Erlang ports conceptually are very similar to Erlang processes. Erlang
+processes execute Erlang code in the virtual machine, while an Erlang
+port execute native code typically used for communication with the
+outside world. For example, when an Erlang process wants to
+communicate using TCP over the network, it communicates via an Erlang
+port implementing the TCP socket interface in native code. Both Erlang
+Processes and Ports communicate using asynchronous signaling. The
+native code executed by an Erlang port is a collection of callback
+functions, called a driver. Each callback more or less implements the
+code of a signal to, or from the port.
+
+Even though processes and ports conceptually always have been very
+similar, the implementations have been very different. Originally,
+more or less all port signals were handled synchronously at the time
+they occurred. Very early in the development of the SMP support for
+the runtime system we recognized that this was a huge problem for
+signals between ports and the outside world. That is, I/O events to
+and from the outside world, or I/O signals. This was one of the first
+things that had to be rewritten in order to be able to do I/O in
+parallel at all. The solution was to implement scheduling of these
+signals. I/O signals corresponding to different ports could then be
+executed in parallel on different scheduler threads. Signals from
+processes to ports was not as big of a problem as the I/O signals, and
+the implementation of those was left as they were.
+
+Each port is protected by its own lock to protect against simultaneous
+execution in multiple threads. Previously when a process, executing on
+a scheduler thread, sent a port a signal, it locked the port lock and
+synchronously executed the code corresponding to the signal. If the
+lock was busy, the scheduler thread blocked waiting until it could
+lock the lock. If multiple processes executing simultaneously on
+different scheduler threads, sent signals to the same port, schedulers
+suffered from heavy lock contention. Such contention could also occur
+between I/O signals for the port executing on one scheduler thread,
+and a signal from a process to the port executing on another scheduler
+thread. Beside the contention issues, we also loose potential work to
+execute in parallel on different scheduler threads. This since the
+process sending the *asynchronous* signal is blocked while the code
+implementing the signal is executed synchronously.
+
+Solution
+--------
+
+In order to prevent multiple schedulers from trying to execute signals
+to/from the same port simultaneously, we need to be able to ensure
+that all signals to/from a port are executed in sequence on one
+scheduler. More or less, the only way to do this is to schedule all
+types of signals. Signals corresponding to a port can then be executed
+in sequence by one single scheduler thread. If only one thread tries
+to execute the port, no contention will appear on the port
+lock. Besides getting rid of the contention, processes sending signals
+to the port can also continue execution of their own Erlang code on
+other schedulers at the same time as the signaling code is executing
+on another scheduler.
+
+When implementing this there are a couple of important properties that
+we either need, or want to preserve:
+
+* Signal ordering guarantee. Signals from process `X` to port `Y`,
+ *must* be delivered to `Y` in the same order as sent from `X`.
+
+* Signal latency. Due to the previous synchronous implementation,
+ latency of signals sent from processes to ports have usually been
+ very low. During contention the latency has of course
+ increased. Users expect latency of these signals to be low, a
+ sudden increase in latency would not be appreciated by our users.
+
+* Compatible flow control. Ports have for a very long time had the
+ possibility to use the busy port functionality when implementing
+ flow control. One may argue that this functionality fits very bad
+ with the conceptually completely asynchronous signaling, but the
+ functionality has been there for ages and is expected to be
+ there. When a port sets itself into a busy state, `command`
+ signals should not be delivered, and senders of such signals
+ should suspend until the port sets itself in a not busy state.
+
+### Scheduling of Port Signals ###
+
+A run queue has four queues for processes of different priority and
+one queue for ports. The scheduler thread associated with the run
+queue switch evenly between execution of processes and execution of
+ports while both processes and ports exist in the queue. This is not
+completely true, but not important for this discussion. A port that is
+in a run queue also has a queue of tasks to execute. Each task
+corresponds to an in- or outgoing signal. When the port is selected
+for execution each task will be executed in sequence. The run queue
+locks not only protected the queues of ports, but also the queues of
+port tasks.
+
+Since we go from a state where I/O signals are the only port related
+signals scheduled, to a state where potentially all port related
+signals may be scheduled we may drastically increase the load on the
+run queue lock. The amount of scheduled port tasks very much depend on
+the Erlang application executing, which we do not control, and we do
+not want to get increased contention on the run queue locks. We
+therefore need another approach of protecting the port task queue.
+
+#### Task Queue ####
+
+We chose a "semi locked" approach, with one public locked task queue,
+and a private, lock free, queue like, task data structure. This "semi
+locked" approach is similar to how the message boxes of processes are
+managed. The lock is port specific and only used for protection of
+port tasks, so the run queue lock is now needed in more or less the
+same way for ports as for processes. This ensures that we wont see an
+increased lock contention on run queue locks due to this rewrite of
+the port functionality.
+
+When an executing port runs out of work to execute in the private task
+data structure, it moves the public task queue into the private task
+data structure while holding the lock. Once tasks has been moved to
+the private data structure no lock protects them. This way the port
+can continue working on tasks in the private data structure without
+having to fight for the lock.
+
+I/O signals may however be aborted. This could be solved by letting
+the port specific scheduling lock also protect the private task data
+structure, but then the port very frequently would have to fight with
+others enqueueing new tasks. In order to handle this while keeping the
+private task data structure lock free, we use a similar "non
+aggressive" approach as we use when handling processes that gets
+suspended while in the run queue. Instead of removing the aborted port
+task, we just mark it as aborted using an atomic memory
+operation. When a task is selected for execution, we first verify that
+it has not been aborted. If aborted we, just drop the task.
+
+A task that can be aborted is referred via another data structure from
+other parts of the system, so that a thread that needs to abort the
+task can reach it. In order to be sure to safely deallocate a task
+that is no longer used, we first clear this reference and then use the
+thread progress functionality in order to make sure no references can
+exist to the task. Unfortunately, also unmanaged threads might abort
+tasks. This is very infrequent, but might occur. This could be handled
+locally for each port, but would require extra information in each
+port structure which very infrequently would be used. Instead of
+implementing this in each port, we implemented general functionality
+that can be used from unmanaged threads to delay thread progress.
+
+The private "queue like" task data structure could have been an
+ordinary queue if it wasn't for the busy port functionality. When the
+port has flagged itself as busy, `command` signals are not allowed to
+be delivered and need to be blocked. Other signals sent from the same
+sender following a `command` signal that has been blocked also have to
+be blocked; otherwise, we would violate the ordering guarantee. At the
+same time, other signals that have no dependencies to blocked
+`command` signals are expected to be delivered.
+
+The above requirements makes the private task data structure a rather
+complex data structure. It has a queue of unprocessed tasks, and a
+busy queue. The busy queue contains blocked tasks corresponding to
+`command` signals, and tasks with dependencies to such tasks. The busy
+queue is accompanied by a table over blocked tasks based on sender
+with a references into last task in the busy queue from a specific
+sender. This since we need check for dependencies when new tasks are
+processed in the queue of unprocessed tasks. When a new task is
+processed that needs to be blocked it isn't enqueued at the end of the
+busy queue, but instead directly after the last task with the same
+sender. This in order to easily be able to detect when we have tasks
+that no longer have any dependencies to tasks corresponding to
+`command` signals which should be moved out of the busy queue. When
+the port executes, it switches between processing tasks from the busy
+queue, and processing directly from the unprocessed queue based on its
+busy state. When processing directly from the unprocessed queue it
+might, of course, have to move a task into the busy queue instead of
+executing it.
+
+#### Busy Port Queue ####
+
+Since it is the port itself which decides when it is time to enter a
+busy state, it needs to be executing in order to enter the busy
+state. As a result of `command` signals being scheduled, we may get
+into a situation where the port gets flooded by a huge amount of
+`command` signals before it even gets a chance to set itself into a
+busy state. This since it has not been scheduled for execution
+yet. That is, under these circumstances the busy port functionality
+loose the flow control properties it was intended to provide.
+
+In order to solve this, we introduced a new busy feature, namely "busy
+port queue". The port has a limit of `command` data that is allowed to
+be enqueued in the task queue. When this limit is reached, the port
+will automatically enter a busy port queue state. When in this state,
+senders of `command` signals will be suspended, but `command` signals
+will still be delivered to the port unless it is also in a busy port
+state. This limit is known as the high limit.
+
+There is also a low limit. When the amount of queued `command` data
+falls below this limit and the port is in a busy port queue state, the
+busy port queue state is automatically disabled. The low limit should
+typically be significantly lower than the high limit in order to
+prevent frequent oscillation around the busy port queue state.
+
+By introduction of this new busy state we still can provide the flow
+control. Old driver do not even have to be changed. The limits can,
+however, be configured and even disabled by the port. By default the
+high limit is 8 KB and the low limit is 4 KB.
+
+### Preparation of Signal Send ###
+
+Previously all operations sending signals to ports began by acquiring
+the port lock, then performed preparations for sending the signal, and
+then finaly sent the signal. The preparations typically included
+inspecting the state of the port, and preparing the data to pass along
+with the signal. The preparation of data is frequently quite time
+consuming, and did not really depend on the port. That is we would
+like to do this without having the port lock locked.
+
+In order to improve this, state information was re-organized in the
+port structer, so that we can access it using atomic memory
+operations. This together with the new port table implementation,
+enabled us to lookup the port and inspect the state before acquiring
+the port lock, which in turn made it possible to perform preparations
+of signal data before acquiring the port lock.
+
+### Preserving Low Latency ###
+
+If we disregard the contended cases, we will inevitably get a higher
+latency when scheduling signals for execution at a later time than by
+executing the signal immediately. In order to preserve the low latency
+we now first check if this is a contended case or not. If it is, we
+schedule the signal for later execution; otherwise, we execute the
+signal immediately. It is a contended case if other signals already
+are scheduled on the port, or if we fail to acquire the port
+lock. That is we will not block waiting for the lock.
+
+Doing it this way we will preserve the low latency at the expense of
+lost potential parallel execution of the signal and other code in the
+process sending the signal. This default behaviour can however be
+changed on port basis or system wide, forcing scheduling of all
+signals from processes to ports that are not part of a synchronous
+communication. That is, an unconditional request/response pair of
+asynchronous signals. In this case it is no potential for parallelism,
+and by that no point forcing scheduling of the request signal.
+
+The immediate execution of signals may also cause a scheduler that is
+about to execute scheduled tasks to block waiting for the port
+lock. This is however more or less the only scenario where a scheduler
+needs to wait for the port lock. The maximum time it has to wait is
+the time it takes to execute one signal, since we always schedule
+signals when contention occurs.
+
+### Signal Operations ###
+
+Besides implementing the functionality enabling the scheduling,
+preparation of signal data without port lock, etc, each operation
+sending signals to ports had to be quite extensively re-written. This
+in order to move all sub-operations that can be done without the lock
+to a place before we have acquired the lock, and also since signals
+now sometimes are executed immediately and sometimes scheduled for
+execution at a later time which put different requirements on the data
+to pass along with the signal.
+
+### Some Benchmark Results ###
+
+When running some simple benchmarks where contention only occur due to
+I/O signals contending with signals from one single process we got a
+speedup of 5-15%. When multiple processes send signals to one single
+port the improvements can be much larger, but the scenario with one
+process contending with I/O is the most common one.
+
+The benchmarks were run on a relatively new machine with an Intel i7
+quad core processor with hyper-threading using 8 schedulers. \ No newline at end of file
diff --git a/erts/emulator/internal_doc/ProcessManagementOptimizations.md b/erts/emulator/internal_doc/ProcessManagementOptimizations.md
new file mode 100644
index 0000000000..9e83633bef
--- /dev/null
+++ b/erts/emulator/internal_doc/ProcessManagementOptimizations.md
@@ -0,0 +1,172 @@
+Process Management Optimizations
+================================
+
+Problems
+--------
+
+Early versions of the SMP support for the runtime system completely
+relied on locking in order to protect data accesses from multiple
+threads. In some cases this isn't that problematic, but in some cases
+it really is. It complicates the code, ensuring all locks needed are
+actually held, and ensuring that all locks are acquired in such an
+order that no deadlock occur. Acquiring locks in the right order often
+also involve releasing locks held, forcing threads to reread data
+already read. A good recipe for creation of bugs. Trying to use more
+fine-grained locking in order to increase possible parallelism in the
+system makes the complexity situation even worse. Having to acquire a
+bunch of locks when doing operations also often cause heavy lock
+contention which cause poor scalability.
+
+Management of processes internally in the runtime system suffered from
+these problems. When changing state on a process, for example from
+`waiting` to `runnable`, a lock on the process needed to be
+locked. When inserting a process into a run queue also a lock
+protecting the run queue had to be locked. When migrating a process
+from one run queue to another run queue, locks on both run queues and
+on the process had to be locked.
+
+This last example is a quite common case in during normal
+operation. For example, when a scheduler thread runs out of work it
+tries to steal work from another scheduler threads run queue. When
+searching for a victim to steal from there was a lot of juggling of
+run queue locks involved, and during the actual theft finalized by
+having to lock both run queues and the process. When one scheduler
+runs out of work, often others also do, causing lots of lock
+contention.
+
+Solution
+--------
+
+### Process ###
+
+In order to avoid these situations we wanted to be able to do most of
+the fundamental operations on a process without having to acquire a
+lock on the process. Some examples of such fundamental operations are,
+moving a process between run queues, detecting if we need to insert it
+into a run queue or not, detecting if it is alive or not.
+
+All of this information in the process structure that was needed by
+these operations was protected by the process `status` lock, but the
+information was spread across a number of fields. The fields used was
+typically state fields that could contain a small number of different
+states. By reordering this information a bit we could *easily* fit
+this information into a 32-bit wide field of bit flags (only 12-flags
+were needed). By moving this information we could remove five 32-bit
+wide fields and one pointer field from the process structure! The move
+also enabled us to easily read and change the state using atomic
+memory operations.
+
+### Run Queue ###
+
+As with processes we wanted to be able to do the most fundamental
+operations without having to acquire a lock on it. The most important
+being able to determine if we should enqueue a process in a specific
+run queue or not. This involves being able to read actual load, and
+load balancing information.
+
+The load balancing functionality is triggered at repeated fixed
+intervals. The load balancing more or less strives to even out run
+queue lengths over the system. When balancing is triggered,
+information about every run queue is gathered, migrations paths and
+run queue length limits are set up. Migration paths and limits are
+fixed until the next balancing has been done. The most important
+information about each run queue is the maximum run queue length since
+last balancing. All of this information were previously stored in the
+run queues themselves.
+
+When a process has become runnable, for example due to reception of a
+message, we need to determine which run queue to enqueue it
+in. Previously this at least involved locking the run queue that the
+process currently was assigned to while holding the status lock on the
+process. Depending on load we sometimes also had to acquire a lock on
+another run queue in order to be able to determine if it should be
+migrated to that run queue or not.
+
+In order to be able to decide which run queue to use without having to
+lock any run queues, we moved all fixed balancing information out of
+the run queues into a global memory block. That is, migration paths
+and run queue limits. Information that need to be frequently updated,
+like for example maximum run queue length, were kept in the run queue,
+but instead of operating on this information under locks we now use
+atomic memory operations when accessing this information. This made it
+possible to first determine which run queue to use, without locking
+any run queues, and when decided, lock the chosen run queue and insert
+the process.
+
+#### Fixed Balancing Information ####
+
+When determining which run queue to choose we need to read the fixed
+balancing information that we moved out of the run queues. This
+information is global, read only between load balancing operations,
+but will be changed during a load balancing. We do not want to
+introduce a global lock that needs to be acquired when accessing this
+information. A reader optimized rwlock could avoid some of the
+overhead since the data is most frequently read, but it would
+unavoidably cause disruption during load balancing, since this
+information is very frequently read. The likelihood of a large
+disruption due to this also increase as number of schedulers grows.
+
+Instead of using a global lock protecting modifications of this
+information, we write a completely new version of it at each load
+balancing. The new version is written in another memory block than the
+previous one, and published by issuing a write memory barrier and then
+storing a pointer to the new memory block in a global variable using
+an atomic write operation.
+
+When schedulers need to read this information, they read the pointer
+to currently used information using an atomic read operation, and then
+issue a data dependency read barrier, which on most architectures is a
+no-op. That is, it is very little overhead getting access to this
+information.
+
+Instead of allocating and deallocating memory blocks for the different
+versions of the balancing information we keep old memory blocks and
+reuse them when it is safe to do so. In order to be able to determine
+when it is safe to reuse a block we use the thread progress
+functionality, ensuring that no threads have any references to the
+memory block when we reuse it.
+
+#### Be Less Aggressive ####
+
+We implemented a test version using lock free run queues. This
+implementation did however not perform as good as the version using
+one lock per run queue. The reason for this was not investigated
+enough to say why this was. Since the locked version performed better
+we kept it, at least for now. The lock free version, however, forced
+us to use other solutions, some of them we kept.
+
+Previously when a process that was in a run queue got suspended, we
+removed it from the queue straight away. This involved locking the
+process, locking the run queue, and then unlinking it from the double
+linked list implementing the queue. Removing a process from a lock
+free queue gets really complicated. Instead, of removing it from the
+queue, we just leave it in the queue and mark it as suspended. When
+later selected for execution we check if the process is suspended, if
+so just dropped it. During its time in the queue, it might also get
+resumed again, if so execute it when it get selected for execution.
+
+By keeping this part when reverting back to a locked implementation,
+we could remove a pointer field in each process structure, and avoid
+unnecessary operations on the process and the queue which might cause
+contention.
+
+### Combined Modifications ###
+
+By combining the modifications of the process state management and the
+run queue management, we can do large parts of the work involved when
+managing processes with regards to scheduling and migration without
+having any locks locked at all. In these situations we previously had
+to have multiple locks locked. This of course caused a lot of rewrites
+across large parts of the runtime system, but the rewrite both
+simplified code and eliminated locking at a number of places. The
+major benefit is, of course, reduced contention.
+
+### A Benchmark Result ###
+
+When running the chameneosredux benchmark, schedulers frequently run
+out of work trying to steal work from each other. That is, either
+succeeding in migrating, or trying to migrate processes which is a
+scenario which we wanted to optimize. By the introduction of these
+improvements, we got a speedup of 25-35% when running this benchmark
+on a relatively new machine with an Intel i7 quad core processor with
+hyper-threading using 8 schedulers. \ No newline at end of file
diff --git a/erts/emulator/internal_doc/ThreadProgress.md b/erts/emulator/internal_doc/ThreadProgress.md
new file mode 100644
index 0000000000..6118bcf0f6
--- /dev/null
+++ b/erts/emulator/internal_doc/ThreadProgress.md
@@ -0,0 +1,308 @@
+Thread Progress
+===============
+
+Problems
+--------
+
+### Knowing When Threads Have Completed Accesses to a Data Structure ###
+
+When multiple threads access the same data structure you often need to
+know when all threads have completed their accesses. For example, in
+order to know when it is safe to deallocate the data structure. One
+simple way to accomplish this is to reference count all accesses to
+the data structure. The problem with this approach is that the cache
+line where the reference counter is located needs to be communicated
+between all involved processors. Such communication can become
+extremely expensive and will scale poorly if the reference counter is
+frequently accessed. That is, we want to use some other approach of
+keeping track of threads than reference counting.
+
+### Knowing That Modifications of Memory is Consistently Observed ###
+
+Different hardware architectures have different memory models. Some
+architectures allows very aggressive reordering of memory accesses
+while other architectures only reorder a few specific cases. Common to
+all modern hardware is, however, that some type of reordering will
+occur. When using locks to protect all memory accesses made from
+multiple threads such reorderings will not be visible. The locking
+primitives will ensure that the memory accesses will be ordered. When
+using lock free algorithms one do however have to take this reordering
+made by the hardware into account.
+
+Hardware memory barriers or memory fences are instructions that can be
+used to enforce order between memory accesses. Different hardware
+architectures provide different memory barriers. Lock free algorithms
+need to use memory barriers in order to ensure that memory accesses
+are not reordered in such ways that the algorithm breaks down. Memory
+barriers are also expensive instructions, so you typically want to
+minimize the use of these instructions.
+
+Functionality Used to Address These Problems
+-------------------------------------------
+
+The "thread progress" functionality in the Erlang VM is used to
+address these problems. The name "thread progress" was chosen since we
+want to use it to determine when all threads in a set of threads have
+made such progress so that two specific events have taken place for
+all them.
+
+The set of threads that we are interested in we call managed
+threads. The managed threads are the only threads that we get any
+information about. These threads *have* to frequently report
+progress. Not all threads in the system are able to frequently report
+progress. Such threads cannot be allowed in the set of managed threads
+and are called unmanaged threads. An example of unmanaged threads are
+threads in the async thread pool. Async threads can be blocked for
+very long times and by this be prevented from frequently reporting
+progress. Currently only scheduler threads and a couple of other
+threads are managed threads.
+
+### Thread Progress Events ###
+
+Any thread in the system may use the thread progress functionality in
+order to determine when the following events have occured at least
+once in all managed threads:
+
+1. The thread has returned from other code to a known state in the
+ thread progress functionality, which is independent of any other
+ code.
+2. The thread has executed a full memory barrier.
+
+These events, of course, need to occur ordered to other memory
+operations. The operation of determining this begins by initiating the
+thread progress operation. The thread that initiated the thread
+progress operation after this poll for the completion of the
+operation. Both of these events must occur at least once *after* the
+thread progress operation has been initiated, and at least once
+*before* the operation has completed in each managed thread. This is
+ordered using communication via memory which makes it possible to draw
+conclusion about the memory state after the thread progress operation
+has completed. Lets call the progress made from initiation to
+comletion for "thread progress".
+
+Assuming that the thread progress functionality is efficient, a lot of
+algorithms can both be simplified and made more efficient than using
+the first approach that comes to mind. A couple of examples follows.
+
+By being able to determine when the first event above has occurred we
+can easily know when all managed threads have completed accesses to a
+data structure. This can be determined the following way. We have an
+implementation of some functionality `F` using a data structure
+`D`. The reference to `D` is always looked up before `D` is being
+accessed, and the references to `D` is always dropped before we leave
+the code implementing `F`. If we remove the possibility to look up `D`
+and then wait until the first event has occurred in all managed
+threads, no managed threads can have any references to the data
+structure `D`. This could for example have been achieved by using
+reference counting, but the cache line containing the reference
+counter would in this case be ping ponged between all processors
+accessing `D` at every access.
+
+By being able to determine when the second event has occurred it is
+quite easy to do complex modifications of memory that needs to be seen
+consistently by other threads without having to resort to locking. By
+doing the modifications, then issuing a full memory barrier, then wait
+until the second event has occurred in all managed threads, and then
+publish the modifications, we know that all managed threads reading
+this memory will get a consistent view of the modifications. Managed
+threads reading this will not have to issue any extra memory barriers
+at all.
+
+Implementation of the Thread Progress Functionality
+---------------------------------------------------
+
+### Requirement on the Implementation ###
+
+In order to be able to determine when all managed threads have reached
+the states that we are interested in we need to communicate between
+all involved threads. We of course want to minimize this
+communication.
+
+We also want threads to be able to determine when thread progress has
+been made relatively fast. That is we need to have some balance
+between comunication overhead and time to complete the operation.
+
+### API ###
+
+I will only present the most important functions in the API here.
+
+* `ErtsThrPrgrVal erts_thr_progress_later(void)` - Initiation of the
+ operation. The thread progress value returned can be used testing
+ for completion of the operation.
+* `int erts_thr_progress_has_reached(ErtsThrPrgrVal val)` - Returns
+ a non zero value when we have reached the thread progress value
+ passed as argument. That is, when a non zero value is returned the
+ operation has completed.
+
+When a thread calls `my_val = erts_thr_progress_later()` and waits for
+`erts_thr_progress_has_reached(my_val)` to return a non zero value it
+knows that thread progress has been made.
+
+While waiting for `erts_thr_progress_has_reached()` to return a non
+zero value we typically do not want to block waiting, but instead want
+to continue working with other stuff. If we run out of other stuff to
+work on we typically do want to block waiting until we have reached
+the thread progress value that we are waiting for. In order to be able
+to do this we provide functionality for waking up a thread when a
+certain thread progress value has been reached:
+
+* `void erts_thr_progress_wakeup(ErtsSchedulerData *esdp,
+ ErtsThrPrgrVal val)` - Request wake up. The calling thread will be
+ woken when thread progress has reached val.
+
+Managed threads frequently need to update their thread progress by
+calling the following functions:
+
+* `int erts_thr_progress_update(ErtsSchedulerData *esdp)` - Update
+ thread progress. If a non zero value is returned
+ `erts_thr_progress_leader_update()` has to be called without any
+ locks held.
+* `int erts_thr_progress_leader_update(ErtsSchedulerData *esdp)` -
+ Leader update thread progress.
+
+Unmanaged threads can delay thread progress beeing made:
+
+* `ErtsThrPrgrDelayHandle erts_thr_progress_unmanaged_delay(void)` -
+ Delay thread progress.
+* `void erts_thr_progress_unmanaged_continue(ErtsThrPrgrDelayHandle
+ handle)` - Let thread progress continue.
+
+Scheduler threads can schedule an operation to be executed by the
+scheduler itself when thread progress has been made:
+
+* `void erts_schedule_thr_prgr_later_op(void (*funcp)(void *), void
+ *argp, ErtsThrPrgrLaterOp *memp)` - Schedule a call to `funcp`. The
+ call `(*funcp)(argp)` will be executed when thread progress has been
+ made since the call to `erts_schedule_thr_prgr_later_op()` was
+ made.
+
+### Implementation ###
+
+In order to determine when the events has happened we use a global
+counter that is incremented when all managed threads have called
+`erts_thr_progress_update()` (or `erts_thr_progress_leader_update()`).
+This could naively be implemented using a "thread confirmed" counter.
+This would however cause an explosion of communication where all
+involved processors would need to communicate with each other at each
+update.
+
+Instead of confirming at a global location each thread confirms that
+it accepts in increment of the global counter in its own cache
+line. These confirmation cache lines are located in sequence in an
+array, and each confirmation cache line will only be written by one
+and only one thread. One of the managed threads always have the leader
+responsibility. This responsibility may jump between threads, but as
+long as there are some activity in the system always one of them will
+have the leader responsibility. The thread with the leader
+responsibility will call `erts_thr_progress_leader_update()` which
+will check that all other threads have confirmed an increment of the
+global counter before doing the increment of the global counter. The
+leader thread is the only thread reading the confirmation cache
+lines.
+
+Doing it this way we will get a communication pattern of information
+going from the leader thread out to all other managed threads and then
+back from the other threads to the leader thread. This since only the
+leader thread will write to the global counter and all other threads
+will only read it, and since each confirmation cache lines will only
+be written by one specific thread and only read by the leader
+thread. When each managed thread is distributed over different
+processors, the communication between processors will be a reflection
+of this communication pattern between threads.
+
+The value returned from `erts_thr_progress_later()` equals the, by
+this thread, latest confirmed value plus two. The global value may be
+latest confirmed value or latest confirmed value minus one. In order
+to be certain that all other managed threads actually will call
+`erts_thr_progress_update()` at least once before we reach the value
+returned from `erts_thr_progress_later()`, the global counter plus one
+is not enough. This since all other threads may already have confirmed
+current global value plus one at the time when we call
+`erts_thr_progress_later()`. They are however guaranteed not to have
+confirmed global value plus two at this time.
+
+The above described implementation more or less minimizes the
+comunication needed before we can increment the global counter. The
+amount of communication in the system due to the thread progress
+functionality however also depend on the frequency with which managed
+threads call `erts_thr_progress_update()`. Today each scheduler thread
+calls `erts_thr_progress_update()` more or less each time an Erlang
+process is scheduled out. One way of further reducing communication
+due to the thread progress functionality is to only call
+`erts_thr_progress_update()` every second, or third time an Erlang
+process is scheduled out, or even less frequently than that. However,
+by doing updates of thread progress less frequently all operations
+depending on the thread progress functionality will also take a longer
+time.
+
+#### Delay of Thread Progress by Unmanaged Threads ####
+
+In order to implement delay of thread progress from unmanaged threads
+we use two reference counters. One being `current` and one being
+`waiting`. When an unmanaged thread wants to delay thread progress it
+increments `current` and gets a handle back to the reference counter
+it incremented. When it later wants to enable continuation of thread
+progress it uses the handle to decrement the reference counter it
+previously incremented.
+
+When the leader threads is about to increment the global thread
+progress counter it verifies that the `waiting` counter is zero before
+doing so. If not zero, the leader isn't allowed to increment the
+global counter, and needs to wait before it can do this. When it is
+zero, it swaps the `waiting` and `current` counters before increasing
+the global counter. From now on the new `waiting` counter will
+decrease, so that it eventualy will reach zero, making it possible to
+increment the global counter the next time. If we only used one
+reference counter it would potentially be held above zero for ever by
+different unmanaged threads.
+
+When an unmanaged thread increment the `current` counter it will not
+prevent the next increment of the global counter, but instead the
+increment after that. This is sufficient since the global counter
+needs to be incremented two times before thread progress has been
+made. It is also desirable not to prevent the first increment, since
+the likelyhood increases that the delay is withdrawn before any
+increment of the global counter is delayed. That is, the operation
+will cause as little disruption as possible.
+
+However, this feature of delaying thread progress from unmanaged
+threads should preferably be used as little as possible, since heavy
+use of it will cause contention on the reference counter cache
+lines. The functionality is however very useful in code which normally
+only executes in managed threads, but which may under some infrequent
+circumstances be executed in other threads.
+
+#### Overhead ####
+
+The overhead caused by the thread progress functionality is more or
+less fixed using the same amount of schedulers regardless of the
+number of uses of the functionality. Already today quite a lot of
+functionality use it, and we plan to use it even more. When rewriting
+old implementations of ERTS internal functionality to use the thread
+progress functionality, this implies removing communication in the old
+implementation. Otherwise it is simply no point rewriting the old
+implementation to use the thread progress functionality. Since the
+thread progress overhead is more or less fixed, the rewrite will cause
+a reduction of the total communication in the system.
+
+##### An Example #####
+
+The main structure of an ETS table was originally managed using
+reference counting. Already a long time ago we replaced this strategy
+since the reference counter caused contention on each access of the
+table. The solution used was to schedule "confirm deletion" jobs on
+each scheduler in order to know when it was safe to deallocate the
+table structure of a removed table. These confirm deletion jobs needed
+to be allocated. That is, we had to allocate and deallocate as many
+blocks as schedulers in order to deallocate one block. This of course
+was a quite an expensive operation, but we only needed to do this once
+when removing a table. It was more important to get rid of the
+contention on the reference counter which was present on every
+operation on the table.
+
+When the thread progress functionality had been introduced, we could
+remove the code implementing the "confirm deletion" jobs, and then
+just schedule a thread progress later operation which deallocates the
+structure. Besides simplifying the code a lot, we got an increase of
+more than 10% of the number of transactions per second handled on a
+mnesia tpcb benchmark executing on a quad core machine.
diff --git a/erts/emulator/internal_doc/Tracing.md b/erts/emulator/internal_doc/Tracing.md
new file mode 100644
index 0000000000..30bc5327a7
--- /dev/null
+++ b/erts/emulator/internal_doc/Tracing.md
@@ -0,0 +1,220 @@
+Non-blocking trace setting
+==========================
+
+Introduction
+------------
+
+Before OTP R16 when trace settings were changed by `erlang:trace_pattern`,
+all other execution in the VM were halted while the trace operation
+was carried out in single threaded mode. Similar to code loading, this
+can impose a severe problem for availability that grows with the
+number of cores.
+
+In OTP R16, trace breakpoints are set in the code without blocking the
+VM. Erlang processes may continue executing undisturbed in parallel
+during the entire operation. The same base technique is used as for
+code loading. A staging area of breakpoints is prepared and then made
+active with a single atomic operation.
+
+
+Redesign of Breakpoint Wheel
+----------------------------
+
+To make it easier to manage breakpoints without single threaded mode a
+redesign of the breakpoint mechanism has been made. The old
+"breakpoint wheel" data structure was a circular double-linked list of
+breakpoints for each instrumented function. It was invented before the
+SMP emulator. To support it in the SMP emulator, is was essentially
+expanded to one breakpoint wheel per scheduler. As more breakpoint
+types have been added, the implementation have become messy and hard
+to understand and maintain.
+
+In the new design the old wheel was dropped and instead replaced by
+one struct (`GenericBp`) to hold the data for all types of breakpoints
+for each instrumented function. A bit-flag field is used to indicate
+what different type of break actions that are enabled.
+
+
+Same Same but Different
+-----------------------
+Even though `trace_pattern` use the same technique as the non-blocking
+code loading with replicated generations of data structures and an
+atomic switch, the implementations are quite separate from each
+other. One initial idea was to use the existing mechanism of code
+loading to do a dummy load operation that would make a copy of the
+affected modules. That copy could then be instrumented with
+breakpoints before making it reachable with the same atomic switch as
+done for code loading. This approach seems straight forward but has a
+number of shortcomings, one being the large memory footprint when many
+modules are instrumented. Another problem is how execution will reach
+the new instrumented code. Normally loaded code can only be reached
+through external functions calls. Trace settings must be activated
+instantaneously without the need of external function calls.
+
+The choosen solution is instead for tracing to use the technique of
+replication applied on the data structures for breakpoints. Two
+generations of breakpoints are kept and indentified by index of 0 and
+1. The global atomic variables `erts_active_bp_index` will determine
+which generation of breakpoints running code will use.
+
+### Atomicy Without Atomic Operations
+
+Not using the code loading generations (or any other code duplication)
+means that `trace_pattern` must at some point write to the active beam
+code in order for running processes to reach the staged breakpoints
+structures. This can be done with one single atomic write operation
+per instrumented function. The beam instruction words are however read
+with normal memory loads and not through the atomic API. The only
+guarantee we need is that the written instruction word is seen as
+atomic. Either fully written or not at all. This is true for word
+aligned write operation on all hardware architectures we use.
+
+
+Adding a new Breakpoint
+-----------------------
+This is a simplified sequence describing what `trace_pattern` goes
+through when adding a new breakpoint.
+
+1. Seize exclusive code write permission (suspend process until we get it).
+
+2. Allocate breakpoint structure `GenericBp` including both generations.
+ Set the active part as disabled with a zeroed flagfield. Save the original
+ instruction word in the breakpoint.
+
+3. Write a pointer to the breakpoint at offset -4 from the first
+ instruction "func_info" header.
+
+4. Set the staging part of the breakpoint as enabled with specified
+ breakpoint data.
+
+5. Wait for thread progress.
+
+6. Write a `op_i_generic_breakpoint` as the first instruction for the function.
+ This instruction will execute the breakpoint that it finds at offset -4.
+
+7. Wait for thread progress.
+
+8. Commit the breadpoint by switching `erts_active_bp_index`.
+
+9. Wait for thread progress.
+
+10. Prepare for next call to `trace_pattern` by updating the new staging part
+ (the old active) of the breakpoint to be identic to the the new active part.
+
+11. Release code write permission and return from `trace_pattern`.
+
+
+The code write permission "lock" seized in step 1 is the same as used
+by code loading. This will ensure that only one process at a time can
+stage new trace settings but it will also prevent concurrent code
+loading and make sure we see a consistent view of the beam code during
+the entire sequence.
+
+Between step 6 and 8, runninng processes might execute the written
+`op_i_generic_breakpoint` instruction. They will get the breakpoint
+structure written in step 3, read `erts_active_bp_index` and execute
+the corresponding part of the breakpoint. Before the switch in step 8
+becomes visible they will however execute the disabled part of the
+breakpoint structure and do nothing other than executing the saved
+original instruction.
+
+
+To Updating and Remove Breakpoints
+----------------------------------
+
+The above sequence did only describe adding a new breakpoint. We do
+basically the same sequence to update the settings of an existing
+breakpoint except step 2,3 and 6 can be skipped as it has already been
+done.
+
+To remove a breakpoint some more steps are needed. The idea is to
+first stage the breakpoint as disabled, do the switch, wait for thread
+progress and then remove the disabled breakpoint by restoring the
+original beam instruction.
+
+Here is a more complete sequence that contains both adding, updating
+and removing breakpoints.
+
+1. Seize exclusive code write permission (suspend process until we get it).
+
+2. Allocate new breakpoint structures with a disabled active part and
+ the original beam instruction. Write a pointer to the breakpoint in
+ "func_info" header at offset -4.
+
+3. Update the staging part of all affected breakpoints. Disable
+ breakpoints that are to be removed.
+
+4. Wait for thread progress.
+
+5. Write a `op_i_generic_breakpoint` as the first instruction for all
+ functions with new breakpoints.
+
+6. Wait for thread progress.
+
+7. Commit all staged breadpoints by switching `erts_active_bp_index`.
+
+8. Wait for thread progress.
+
+
+9. Restore original beam instruction for disabled breakpoints.
+
+10. Wait for thread progress.
+
+11. Prepare for next call to `trace_pattern` by updating the new
+ staging area (the old active) for all enabled breakpoints.
+
+12. Deallocate disabled breakpoint structures.
+
+13. Release code write permission and return from `trace_pattern`.
+
+
+### All that Waiting for Thread Progress
+
+There are four rounds of waiting for thread progress in the above
+sequence. In the code loading sequence we sacrificed memory overhead
+of three generations to avoid a second round of thread progress. The
+latency of `trace_pattern` should not be such a big problem for
+however, as it is normally not called in a rapid sequence.
+
+The waiting in step 4 is to make sure all threads will see an updated
+view of the breakpoint structures once they become reachable through
+the `op_i_generic_breakpoint` instruction written in step 5.
+
+The waiting in step 6 is to make the activation of the new trace
+settings "as atomic as possible". Different cores might see the new
+value of `erts_active_bp_index` at different times as it is read
+without any memory barrier. But this is the best we can do without
+more expensive thread synchronization.
+
+The waiting in step 8 is to make sure we dont't restore the original
+bream instructions for disabled breakpoints until we know that no
+thread is still accessing the old enabled part of a disabled
+breakpoint.
+
+The waiting in step 10 is to make sure no lingering thread is still
+accessing disabled breakpoint structures to be deallocated in step
+12.
+
+
+Global Tracing
+--------------
+
+Call tracing with `global` option only affects external function
+calls. This was earlier handled by inserting a special trace
+instruction in export entries without the use of breakpoints. With the
+new non-blocking tracing we want to avoid special handling for global
+tracing and make use of the staging and atomic switching within the
+breakpoint mechanism. The solution was to create the same type of
+breakpoint structure for a global call trace. The difference to local
+tracing is that we insert the `op_i_generic_breakpoint` instruction
+(with its pointer at offset -4) in the export entry rather than in the
+code.
+
+
+Future work
+-----------
+
+We still go to single threaded mode when new code is loaded for a
+module that is traced, or when loading code when there is a default
+trace pattern set. That is not impossible to fix, but that requires
+much closer cooperation between tracing BIFs and the loader BIFs.
diff --git a/erts/emulator/sys/unix/erl_unix_sys_ddll.c b/erts/emulator/sys/unix/erl_unix_sys_ddll.c
index 12c47d0088..8760b58839 100644
--- a/erts/emulator/sys/unix/erl_unix_sys_ddll.c
+++ b/erts/emulator/sys/unix/erl_unix_sys_ddll.c
@@ -101,7 +101,7 @@ void erl_sys_ddll_init(void) {
/*
* Open a shared object
*/
-int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* err)
+int erts_sys_ddll_open(const char *full_name, void **handle, ErtsSysDdllError* err)
{
#if defined(HAVE_DLOPEN)
char* dlname;
diff --git a/erts/emulator/sys/unix/sys.c b/erts/emulator/sys/unix/sys.c
index 61f9f6a59a..59e34eb819 100644
--- a/erts/emulator/sys/unix/sys.c
+++ b/erts/emulator/sys/unix/sys.c
@@ -547,6 +547,25 @@ erts_sys_pre_init(void)
#endif
#endif /* USE_THREADS */
erts_smp_atomic_init_nob(&sys_misc_mem_sz, 0);
+
+ {
+ /*
+ * Unfortunately we depend on fd 0,1,2 in the old shell code.
+ * So if for some reason we do not have those open when we start
+ * we have to open them here. Not doing this can cause the emulator
+ * to deadlock when reaping the fd_driver ports :(
+ */
+ int fd;
+ /* Make sure fd 0 is open */
+ if ((fd = open("/dev/null", O_RDONLY)) != 0)
+ close(fd);
+ /* Make sure fds 1 and 2 are open */
+ while (fd < 3) {
+ fd = open("/dev/null", O_WRONLY);
+ }
+ close(fd);
+ }
+
}
void
diff --git a/erts/emulator/sys/win32/erl_win32_sys_ddll.c b/erts/emulator/sys/win32/erl_win32_sys_ddll.c
index 2d3f073cc2..338f0d7386 100644
--- a/erts/emulator/sys/win32/erl_win32_sys_ddll.c
+++ b/erts/emulator/sys/win32/erl_win32_sys_ddll.c
@@ -59,7 +59,7 @@ void erl_sys_ddll_init(void) {
* Open a shared object
* Expecting 'full_name' as an UTF-8 string.
*/
-int erts_sys_ddll_open2(const char *full_name, void **handle, ErtsSysDdllError* err)
+int erts_sys_ddll_open(const char *full_name, void **handle, ErtsSysDdllError* err)
{
HINSTANCE hinstance;
int len;
diff --git a/erts/emulator/sys/win32/erl_win_dyn_driver.h b/erts/emulator/sys/win32/erl_win_dyn_driver.h
index b9a9838a36..4010d939e5 100644
--- a/erts/emulator/sys/win32/erl_win_dyn_driver.h
+++ b/erts/emulator/sys/win32/erl_win_dyn_driver.h
@@ -82,7 +82,6 @@ WDD_TYPEDEF(int, erl_drv_send_term, (ErlDrvTermData, ErlDrvTermData, ErlDrvTermD
WDD_TYPEDEF(int, driver_send_term, (ErlDrvPort, ErlDrvTermData, ErlDrvTermData*, int));
WDD_TYPEDEF(unsigned int, driver_async_port_key, (ErlDrvPort));
WDD_TYPEDEF(long, driver_async, (ErlDrvPort,unsigned int*,void (*)(void*),void*,void (*)(void*)));
-WDD_TYPEDEF(int, driver_async_cancel, (unsigned int));
WDD_TYPEDEF(int, driver_lock_driver, (ErlDrvPort));
WDD_TYPEDEF(void *, driver_dl_open, (char *));
WDD_TYPEDEF(void *, driver_dl_sym, (void *, char *));
@@ -200,7 +199,6 @@ typedef struct {
WDD_FTYPE(driver_send_term) *driver_send_term;
WDD_FTYPE(driver_async_port_key) *driver_async_port_key;
WDD_FTYPE(driver_async) *driver_async;
- WDD_FTYPE(driver_async_cancel) *driver_async_cancel;
WDD_FTYPE(driver_lock_driver) *driver_lock_driver;
WDD_FTYPE(driver_dl_open) *driver_dl_open;
WDD_FTYPE(driver_dl_sym) *driver_dl_sym;
@@ -312,7 +310,6 @@ extern TWinDynDriverCallbacks WinDynDriverCallbacks;
#define driver_send_term (WinDynDriverCallbacks.driver_send_term)
#define driver_async_port_key (WinDynDriverCallbacks.driver_async_port_key)
#define driver_async (WinDynDriverCallbacks.driver_async)
-#define driver_async_cancel (WinDynDriverCallbacks.driver_async_cancel)
#define driver_lock_driver (WinDynDriverCallbacks.driver_lock_driver)
#define driver_dl_open (WinDynDriverCallbacks.driver_dl_open)
#define driver_dl_sym (WinDynDriverCallbacks.driver_dl_sym)
@@ -448,7 +445,6 @@ do { \
((W).driver_send_term) = driver_send_term; \
((W).driver_async_port_key) = driver_async_port_key; \
((W).driver_async) = driver_async; \
-((W).driver_async_cancel) = driver_async_cancel; \
((W).driver_lock_driver) = driver_lock_driver; \
((W).driver_dl_open) = driver_dl_open; \
((W).driver_dl_sym) = driver_dl_sym; \
diff --git a/erts/emulator/test/binary_SUITE.erl b/erts/emulator/test/binary_SUITE.erl
index 44dbb2c588..a390c536bb 100644
--- a/erts/emulator/test/binary_SUITE.erl
+++ b/erts/emulator/test/binary_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -58,10 +58,10 @@
ordering/1,unaligned_order/1,gc_test/1,
bit_sized_binary_sizes/1,
otp_6817/1,deep/1,obsolete_funs/1,robustness/1,otp_8117/1,
- otp_8180/1, ttb_trap/1]).
+ otp_8180/1, trapping/1]).
%% Internal exports.
--export([sleeper/0,ttb_loop/2]).
+-export([sleeper/0,trapping_loop/4]).
suite() -> [{ct_hooks,[ts_install_cth]},
{timetrap,{minutes,2}}].
@@ -76,7 +76,7 @@ all() ->
bad_term_to_binary, more_bad_terms, otp_5484, otp_5933,
ordering, unaligned_order, gc_test,
bit_sized_binary_sizes, otp_6817, otp_8117, deep,
- obsolete_funs, robustness, otp_8180, ttb_trap].
+ obsolete_funs, robustness, otp_8180, trapping].
groups() ->
[].
@@ -447,26 +447,26 @@ terms(Config) when is_list(Config) ->
Sz1 when is_integer(Sz1), size(Bin1) =< Sz1 ->
ok
end,
- Term = binary_to_term(Bin),
- Term = binary_to_term(Bin, [safe]),
+ Term = binary_to_term_stress(Bin),
+ Term = binary_to_term_stress(Bin, [safe]),
Unaligned = make_unaligned_sub_binary(Bin),
- Term = binary_to_term(Unaligned),
- Term = binary_to_term(Unaligned, []),
- Term = binary_to_term(Bin, [safe]),
+ Term = binary_to_term_stress(Unaligned),
+ Term = binary_to_term_stress(Unaligned, []),
+ Term = binary_to_term_stress(Bin, [safe]),
BinC = erlang:term_to_binary(Term, [compressed]),
- Term = binary_to_term(BinC),
+ Term = binary_to_term_stress(BinC),
true = size(BinC) =< size(Bin),
Bin = term_to_binary(Term, [{compressed,0}]),
terms_compression_levels(Term, size(Bin), 1),
UnalignedC = make_unaligned_sub_binary(BinC),
- Term = binary_to_term(UnalignedC)
+ Term = binary_to_term_stress(UnalignedC)
end,
?line test_terms(TestFun),
ok.
terms_compression_levels(Term, UncompressedSz, Level) when Level < 10 ->
BinC = erlang:term_to_binary(Term, [{compressed,Level}]),
- Term = binary_to_term(BinC),
+ Term = binary_to_term_stress(BinC),
Sz = byte_size(BinC),
true = Sz =< UncompressedSz,
terms_compression_levels(Term, UncompressedSz, Level+1);
@@ -476,9 +476,9 @@ terms_float(Config) when is_list(Config) ->
?line test_floats(fun(Term) ->
Bin0 = term_to_binary(Term),
Bin0 = term_to_binary(Term, [{minor_version,0}]),
- Term = binary_to_term(Bin0),
+ Term = binary_to_term_stress(Bin0),
Bin1 = term_to_binary(Term, [{minor_version,1}]),
- Term = binary_to_term(Bin1),
+ Term = binary_to_term_stress(Bin1),
true = size(Bin1) < size(Bin0),
Size0 = erlang:external_size(Term),
Size00 = erlang:external_size(Term, [{minor_version, 0}]),
@@ -490,7 +490,7 @@ terms_float(Config) when is_list(Config) ->
float_middle_endian(Config) when is_list(Config) ->
%% Testing for roundtrip is not enough.
?line <<131,70,63,240,0,0,0,0,0,0>> = term_to_binary(1.0, [{minor_version,1}]),
- ?line 1.0 = binary_to_term(<<131,70,63,240,0,0,0,0,0,0>>).
+ ?line 1.0 = binary_to_term_stress(<<131,70,63,240,0,0,0,0,0,0>>).
external_size(Config) when is_list(Config) ->
%% Build a term whose external size only fits in a big num (on 32-bit CPU).
@@ -506,8 +506,8 @@ external_size(Config) when is_list(Config) ->
io:format("Unaligned size: ~p\n", [Sz2]),
?line ?t:fail()
end,
- ?line erlang:external_size(Bin) =:= erlang:external_size(Bin, [{minor_version, 1}]),
- ?line erlang:external_size(Unaligned) =:= erlang:external_size(Unaligned, [{minor_version, 1}]).
+ true = (erlang:external_size(Bin) =:= erlang:external_size(Bin, [{minor_version, 1}])),
+ true = (erlang:external_size(Unaligned) =:= erlang:external_size(Unaligned, [{minor_version, 1}])).
external_size_1(Term, Size0, Limit) when Size0 < Limit ->
case erlang:external_size(Term) of
@@ -608,10 +608,10 @@ bad_binary_to_term(Config) when is_list(Config) ->
ok.
bad_bin_to_term(BadBin) ->
- {'EXIT',{badarg,_}} = (catch binary_to_term(BadBin)).
+ {'EXIT',{badarg,_}} = (catch binary_to_term_stress(BadBin)).
bad_bin_to_term(BadBin,Opts) ->
- {'EXIT',{badarg,_}} = (catch binary_to_term(BadBin,Opts)).
+ {'EXIT',{badarg,_}} = (catch binary_to_term_stress(BadBin,Opts)).
safe_binary_to_term2(doc) -> "Test safety options for binary_to_term/2";
safe_binary_to_term2(Config) when is_list(Config) ->
@@ -622,7 +622,7 @@ safe_binary_to_term2(Config) when is_list(Config) ->
BadRef = <<131,114,0,3,BadHostAtom/binary,0,<<0,0,0,255>>/binary,
Empty/binary,Empty/binary>>,
?line bad_bin_to_term(BadRef, [safe]), % good ref, with a bad atom
- ?line fullsweep_after = binary_to_term(<<131,100,0,15,"fullsweep_after">>, [safe]), % should be a good atom
+ ?line fullsweep_after = binary_to_term_stress(<<131,100,0,15,"fullsweep_after">>, [safe]), % should be a good atom
BadExtFun = <<131,113,100,0,4,98,108,117,101,100,0,4,109,111,111,110,97,3>>,
?line bad_bin_to_term(BadExtFun, [safe]),
ok.
@@ -679,14 +679,14 @@ corrupter0(Term) ->
corrupter(Bin, Pos) when Pos >= 0 ->
?line {ShorterBin, Rest} = split_binary(Bin, Pos),
- ?line catch binary_to_term(ShorterBin), %% emulator shouldn't crash
+ ?line catch binary_to_term_stress(ShorterBin), %% emulator shouldn't crash
?line MovedBin = list_to_binary([ShorterBin]),
- ?line catch binary_to_term(MovedBin), %% emulator shouldn't crash
+ ?line catch binary_to_term_stress(MovedBin), %% emulator shouldn't crash
%% Bit faults, shouldn't crash
<<Byte,Tail/binary>> = Rest,
Fun = fun(M) -> FaultyByte = Byte bxor M,
- catch binary_to_term(<<ShorterBin/binary,
+ catch binary_to_term_stress(<<ShorterBin/binary,
FaultyByte, Tail/binary>>) end,
?line lists:foreach(Fun,[1,2,4,8,16,32,64,128,255]),
?line corrupter(Bin, Pos-1);
@@ -700,7 +700,7 @@ more_bad_terms(Config) when is_list(Config) ->
?line ok = io:format("File: ~s\n", [BadFile]),
?line case file:read_file(BadFile) of
{ok,Bin} ->
- ?line {'EXIT',{badarg,_}} = (catch binary_to_term(Bin)),
+ ?line {'EXIT',{badarg,_}} = (catch binary_to_term_stress(Bin)),
ok;
Other ->
?line ?t:fail(Other)
@@ -709,7 +709,7 @@ more_bad_terms(Config) when is_list(Config) ->
otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
<<131,
104,2, %Tuple, 2 elements
103, %Pid
@@ -722,7 +722,7 @@ otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
<<131,
104,2, %Tuple, 2 elements
103, %Pid
@@ -734,13 +734,13 @@ otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
%% A old-type fun in a list containing a bad creator pid.
<<131,108,0,0,0,1,117,0,0,0,0,103,100,0,13,110,111,110,111,100,101,64,110,111,104,111,115,116,255,255,0,25,255,0,0,0,0,100,0,1,116,97,0,98,6,142,121,72,106>>)),
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
%% A new-type fun in a list containing a bad creator pid.
%%
<<131,
@@ -752,7 +752,7 @@ otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
%% A new-type fun in a list containing a bad module.
<<131,
108,0,0,0,1, %List, 1 element
@@ -763,7 +763,7 @@ otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
%% A new-type fun in a list containing a bad index.
<<131,
108,0,0,0,1, %List, 1 element
@@ -775,7 +775,7 @@ otp_5484(Config) when is_list(Config) ->
?line {'EXIT',_} =
(catch
- binary_to_term(
+ binary_to_term_stress(
%% A new-type fun in a list containing a bad unique value.
<<131,
108,0,0,0,1, %List, 1 element
@@ -788,46 +788,46 @@ otp_5484(Config) when is_list(Config) ->
%% An absurdly large atom.
?line {'EXIT',_} =
- (catch binary_to_term(iolist_to_binary([<<131,100,65000:16>>|
+ (catch binary_to_term_stress(iolist_to_binary([<<131,100,65000:16>>|
lists:duplicate(65000, 42)]))),
%% Longer than 255 characters.
?line {'EXIT',_} =
- (catch binary_to_term(iolist_to_binary([<<131,100,256:16>>|
+ (catch binary_to_term_stress(iolist_to_binary([<<131,100,256:16>>|
lists:duplicate(256, 42)]))),
%% OTP-7218. Thanks to Matthew Dempsky. Also make sure that we
%% cover the other error cases for external funs (EXPORT_EXT).
?line {'EXIT',_} =
- (catch binary_to_term(
+ (catch binary_to_term_stress(
<<131,
113, %EXPORT_EXP
97,13, %Integer: 13
97,13, %Integer: 13
97,13>>)), %Integer: 13
?line {'EXIT',_} =
- (catch binary_to_term(
+ (catch binary_to_term_stress(
<<131,
113, %EXPORT_EXP
100,0,1,64, %Atom: '@'
97,13, %Integer: 13
97,13>>)), %Integer: 13
?line {'EXIT',_} =
- (catch binary_to_term(
+ (catch binary_to_term_stress(
<<131,
113, %EXPORT_EXP
100,0,1,64, %Atom: '@'
100,0,1,64, %Atom: '@'
106>>)), %NIL
?line {'EXIT',_} =
- (catch binary_to_term(
+ (catch binary_to_term_stress(
<<131,
113, %EXPORT_EXP
100,0,1,64, %Atom: '@'
100,0,1,64, %Atom: '@'
98,255,255,255,255>>)), %Integer: -1
?line {'EXIT',_} =
- (catch binary_to_term(
+ (catch binary_to_term_stress(
<<131,
113, %EXPORT_EXP
100,0,1,64, %Atom: '@'
@@ -835,7 +835,7 @@ otp_5484(Config) when is_list(Config) ->
113,97,13,97,13,97,13>>)), %fun 13:13/13
%% Bad funs.
- ?line {'EXIT',_} = (catch binary_to_term(fake_fun(0, lists:seq(0, 256)))),
+ ?line {'EXIT',_} = (catch binary_to_term_stress(fake_fun(0, lists:seq(0, 256)))),
ok.
fake_fun(Arity, Env0) ->
@@ -869,7 +869,7 @@ try_bad_lengths(B) ->
try_bad_lengths(B, L) when L > 16#FFFFFFF0 ->
Bin = <<B/binary,L:32>>,
io:format("~p\n", [Bin]),
- {'EXIT',_} = (catch binary_to_term(Bin)),
+ {'EXIT',_} = (catch binary_to_term_stress(Bin)),
try_bad_lengths(B, L-1);
try_bad_lengths(_, _) -> ok.
@@ -923,7 +923,7 @@ otp_6817_try_bin(Bin) ->
%% If the bug is present, the heap pointer will moved when the invalid term
%% is found and we will have a linked list passing through the limbo area
%% between the heap top and the stack pointer.
- catch binary_to_term(Bin),
+ catch binary_to_term_stress(Bin),
%% If the bug is present, we will overwrite the pointers in the limbo area.
Filler = erlang:make_tuple(1024, 16#3FA),
@@ -1238,24 +1238,35 @@ bit_sized_binary_sizes(Config) when is_list(Config) ->
bsbs_1(A) ->
BinSize = 32+A,
io:format("A: ~p BinSize: ~p", [A,BinSize]),
- Bin = binary_to_term(<<131,$M,5:32,A,0,0,0,0,0>>),
+ Bin = binary_to_term_stress(<<131,$M,5:32,A,0,0,0,0,0>>),
BinSize = bit_size(Bin).
+%% lists:foldl(_,_,lists:seq(_,_)) with less heap consumption
+lists_foldl_seq(Fun, Acc0, N, To) when N =< To ->
+ Acc1 = Fun(N, Acc0),
+ lists_foldl_seq(Fun, Acc1, N+1, To);
+
+lists_foldl_seq(_, Acc, _, _) ->
+ Acc.
+
deep(Config) when is_list(Config) ->
- ?line deep_roundtrip(lists:foldl(fun(E, A) ->
- [E,A]
- end, [], lists:seq(1, 1000000))),
- ?line deep_roundtrip(lists:foldl(fun(E, A) ->
- {E,A}
- end, [], lists:seq(1, 1000000))),
- ?line deep_roundtrip(lists:foldl(fun(E, A) ->
- fun() -> {E,A} end
- end, [], lists:seq(1, 1000000))),
+ deep_roundtrip(lists_foldl_seq(fun(E, A) ->
+ [E,A]
+ end, [], 1, 1000000)),
+ erlang:garbage_collect(),
+ deep_roundtrip(lists_foldl_seq(fun(E, A) ->
+ {E,A}
+ end, [], 1, 1000000)),
+ erlang:garbage_collect(),
+ deep_roundtrip(lists_foldl_seq(fun(E, A) ->
+ fun() -> {E,A} end
+ end, [], 1, 1000000)),
+ erlang:garbage_collect(),
ok.
deep_roundtrip(T) ->
B = term_to_binary(T),
- T = binary_to_term(B).
+ T = binary_to_term_stress(B).
obsolete_funs(Config) when is_list(Config) ->
erts_debug:set_internal_state(available_internal_state, true),
@@ -1290,29 +1301,29 @@ obsolete_fun(Fun) ->
Tuple = no_fun_roundtrip(Fun).
no_fun_roundtrip(Term) ->
- binary_to_term(erts_debug:get_internal_state({term_to_binary_no_funs,Term})).
+ binary_to_term_stress(erts_debug:get_internal_state({term_to_binary_no_funs,Term})).
%% Test non-standard encodings never generated by term_to_binary/1
%% but recognized by binary_to_term/1.
robustness(Config) when is_list(Config) ->
- ?line [] = binary_to_term(<<131,107,0,0>>), %Empty string.
- ?line [] = binary_to_term(<<131,108,0,0,0,0,106>>), %Zero-length list.
+ ?line [] = binary_to_term_stress(<<131,107,0,0>>), %Empty string.
+ ?line [] = binary_to_term_stress(<<131,108,0,0,0,0,106>>), %Zero-length list.
%% {[],a} where [] is a zero-length list.
- ?line {[],a} = binary_to_term(<<131,104,2,108,0,0,0,0,106,100,0,1,97>>),
+ ?line {[],a} = binary_to_term_stress(<<131,104,2,108,0,0,0,0,106,100,0,1,97>>),
%% {42,a} where 42 is a zero-length list with 42 in the tail.
- ?line {42,a} = binary_to_term(<<131,104,2,108,0,0,0,0,97,42,100,0,1,97>>),
+ ?line {42,a} = binary_to_term_stress(<<131,104,2,108,0,0,0,0,97,42,100,0,1,97>>),
%% {{x,y},a} where {x,y} is a zero-length list with {x,y} in the tail.
- ?line {{x,y},a} = binary_to_term(<<131,104,2,108,0,0,0,0,
+ ?line {{x,y},a} = binary_to_term_stress(<<131,104,2,108,0,0,0,0,
104,2,100,0,1,120,100,0,1,
121,100,0,1,97>>),
%% Bignums fitting in 32 bits.
- ?line 16#7FFFFFFF = binary_to_term(<<131,98,127,255,255,255>>),
- ?line -1 = binary_to_term(<<131,98,255,255,255,255>>),
+ ?line 16#7FFFFFFF = binary_to_term_stress(<<131,98,127,255,255,255>>),
+ ?line -1 = binary_to_term_stress(<<131,98,255,255,255,255>>),
ok.
@@ -1330,40 +1341,48 @@ run_otp_8180(Name) ->
?line {ok,Bins} = file:consult(Name),
[begin
io:format("~p\n", [Bin]),
- ?line {'EXIT',{badarg,_}} = (catch binary_to_term(Bin))
+ ?line {'EXIT',{badarg,_}} = (catch binary_to_term_stress(Bin))
end || Bin <- Bins],
ok.
-%% Test that exit and GC during term_to_binary trap does not crash.
-ttb_trap(Config) when is_list(Config)->
- case erlang:system_info(wordsize) of
- N when N < 8 ->
- {skipped, "Only on 64bit machines"};
- _ ->
- do_ttb_trap(5)
- end.
+%% Test that exit and GC during trapping term_to_binary and binary_to_term
+%% does not crash.
+trapping(Config) when is_list(Config)->
+ do_trapping(5, term_to_binary,
+ fun() -> [lists:duplicate(2000000,2000000)] end),
+ do_trapping(5, binary_to_term,
+ fun() -> [term_to_binary(lists:duplicate(2000000,2000000))] end).
-do_ttb_trap(0) ->
+do_trapping(0, _, _) ->
ok;
-do_ttb_trap(N) ->
- Pid = spawn(?MODULE,ttb_loop,[1000,self()]),
+do_trapping(N, Bif, ArgFun) ->
+ io:format("N=~p: Do ~p ~s gc.\n", [N, Bif, case N rem 2 of 0 -> "with"; 1 -> "without" end]),
+ Pid = spawn(?MODULE,trapping_loop,[Bif, ArgFun, 1000, self()]),
receive ok -> ok end,
receive after 100 -> ok end,
- erlang:garbage_collect(Pid),
- receive after 100 -> ok end,
+ Ref = make_ref(),
+ case N rem 2 of
+ 0 -> erlang:garbage_collect(Pid, [{async,Ref}]),
+ receive after 100 -> ok end;
+ 1 -> void
+ end,
exit(Pid,kill),
+ case N rem 2 of
+ 0 -> receive {garbage_collect, Ref, _} -> ok end;
+ 1 -> void
+ end,
receive after 1 -> ok end,
- do_ttb_trap(N-1).
+ do_trapping(N-1, Bif, ArgFun).
-ttb_loop(N,Pid) ->
- Term = lists:duplicate(2000000,2000000),
+trapping_loop(Bif, ArgFun, N, Pid) ->
+ Args = ArgFun(),
Pid ! ok,
- ttb_loop2(N,Term).
-ttb_loop2(0,_T) ->
+ trapping_loop2(Bif,Args,N).
+trapping_loop2(_,_,0) ->
ok;
-ttb_loop2(N,T) ->
- apply(erlang,term_to_binary,[T]),
- ttb_loop2(N-1,T).
+trapping_loop2(Bif,Args,N) ->
+ apply(erlang,Bif,Args),
+ trapping_loop2(Bif, Args, N-1).
%% Utilities.
@@ -1399,3 +1418,52 @@ unaligned_sub_bin(Bin0, Offs) ->
Bin.
id(I) -> I.
+
+
+%% Stress binary_to_term with different initial reductions
+binary_to_term_stress(Bin) ->
+ binary_to_term_stress(Bin, no_opts).
+
+binary_to_term_stress(Bin, Opts) ->
+ Reds = get_reds(),
+ T = b2t(erlang:system_info(context_reductions),
+ Bin, Opts, catch_binary_to_term(Bin, Opts)),
+ set_reds(Reds),
+ T = case Opts of
+ no_opts -> binary_to_term(Bin);
+ _ -> binary_to_term(Bin,Opts)
+ end.
+
+catch_binary_to_term(Bin, no_opts) ->
+ try binary_to_term(Bin)
+ catch
+ error:badarg -> binary_to_term_throws_badarg
+ end;
+catch_binary_to_term(Bin, Opts) ->
+ try binary_to_term(Bin, Opts)
+ catch
+ error:badarg -> binary_to_term_throws_badarg
+ end.
+
+b2t(0, _Bin, _Opts, Term) ->
+ Term;
+b2t(Reds, Bin, Opts, Term) ->
+ set_reds(Reds),
+ Term = catch_binary_to_term(Bin,Opts),
+ b2t(Reds div 3, Bin, Opts, Term).
+
+set_reds(Reds) ->
+ try erts_debug:set_internal_state(reds_left, Reds)
+ catch
+ error:undef ->
+ erts_debug:set_internal_state(available_internal_state, true),
+ set_reds(Reds)
+ end.
+
+get_reds() ->
+ try erts_debug:get_internal_state(reds_left)
+ catch
+ error:undef ->
+ erts_debug:set_internal_state(available_internal_state, true),
+ get_reds()
+ end.
diff --git a/erts/emulator/test/driver_SUITE.erl b/erts/emulator/test/driver_SUITE.erl
index 7087542899..06211406b4 100644
--- a/erts/emulator/test/driver_SUITE.erl
+++ b/erts/emulator/test/driver_SUITE.erl
@@ -2075,6 +2075,21 @@ thr_msg_blast(Config) when is_list(Config) ->
Res
end.
+-define(IN_RANGE(LoW_, VaLuE_, HiGh_),
+ case in_range(LoW_, VaLuE_, HiGh_) of
+ true -> ok;
+ false ->
+ case erlang:system_info(lock_checking) of
+ true ->
+ ?t:format("~p:~p: Ignore bad sched count due to "
+ "lock checking~n",
+ [?MODULE,?LINE]);
+ false ->
+ ?t:fail({unexpected_sched_counts, VaLuE_})
+ end
+ end).
+
+
consume_timeslice(Config) when is_list(Config) ->
%%
%% Verify that erl_drv_consume_timeslice() works.
@@ -2131,15 +2146,8 @@ consume_timeslice(Config) when is_list(Config) ->
Proc1 ! Go,
wait_command_msgs(Port, 10),
[{Port, Sprt1}, {Proc1, Sproc1}] = count_pp_sched_stop([Port, Proc1]),
- case Sprt1 of
- 10 ->
- true = in_range(5, Sproc1-10, 7);
- _ ->
- case erlang:system_info(lock_checking) of
- true -> ?t:format("Ignore bad sched count due to lock checking", []);
- false -> ?t:fail({unexpected_sched_counts, Sprt1, Sproc1})
- end
- end,
+ ?IN_RANGE(10, Sprt1, 10),
+ ?IN_RANGE(5, Sproc1-10, 7),
"disabled" = port_control(Port, $D, ""),
Proc2 = spawn_link(fun () ->
@@ -2160,15 +2168,8 @@ consume_timeslice(Config) when is_list(Config) ->
Proc2 ! Go,
wait_command_msgs(Port, 10),
[{Port, Sprt2}, {Proc2, Sproc2}] = count_pp_sched_stop([Port, Proc2]),
- case Sprt2 of
- 10 ->
- true = in_range(1, Sproc2-10, 2);
- _ ->
- case erlang:system_info(lock_checking) of
- true -> ?t:format("Ignore bad sched count due to lock checking", []);
- false -> ?t:fail({unexpected_sched_counts, Sprt2, Sproc2})
- end
- end,
+ ?IN_RANGE(10, Sprt2, 10),
+ ?IN_RANGE(1, Sproc2-10, 2),
"enabled" = port_control(Port, $E, ""),
Proc3 = spawn_link(fun () ->
@@ -2188,15 +2189,8 @@ consume_timeslice(Config) when is_list(Config) ->
Proc3 ! Go,
wait_command_msgs(Port, 10),
[{Port, Sprt3}, {Proc3, Sproc3}] = count_pp_sched_stop([Port, Proc3]),
- case Sprt3 of
- 10 ->
- true = in_range(5, Sproc3-10, 7);
- _ ->
- case erlang:system_info(lock_checking) of
- true -> ?t:format("Ignore bad sched count due to lock checking", []);
- false -> ?t:fail({unexpected_sched_counts, Sprt3, Sproc3})
- end
- end,
+ ?IN_RANGE(10, Sprt3, 10),
+ ?IN_RANGE(5, Sproc3-10, 7),
"disabled" = port_control(Port, $D, ""),
Proc4 = spawn_link(fun () ->
@@ -2216,15 +2210,8 @@ consume_timeslice(Config) when is_list(Config) ->
Proc4 ! Go,
wait_command_msgs(Port, 10),
[{Port, Sprt4}, {Proc4, Sproc4}] = count_pp_sched_stop([Port, Proc4]),
- case Sprt4 of
- 10 ->
- true = in_range(1, Sproc4-10, 2);
- _ ->
- case erlang:system_info(lock_checking) of
- true -> ?t:format("Ignore bad sched count due to lock checking", []);
- false -> ?t:fail({unexpected_sched_counts, Sprt4, Sproc4})
- end
- end,
+ ?IN_RANGE(10, Sprt4, 10),
+ ?IN_RANGE(1, Sproc4-10, 2),
SOnl = erlang:system_info(schedulers_online),
%% If only one scheduler use port with parallelism set to true,
@@ -2272,8 +2259,8 @@ consume_timeslice(Config) when is_list(Config) ->
wait_procs_exit([W5, Proc5]),
wait_command_msgs(Port2, 10),
[{Port2, Sprt5}, {Proc5, Sproc5}] = count_pp_sched_stop([Port2, Proc5]),
- true = in_range(2, Sproc5, 3),
- true = in_range(7, Sprt5, 20),
+ ?IN_RANGE(2, Sproc5, 3),
+ ?IN_RANGE(6, Sprt5, 20),
count_pp_sched_start(),
"disabled" = port_control(Port2, $D, ""),
@@ -2307,8 +2294,8 @@ consume_timeslice(Config) when is_list(Config) ->
wait_procs_exit([W6, Proc6]),
wait_command_msgs(Port2, 10),
[{Port2, Sprt6}, {Proc6, Sproc6}] = count_pp_sched_stop([Port2, Proc6]),
- true = in_range(2, Sproc6, 3),
- true = in_range(3, Sprt6, 6),
+ ?IN_RANGE(2, Sproc6, 3),
+ ?IN_RANGE(2, Sprt6, 6),
process_flag(scheduler, 0),
@@ -2316,6 +2303,7 @@ consume_timeslice(Config) when is_list(Config) ->
receive {Port2, closed} -> ok end,
ok.
+
wait_command_msgs(_, 0) ->
ok;
wait_command_msgs(Port, N) ->
diff --git a/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c b/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c
index 9d8bbac231..e2b338f801 100644
--- a/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c
+++ b/erts/emulator/test/driver_SUITE_data/ioq_exit_drv.c
@@ -277,10 +277,6 @@ static void stop(ErlDrvData drv_data)
case IOQ_EXIT_TIMEOUT_ASYNC:
driver_cancel_timer(ddp->port);
break;
- case IOQ_EXIT_READY_ASYNC:
- if (ddp->outstanding_async_task)
- driver_async_cancel(ddp->async_task);
- break;
default:
break;
}
diff --git a/erts/emulator/test/driver_SUITE_data/otp_9302_drv.c b/erts/emulator/test/driver_SUITE_data/otp_9302_drv.c
index 88df73f696..7c144d20cf 100644
--- a/erts/emulator/test/driver_SUITE_data/otp_9302_drv.c
+++ b/erts/emulator/test/driver_SUITE_data/otp_9302_drv.c
@@ -227,6 +227,4 @@ static void output(ErlDrvData drv_data,
ad[4]->term_data.msg = driver_mk_atom("end_of_jobs");
for (i = 0; i < sizeof(id)/sizeof(id[0]); i++)
id[i] = driver_async(data->port, &key, async_invoke, ad[i], driver_free);
- if (id[2] > 0)
- driver_async_cancel(id[2]);
}
diff --git a/erts/emulator/test/driver_SUITE_data/sys_info_base_drv.c b/erts/emulator/test/driver_SUITE_data/sys_info_base_drv.c
index c22a415c59..e44c7dbd5e 100644
--- a/erts/emulator/test/driver_SUITE_data/sys_info_base_drv.c
+++ b/erts/emulator/test/driver_SUITE_data/sys_info_base_drv.c
@@ -19,14 +19,14 @@
/*
* Author: Rickard Green
*
- * Description: Driver that fakes driver version 2.0 and tests
+ * Description: Driver that fakes driver version 3.0 and tests
* driver_system_info().
*
*/
#include "sys_info_drv_impl.h"
-#define SYS_INFO_DRV_MAJOR_VSN 2
+#define SYS_INFO_DRV_MAJOR_VSN 3
#define SYS_INFO_DRV_MINOR_VSN 0
#define SYS_INFO_DRV_NAME_STR "sys_info_base_drv"
#define SYS_INFO_DRV_NAME sys_info_base_drv
diff --git a/erts/emulator/test/driver_SUITE_data/sys_info_prev_drv.c b/erts/emulator/test/driver_SUITE_data/sys_info_prev_drv.c
index 815d96cc97..63c69f751c 100644
--- a/erts/emulator/test/driver_SUITE_data/sys_info_prev_drv.c
+++ b/erts/emulator/test/driver_SUITE_data/sys_info_prev_drv.c
@@ -19,14 +19,14 @@
/*
* Author: Rickard Green
*
- * Description: Driver that fakes driver version 2.0 and tests
+ * Description: Driver that fakes driver version 3.0 and tests
* driver_system_info().
*
*/
#include "sys_info_drv_impl.h"
-#define SYS_INFO_DRV_MAJOR_VSN 2
+#define SYS_INFO_DRV_MAJOR_VSN 3
#define SYS_INFO_DRV_MINOR_VSN 0
#define SYS_INFO_DRV_NAME_STR "sys_info_prev_drv"
#define SYS_INFO_DRV_NAME sys_info_prev_drv
diff --git a/erts/emulator/test/exception_SUITE.erl b/erts/emulator/test/exception_SUITE.erl
index 109cec25cb..09a7a87a9a 100644
--- a/erts/emulator/test/exception_SUITE.erl
+++ b/erts/emulator/test/exception_SUITE.erl
@@ -589,6 +589,13 @@ line_numbers(Config) when is_list(Config) ->
[{file,ModFile},{line,_}]}|_]}} =
(catch build_binary2(8, bad_binary)),
+ <<"abc",357:16>> = build_binary3(<<"abc">>),
+ {'EXIT',{badarg,[{?MODULE,build_binary3,1,
+ [{file,"bit_syntax.erl"},{line,72511}]},
+ {?MODULE,line_numbers,1,
+ [{file,ModFile},{line,_}]}|_]}} =
+ (catch build_binary3(no_binary)),
+
{'EXIT',{function_clause,
[{?MODULE,do_call_abs,[y,y],
[{file,"gc_bif.erl"},{line,18}]},
@@ -691,6 +698,10 @@ build_binary2(Size, Bin) -> %Line 72505
id(0), %Line 72506
<<7:Size,Bin/binary>>. %Line 72507
+build_binary3(Bin) -> %Line 72509
+ id(0), %Line 72510
+ <<Bin/binary,357:16>>. %Line 72511
+
-file("gc_bif.erl", 17).
do_call_abs(x, Arg) -> %Line 18
abs(Arg). %Line 19
diff --git a/erts/emulator/test/match_spec_SUITE.erl b/erts/emulator/test/match_spec_SUITE.erl
index bcc46d78ba..330bef7104 100644
--- a/erts/emulator/test/match_spec_SUITE.erl
+++ b/erts/emulator/test/match_spec_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -25,6 +25,7 @@
trace_control_word/1, silent/1, silent_no_ms/1, silent_test/1,
ms_trace2/1, ms_trace3/1, boxed_and_small/1,
destructive_in_test_bif/1, guard_exceptions/1,
+ empty_list/1,
unary_plus/1, unary_minus/1, moving_labels/1]).
-export([fpe/1]).
-export([otp_9422/1]).
@@ -60,6 +61,7 @@ all() ->
guard_exceptions, unary_plus, unary_minus, fpe,
moving_labels,
faulty_seq_trace,
+ empty_list,
otp_9422];
true -> [not_run]
end.
@@ -897,6 +899,11 @@ fpe(Config) when is_list(Config) ->
_ -> ok
end.
+empty_list(Config) when is_list(Config) ->
+ Val=[{'$1',[], [{message,'$1'},{message,{caller}},{return_trace}]}],
+ %% Did crash debug VM in faulty assert:
+ erlang:match_spec_test([],Val,trace).
+
moving_labels(Config) when is_list(Config) ->
%% Force an andalso/orelse construction to be moved by placing it
%% in a tuple followed by a constant term. Labels should still
diff --git a/erts/emulator/test/scheduler_SUITE.erl b/erts/emulator/test/scheduler_SUITE.erl
index 81539faa09..6a43e2b0e7 100644
--- a/erts/emulator/test/scheduler_SUITE.erl
+++ b/erts/emulator/test/scheduler_SUITE.erl
@@ -1495,7 +1495,7 @@ mcall(Node, Funs) ->
end, Refs).
erl_rel_flag_var() ->
- "ERL_"++erlang:system_info(otp_release)++"_FLAGS".
+ "ERL_OTP"++erlang:system_info(otp_release)++"_FLAGS".
clear_erl_rel_flags() ->
EnvVar = erl_rel_flag_var(),
diff --git a/erts/emulator/utils/make_version b/erts/emulator/utils/make_version
index 7757fa8138..02b68f2b39 100755
--- a/erts/emulator/utils/make_version
+++ b/erts/emulator/utils/make_version
@@ -41,6 +41,9 @@ if ($ARGV[0] eq '-o') {
my $release = shift;
defined $release or die "No release specified";
+my $correction_package = shift;
+defined $correction_package or die "No correction package specified";
+
my $version = shift;
defined $version or die "No version name specified";
@@ -53,6 +56,7 @@ open(FILE, ">$outputfile") or die "Can't create $outputfile: $!";
print FILE <<EOF;
/* This file was created by 'make_version' -- don't modify. */
#define ERLANG_OTP_RELEASE "$release"
+#define ERLANG_OTP_CORRECTION_PACKAGE "$correction_package"
#define ERLANG_VERSION "$version"
#define ERLANG_COMPILE_DATE "$time_str"
#define ERLANG_ARCHITECTURE "$architecture"
diff --git a/erts/emulator/zlib/adler32.c b/erts/emulator/zlib/adler32.c
index 4368c31d70..c693a42b7c 100644
--- a/erts/emulator/zlib/adler32.c
+++ b/erts/emulator/zlib/adler32.c
@@ -1,19 +1,20 @@
/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-2004 Mark Adler
+ * Copyright (C) 1995-2011 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#define ZLIB_INTERNAL
-#include "zlib.h"
+#include "zutil.h"
+
+#define local static
+
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
-#define BASE 65521UL /* largest prime smaller than 65536 */
+#define BASE 65521 /* largest prime smaller than 65536 */
#define NMAX 5552
/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
@@ -23,39 +24,44 @@
#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
#define DO16(buf) DO8(buf,0); DO8(buf,8);
-/* use NO_DIVIDE if your processor does not do division in hardware */
+/* use NO_DIVIDE if your processor does not do division in hardware --
+ try it both ways to see which is faster */
#ifdef NO_DIVIDE
-# define MOD(a) \
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
+ (thank you to John Reiser for pointing this out) */
+# define CHOP(a) \
+ do { \
+ unsigned long tmp = a >> 16; \
+ a &= 0xffffUL; \
+ a += (tmp << 4) - tmp; \
+ } while (0)
+# define MOD28(a) \
do { \
- if (a >= (BASE << 16)) a -= (BASE << 16); \
- if (a >= (BASE << 15)) a -= (BASE << 15); \
- if (a >= (BASE << 14)) a -= (BASE << 14); \
- if (a >= (BASE << 13)) a -= (BASE << 13); \
- if (a >= (BASE << 12)) a -= (BASE << 12); \
- if (a >= (BASE << 11)) a -= (BASE << 11); \
- if (a >= (BASE << 10)) a -= (BASE << 10); \
- if (a >= (BASE << 9)) a -= (BASE << 9); \
- if (a >= (BASE << 8)) a -= (BASE << 8); \
- if (a >= (BASE << 7)) a -= (BASE << 7); \
- if (a >= (BASE << 6)) a -= (BASE << 6); \
- if (a >= (BASE << 5)) a -= (BASE << 5); \
- if (a >= (BASE << 4)) a -= (BASE << 4); \
- if (a >= (BASE << 3)) a -= (BASE << 3); \
- if (a >= (BASE << 2)) a -= (BASE << 2); \
- if (a >= (BASE << 1)) a -= (BASE << 1); \
+ CHOP(a); \
if (a >= BASE) a -= BASE; \
} while (0)
-# define MOD4(a) \
+# define MOD(a) \
do { \
- if (a >= (BASE << 4)) a -= (BASE << 4); \
- if (a >= (BASE << 3)) a -= (BASE << 3); \
- if (a >= (BASE << 2)) a -= (BASE << 2); \
- if (a >= (BASE << 1)) a -= (BASE << 1); \
+ CHOP(a); \
+ MOD28(a); \
+ } while (0)
+# define MOD63(a) \
+ do { /* this assumes a is not negative */ \
+ z_off64_t tmp = a >> 32; \
+ a &= 0xffffffffL; \
+ a += (tmp << 8) - (tmp << 5) + tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
if (a >= BASE) a -= BASE; \
} while (0)
#else
# define MOD(a) a %= BASE
-# define MOD4(a) a %= BASE
+# define MOD28(a) a %= BASE
+# define MOD63(a) a %= BASE
#endif
/* ========================================================================= */
@@ -94,7 +100,7 @@ uLong ZEXPORT adler32(adler, buf, len)
}
if (adler >= BASE)
adler -= BASE;
- MOD4(sum2); /* only added so many BASE's */
+ MOD28(sum2); /* only added so many BASE's */
return adler | (sum2 << 16);
}
@@ -130,25 +136,47 @@ uLong ZEXPORT adler32(adler, buf, len)
}
/* ========================================================================= */
-uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+local uLong adler32_combine_(adler1, adler2, len2)
uLong adler1;
uLong adler2;
- z_off_t len2;
+ z_off64_t len2;
{
unsigned long sum1;
unsigned long sum2;
unsigned rem;
+ /* for negative len, return invalid adler32 as a clue for debugging */
+ if (len2 < 0)
+ return 0xffffffffUL;
+
/* the derivation of this formula is left as an exercise for the reader */
- rem = (unsigned)(len2 % BASE);
+ MOD63(len2); /* assumes len2 >= 0 */
+ rem = (unsigned)len2;
sum1 = adler1 & 0xffff;
sum2 = rem * sum1;
MOD(sum2);
sum1 += (adler2 & 0xffff) + BASE - 1;
sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
- if (sum1 > BASE) sum1 -= BASE;
- if (sum1 > BASE) sum1 -= BASE;
- if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
- if (sum2 > BASE) sum2 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);
+ if (sum2 >= BASE) sum2 -= BASE;
return sum1 | (sum2 << 16);
}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
+
+uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off64_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
diff --git a/erts/emulator/zlib/compress.c b/erts/emulator/zlib/compress.c
index 28bceb15f8..8ecef0f790 100644
--- a/erts/emulator/zlib/compress.c
+++ b/erts/emulator/zlib/compress.c
@@ -1,10 +1,8 @@
/* compress.c -- compress a memory buffer
- * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
#ifdef HAVE_CONFIG_H
@@ -34,7 +32,7 @@ int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
z_stream stream;
int err;
- stream.next_in = (Bytef*)source;
+ stream.next_in = (z_const Bytef *)source;
stream.avail_in = (uInt)sourceLen;
#ifdef MAXSEG_64K
/* Check for source > 64K on 16-bit machine: */
@@ -80,5 +78,6 @@ int ZEXPORT compress (dest, destLen, source, sourceLen)
uLong ZEXPORT compressBound (sourceLen)
uLong sourceLen;
{
- return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) + 11;
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13;
}
diff --git a/erts/emulator/zlib/crc32.c b/erts/emulator/zlib/crc32.c
index b9c10bb9b3..ba506d8dd3 100644
--- a/erts/emulator/zlib/crc32.c
+++ b/erts/emulator/zlib/crc32.c
@@ -1,19 +1,14 @@
/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2005 Mark Adler
+ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*
* Thanks to Rodney Brown <[email protected]> for his contribution of faster
* CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
* tables for updating the shift register in one step with three exclusive-ors
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
* instead of four steps with four exclusive-ors. This results in about a
* factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
/*
@@ -22,6 +17,8 @@
of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
first call get_crc_table() to initialize the tables before allowing more than
one thread to use crc32().
+
+ DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
*/
#ifdef MAKECRCH
@@ -31,35 +28,19 @@
# endif /* !DYNAMIC_CRC_TABLE */
#endif /* MAKECRCH */
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
#include "zutil.h" /* for STDC and FAR definitions */
#define local static
-/* Find a four-byte integer type for crc32_little() and crc32_big(). */
-#ifndef NOBYFOUR
-# ifdef STDC /* need ANSI C limits.h to determine sizes */
-# include <limits.h>
-# define BYFOUR
-# if (UINT_MAX == 0xffffffffUL)
- typedef unsigned int u4;
-# else
-# if (ULONG_MAX == 0xffffffffUL)
- typedef unsigned long u4;
-# else
-# if (USHRT_MAX == 0xffffffffUL)
- typedef unsigned short u4;
-# else
-# undef BYFOUR /* can't find a four-byte integer type! */
-# endif
-# endif
-# endif
-# endif /* STDC */
-#endif /* !NOBYFOUR */
-
/* Definitions for doing the crc four data bytes at a time. */
+#if !defined(NOBYFOUR) && defined(Z_U4)
+# define BYFOUR
+#endif
#ifdef BYFOUR
-# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
- (((w)&0xff00)<<8)+(((w)&0xff)<<24))
local unsigned long crc32_little OF((unsigned long,
const unsigned char FAR *, unsigned));
local unsigned long crc32_big OF((unsigned long,
@@ -73,14 +54,16 @@
local unsigned long gf2_matrix_times OF((unsigned long *mat,
unsigned long vec));
local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
+
#ifdef DYNAMIC_CRC_TABLE
local volatile int crc_table_empty = 1;
-local unsigned long FAR crc_table[TBLS][256];
+local z_crc_t FAR crc_table[TBLS][256];
local void make_crc_table OF((void));
#ifdef MAKECRCH
- local void write_table OF((FILE *, const unsigned long FAR *));
+ local void write_table OF((FILE *, const z_crc_t FAR *));
#endif /* MAKECRCH */
/*
Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
@@ -110,9 +93,9 @@ local void make_crc_table OF((void));
*/
local void make_crc_table()
{
- unsigned long c;
+ z_crc_t c;
int n, k;
- unsigned long poly; /* polynomial exclusive-or pattern */
+ z_crc_t poly; /* polynomial exclusive-or pattern */
/* terms of polynomial defining this crc (except x^32): */
static volatile int first = 1; /* flag to limit concurrent making */
static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
@@ -124,13 +107,13 @@ local void make_crc_table()
first = 0;
/* make exclusive-or pattern from polynomial (0xedb88320UL) */
- poly = 0UL;
- for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
- poly |= 1UL << (31 - p[n]);
+ poly = 0;
+ for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
+ poly |= (z_crc_t)1 << (31 - p[n]);
/* generate a crc for every 8-bit value */
for (n = 0; n < 256; n++) {
- c = (unsigned long)n;
+ c = (z_crc_t)n;
for (k = 0; k < 8; k++)
c = c & 1 ? poly ^ (c >> 1) : c >> 1;
crc_table[0][n] = c;
@@ -141,11 +124,11 @@ local void make_crc_table()
and then the byte reversal of those as well as the first table */
for (n = 0; n < 256; n++) {
c = crc_table[0][n];
- crc_table[4][n] = REV(c);
+ crc_table[4][n] = ZSWAP32(c);
for (k = 1; k < 4; k++) {
c = crc_table[0][c & 0xff] ^ (c >> 8);
crc_table[k][n] = c;
- crc_table[k + 4][n] = REV(c);
+ crc_table[k + 4][n] = ZSWAP32(c);
}
}
#endif /* BYFOUR */
@@ -167,7 +150,7 @@ local void make_crc_table()
if (out == NULL) return;
fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
- fprintf(out, "local const unsigned long FAR ");
+ fprintf(out, "local const z_crc_t FAR ");
fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
write_table(out, crc_table[0]);
# ifdef BYFOUR
@@ -187,12 +170,13 @@ local void make_crc_table()
#ifdef MAKECRCH
local void write_table(out, table)
FILE *out;
- const unsigned long FAR *table;
+ const z_crc_t FAR *table;
{
int n;
for (n = 0; n < 256; n++)
- fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
+ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
+ (unsigned long)(table[n]),
n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
}
#endif /* MAKECRCH */
@@ -207,13 +191,13 @@ local void write_table(out, table)
/* =========================================================================
* This function can be used by asm versions of crc32()
*/
-const unsigned long FAR * ZEXPORT get_crc_table()
+const z_crc_t FAR * ZEXPORT get_crc_table()
{
#ifdef DYNAMIC_CRC_TABLE
if (crc_table_empty)
make_crc_table();
#endif /* DYNAMIC_CRC_TABLE */
- return (const unsigned long FAR *)crc_table;
+ return (const z_crc_t FAR *)crc_table;
}
/* ========================================================================= */
@@ -224,7 +208,7 @@ const unsigned long FAR * ZEXPORT get_crc_table()
unsigned long ZEXPORT crc32(crc, buf, len)
unsigned long crc;
const unsigned char FAR *buf;
- unsigned len;
+ uInt len;
{
if (buf == Z_NULL) return 0UL;
@@ -235,7 +219,7 @@ unsigned long ZEXPORT crc32(crc, buf, len)
#ifdef BYFOUR
if (sizeof(void *) == sizeof(ptrdiff_t)) {
- u4 endian;
+ z_crc_t endian;
endian = 1;
if (*((unsigned char *)(&endian)))
@@ -269,17 +253,17 @@ local unsigned long crc32_little(crc, buf, len)
const unsigned char FAR *buf;
unsigned len;
{
- register u4 c;
- register const u4 FAR *buf4;
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
- c = (u4)crc;
+ c = (z_crc_t)crc;
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
len--;
}
- buf4 = (const u4 FAR *)(const void FAR *)buf;
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
while (len >= 32) {
DOLIT32;
len -= 32;
@@ -309,17 +293,17 @@ local unsigned long crc32_big(crc, buf, len)
const unsigned char FAR *buf;
unsigned len;
{
- register u4 c;
- register const u4 FAR *buf4;
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
- c = REV((u4)crc);
+ c = ZSWAP32((z_crc_t)crc);
c = ~c;
while (len && ((ptrdiff_t)buf & 3)) {
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
len--;
}
- buf4 = (const u4 FAR *)(const void FAR *)buf;
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
buf4--;
while (len >= 32) {
DOBIG32;
@@ -336,7 +320,7 @@ local unsigned long crc32_big(crc, buf, len)
c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
} while (--len);
c = ~c;
- return (unsigned long)(REV(c));
+ return (unsigned long)(ZSWAP32(c));
}
#endif /* BYFOUR */
@@ -372,22 +356,22 @@ local void gf2_matrix_square(square, mat)
}
/* ========================================================================= */
-uLong ZEXPORT crc32_combine(crc1, crc2, len2)
+local uLong crc32_combine_(crc1, crc2, len2)
uLong crc1;
uLong crc2;
- z_off_t len2;
+ z_off64_t len2;
{
int n;
unsigned long row;
unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
- /* degenerate case */
- if (len2 == 0)
+ /* degenerate case (also disallow negative lengths) */
+ if (len2 <= 0)
return crc1;
/* put operator for one zero bit in odd */
- odd[0] = 0xedb88320L; /* CRC-32 polynomial */
+ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
row = 1;
for (n = 1; n < GF2_DIM; n++) {
odd[n] = row;
@@ -426,3 +410,20 @@ uLong ZEXPORT crc32_combine(crc1, crc2, len2)
crc1 ^= crc2;
return crc1;
}
+
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off_t len2;
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
+
+uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off64_t len2;
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
diff --git a/erts/emulator/zlib/crc32.h b/erts/emulator/zlib/crc32.h
index 49cd69a4c2..9e0c778102 100644
--- a/erts/emulator/zlib/crc32.h
+++ b/erts/emulator/zlib/crc32.h
@@ -2,9 +2,7 @@
* Generated automatically by crc32.c
*/
-/* %ExternalCopyright% */
-
-local const unsigned long FAR crc_table[TBLS][256] =
+local const z_crc_t FAR crc_table[TBLS][256] =
{
{
0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
diff --git a/erts/emulator/zlib/deflate.c b/erts/emulator/zlib/deflate.c
index 92f4be57c5..943c26dfb2 100644
--- a/erts/emulator/zlib/deflate.c
+++ b/erts/emulator/zlib/deflate.c
@@ -1,10 +1,8 @@
/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/*
* ALGORITHM
*
@@ -39,7 +37,7 @@
* REFERENCES
*
* Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- * Available in http://www.ietf.org/rfc/rfc1951.txt
+ * Available in http://tools.ietf.org/html/rfc1951
*
* A description of the Rabin and Karp algorithm is given in the book
* "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
@@ -57,7 +55,7 @@
#include "deflate.h"
const char deflate_copyright[] =
- " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly ";
+ " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -84,19 +82,18 @@ local block_state deflate_fast OF((deflate_state *s, int flush));
#ifndef FASTEST
local block_state deflate_slow OF((deflate_state *s, int flush));
#endif
+local block_state deflate_rle OF((deflate_state *s, int flush));
+local block_state deflate_huff OF((deflate_state *s, int flush));
local void lm_init OF((deflate_state *s));
local void putShortMSB OF((deflate_state *s, uInt b));
local void flush_pending OF((z_streamp strm));
local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifndef FASTEST
#ifdef ASMV
void match_init OF((void)); /* asm code initialization */
uInt longest_match OF((deflate_state *s, IPos cur_match));
#else
local uInt longest_match OF((deflate_state *s, IPos cur_match));
#endif
-#endif
-local uInt longest_match_fast OF((deflate_state *s, IPos cur_match));
#ifdef DEBUG
local void check_match OF((deflate_state *s, IPos start, IPos match,
@@ -115,11 +112,6 @@ local void check_match OF((deflate_state *s, IPos start, IPos match,
#endif
/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
/* Values for max_lazy_match, good_match and max_chain_length, depending on
* the desired pack level (0..9). The values given below have been tuned to
* exclude worst case performance for pathological files. Better values may be
@@ -166,6 +158,9 @@ local const config configuration_table[10] = {
struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
#endif
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
+#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))
+
/* ===========================================================================
* Update a hash value with the given input byte
* IN assertion: all calls to to UPDATE_HASH are made with consecutive
@@ -246,10 +241,19 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
strm->msg = Z_NULL;
if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
+#endif
}
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
#ifdef FASTEST
if (level != 0) level = 1;
@@ -293,6 +297,8 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+ s->high_water = 0; /* nothing written to s->window yet */
+
s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
@@ -302,7 +308,7 @@ int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
s->pending_buf == Z_NULL) {
s->status = FINISH_STATE;
- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
+ strm->msg = ERR_MSG(Z_MEM_ERROR);
deflateEnd (strm);
return Z_MEM_ERROR;
}
@@ -323,43 +329,70 @@ int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
uInt dictLength;
{
deflate_state *s;
- uInt length = dictLength;
- uInt n;
- IPos hash_head = 0;
+ uInt str, n;
+ int wrap;
+ unsigned avail;
+ z_const unsigned char *next;
- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
- strm->state->wrap == 2 ||
- (strm->state->wrap == 1 && strm->state->status != INIT_STATE))
+ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)
return Z_STREAM_ERROR;
-
s = strm->state;
- if (s->wrap)
- strm->adler = adler32(strm->adler, dictionary, dictLength);
+ wrap = s->wrap;
+ if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
+ return Z_STREAM_ERROR;
- if (length < MIN_MATCH) return Z_OK;
- if (length > MAX_DIST(s)) {
- length = MAX_DIST(s);
- dictionary += dictLength - length; /* use the tail of the dictionary */
+ /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+ if (wrap == 1)
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+ s->wrap = 0; /* avoid computing Adler-32 in read_buf */
+
+ /* if dictionary would fill window, just replace the history */
+ if (dictLength >= s->w_size) {
+ if (wrap == 0) { /* already empty otherwise */
+ CLEAR_HASH(s);
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ dictionary += dictLength - s->w_size; /* use the tail */
+ dictLength = s->w_size;
}
- zmemcpy(s->window, dictionary, length);
- s->strstart = length;
- s->block_start = (long)length;
- /* Insert all strings in the hash table (except for the last two bytes).
- * s->lookahead stays null, so s->ins_h will be recomputed at the next
- * call of fill_window.
- */
- s->ins_h = s->window[0];
- UPDATE_HASH(s, s->ins_h, s->window[1]);
- for (n = 0; n <= length - MIN_MATCH; n++) {
- INSERT_STRING(s, n, hash_head);
+ /* insert dictionary into window and hash */
+ avail = strm->avail_in;
+ next = strm->next_in;
+ strm->avail_in = dictLength;
+ strm->next_in = (z_const Bytef *)dictionary;
+ fill_window(s);
+ while (s->lookahead >= MIN_MATCH) {
+ str = s->strstart;
+ n = s->lookahead - (MIN_MATCH-1);
+ do {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ } while (--n);
+ s->strstart = str;
+ s->lookahead = MIN_MATCH-1;
+ fill_window(s);
}
- if (hash_head) hash_head = 0; /* to make compiler happy */
+ s->strstart += s->lookahead;
+ s->block_start = (long)s->strstart;
+ s->insert = s->lookahead;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ strm->next_in = next;
+ strm->avail_in = avail;
+ s->wrap = wrap;
return Z_OK;
}
/* ========================================================================= */
-int ZEXPORT deflateReset (strm)
+int ZEXPORT deflateResetKeep (strm)
z_streamp strm;
{
deflate_state *s;
@@ -389,12 +422,23 @@ int ZEXPORT deflateReset (strm)
s->last_flush = Z_NO_FLUSH;
_tr_init(s);
- lm_init(s);
return Z_OK;
}
/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+ z_streamp strm;
+{
+ int ret;
+
+ ret = deflateResetKeep(strm);
+ if (ret == Z_OK)
+ lm_init(strm->state);
+ return ret;
+}
+
+/* ========================================================================= */
int ZEXPORT deflateSetHeader (strm, head)
z_streamp strm;
gz_headerp head;
@@ -406,14 +450,42 @@ int ZEXPORT deflateSetHeader (strm, head)
}
/* ========================================================================= */
+int ZEXPORT deflatePending (strm, pending, bits)
+ unsigned *pending;
+ int *bits;
+ z_streamp strm;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ if (pending != Z_NULL)
+ *pending = strm->state->pending;
+ if (bits != Z_NULL)
+ *bits = strm->state->bi_valid;
+ return Z_OK;
+}
+
+/* ========================================================================= */
int ZEXPORT deflatePrime (strm, bits, value)
z_streamp strm;
int bits;
int value;
{
+ deflate_state *s;
+ int put;
+
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- strm->state->bi_valid = bits;
- strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));
+ s = strm->state;
+ if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+ do {
+ put = Buf_size - s->bi_valid;
+ if (put > bits)
+ put = bits;
+ s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
+ s->bi_valid += put;
+ _tr_flush_bits(s);
+ value >>= put;
+ bits -= put;
+ } while (bits);
return Z_OK;
}
@@ -440,9 +512,12 @@ int ZEXPORT deflateParams(strm, level, strategy)
}
func = configuration_table[s->level].func;
- if (func != configuration_table[level].func && strm->total_in != 0) {
+ if ((strategy != s->strategy || func != configuration_table[level].func) &&
+ strm->total_in != 0) {
/* Flush the last buffer: */
- err = deflate(strm, Z_PARTIAL_FLUSH);
+ err = deflate(strm, Z_BLOCK);
+ if (err == Z_BUF_ERROR && s->pending == 0)
+ err = Z_OK;
}
if (s->level != level) {
s->level = level;
@@ -486,33 +561,66 @@ int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
* resulting from using fixed blocks instead of stored blocks, which deflate
* can emit on compressed data for some combinations of the parameters.
*
- * This function could be more sophisticated to provide closer upper bounds
- * for every combination of windowBits and memLevel, as well as wrap.
- * But even the conservative upper bound of about 14% expansion does not
- * seem onerous for output buffer allocation.
+ * This function could be more sophisticated to provide closer upper bounds for
+ * every combination of windowBits and memLevel. But even the conservative
+ * upper bound of about 14% expansion does not seem onerous for output buffer
+ * allocation.
*/
uLong ZEXPORT deflateBound(strm, sourceLen)
z_streamp strm;
uLong sourceLen;
{
deflate_state *s;
- uLong destLen;
+ uLong complen, wraplen;
+ Bytef *str;
- /* conservative upper bound */
- destLen = sourceLen +
- ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11;
+ /* conservative upper bound for compressed data */
+ complen = sourceLen +
+ ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
- /* if can't get parameters, return conservative bound */
+ /* if can't get parameters, return conservative bound plus zlib wrapper */
if (strm == Z_NULL || strm->state == Z_NULL)
- return destLen;
+ return complen + 6;
- /* if not default parameters, return conservative bound */
+ /* compute wrapper length */
s = strm->state;
+ switch (s->wrap) {
+ case 0: /* raw deflate */
+ wraplen = 0;
+ break;
+ case 1: /* zlib wrapper */
+ wraplen = 6 + (s->strstart ? 4 : 0);
+ break;
+ case 2: /* gzip wrapper */
+ wraplen = 18;
+ if (s->gzhead != Z_NULL) { /* user-supplied gzip header */
+ if (s->gzhead->extra != Z_NULL)
+ wraplen += 2 + s->gzhead->extra_len;
+ str = s->gzhead->name;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ str = s->gzhead->comment;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ if (s->gzhead->hcrc)
+ wraplen += 2;
+ }
+ break;
+ default: /* for compiler happiness */
+ wraplen = 6;
+ }
+
+ /* if not default parameters, return conservative bound */
if (s->w_bits != 15 || s->hash_bits != 8 + 7)
- return destLen;
+ return complen + wraplen;
/* default settings: return tight bound for that case */
- return compressBound(sourceLen);
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13 - 6 + wraplen;
}
/* =========================================================================
@@ -537,19 +645,22 @@ local void putShortMSB (s, b)
local void flush_pending(strm)
z_streamp strm;
{
- unsigned len = strm->state->pending;
+ unsigned len;
+ deflate_state *s = strm->state;
+ _tr_flush_bits(s);
+ len = s->pending;
if (len > strm->avail_out) len = strm->avail_out;
if (len == 0) return;
- zmemcpy(strm->next_out, strm->state->pending_out, len);
+ zmemcpy(strm->next_out, s->pending_out, len);
strm->next_out += len;
- strm->state->pending_out += len;
+ s->pending_out += len;
strm->total_out += len;
strm->avail_out -= len;
- strm->state->pending -= len;
- if (strm->state->pending == 0) {
- strm->state->pending_out = strm->state->pending_buf;
+ s->pending -= len;
+ if (s->pending == 0) {
+ s->pending_out = s->pending_buf;
}
}
@@ -562,7 +673,7 @@ int ZEXPORT deflate (strm, flush)
deflate_state *s;
if (strm == Z_NULL || strm->state == Z_NULL ||
- flush > Z_FINISH || flush < 0) {
+ flush > Z_BLOCK || flush < 0) {
return Z_STREAM_ERROR;
}
s = strm->state;
@@ -586,7 +697,7 @@ int ZEXPORT deflate (strm, flush)
put_byte(s, 31);
put_byte(s, 139);
put_byte(s, 8);
- if (s->gzhead == NULL) {
+ if (s->gzhead == Z_NULL) {
put_byte(s, 0);
put_byte(s, 0);
put_byte(s, 0);
@@ -613,7 +724,7 @@ int ZEXPORT deflate (strm, flush)
(s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
4 : 0));
put_byte(s, s->gzhead->os & 0xff);
- if (s->gzhead->extra != NULL) {
+ if (s->gzhead->extra != Z_NULL) {
put_byte(s, s->gzhead->extra_len & 0xff);
put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
}
@@ -655,7 +766,7 @@ int ZEXPORT deflate (strm, flush)
}
#ifdef GZIP
if (s->status == EXTRA_STATE) {
- if (s->gzhead->extra != NULL) {
+ if (s->gzhead->extra != Z_NULL) {
uInt beg = s->pending; /* start of bytes to update crc */
while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
@@ -683,7 +794,7 @@ int ZEXPORT deflate (strm, flush)
s->status = NAME_STATE;
}
if (s->status == NAME_STATE) {
- if (s->gzhead->name != NULL) {
+ if (s->gzhead->name != Z_NULL) {
uInt beg = s->pending; /* start of bytes to update crc */
int val;
@@ -714,7 +825,7 @@ int ZEXPORT deflate (strm, flush)
s->status = COMMENT_STATE;
}
if (s->status == COMMENT_STATE) {
- if (s->gzhead->comment != NULL) {
+ if (s->gzhead->comment != Z_NULL) {
uInt beg = s->pending; /* start of bytes to update crc */
int val;
@@ -776,7 +887,7 @@ int ZEXPORT deflate (strm, flush)
* flushes. For repeated and useless calls with Z_FINISH, we keep
* returning Z_STREAM_END instead of Z_BUF_ERROR.
*/
- } else if (strm->avail_in == 0 && flush <= old_flush &&
+ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
flush != Z_FINISH) {
ERR_RETURN(strm, Z_BUF_ERROR);
}
@@ -792,7 +903,9 @@ int ZEXPORT deflate (strm, flush)
(flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
block_state bstate;
- bstate = (*(configuration_table[s->level].func))(s, flush);
+ bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+ (s->strategy == Z_RLE ? deflate_rle(s, flush) :
+ (*(configuration_table[s->level].func))(s, flush));
if (bstate == finish_started || bstate == finish_done) {
s->status = FINISH_STATE;
@@ -813,13 +926,18 @@ int ZEXPORT deflate (strm, flush)
if (bstate == block_done) {
if (flush == Z_PARTIAL_FLUSH) {
_tr_align(s);
- } else { /* FULL_FLUSH or SYNC_FLUSH */
+ } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
_tr_stored_block(s, (char*)0, 0L, 0);
/* For a full flush, this empty block will be recognized
* as a special marker by inflate_sync().
*/
if (flush == Z_FULL_FLUSH) {
CLEAR_HASH(s); /* forget history */
+ if (s->lookahead == 0) {
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
}
}
flush_pending(strm);
@@ -914,12 +1032,12 @@ int ZEXPORT deflateCopy (dest, source)
ss = source->state;
- zmemcpy(dest, source, sizeof(z_stream));
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
if (ds == Z_NULL) return Z_MEM_ERROR;
dest->state = (struct internal_state FAR *) ds;
- zmemcpy(ds, ss, sizeof(deflate_state));
+ zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
ds->strm = dest;
ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
@@ -935,8 +1053,8 @@ int ZEXPORT deflateCopy (dest, source)
}
/* following zmemcpy do not work for 16-bit MSDOS */
zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
@@ -970,15 +1088,15 @@ local int read_buf(strm, buf, size)
strm->avail_in -= len;
+ zmemcpy(buf, strm->next_in, len);
if (strm->state->wrap == 1) {
- strm->adler = adler32(strm->adler, strm->next_in, len);
+ strm->adler = adler32(strm->adler, buf, len);
}
#ifdef GZIP
else if (strm->state->wrap == 2) {
- strm->adler = crc32(strm->adler, strm->next_in, len);
+ strm->adler = crc32(strm->adler, buf, len);
}
#endif
- zmemcpy(buf, strm->next_in, len);
strm->next_in += len;
strm->total_in += len;
@@ -1005,6 +1123,7 @@ local void lm_init (s)
s->strstart = 0;
s->block_start = 0L;
s->lookahead = 0;
+ s->insert = 0;
s->match_length = s->prev_length = MIN_MATCH-1;
s->match_available = 0;
s->ins_h = 0;
@@ -1172,12 +1291,13 @@ local uInt longest_match(s, cur_match)
return s->lookahead;
}
#endif /* ASMV */
-#endif /* FASTEST */
+
+#else /* FASTEST */
/* ---------------------------------------------------------------------------
- * Optimized version for level == 1 or strategy == Z_RLE only
+ * Optimized version for FASTEST only
*/
-local uInt longest_match_fast(s, cur_match)
+local uInt longest_match(s, cur_match)
deflate_state *s;
IPos cur_match; /* current match */
{
@@ -1230,6 +1350,8 @@ local uInt longest_match_fast(s, cur_match)
return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
}
+#endif /* FASTEST */
+
#ifdef DEBUG
/* ===========================================================================
* Check that the match at match_start is indeed a match.
@@ -1276,6 +1398,8 @@ local void fill_window(s)
unsigned more; /* Amount of free space at the end of the window. */
uInt wsize = s->w_size;
+ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
do {
more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
@@ -1308,7 +1432,6 @@ local void fill_window(s)
later. (Using level 0 permanently is not an optimal usage of
zlib, so we don't care about this pathological case.)
*/
- /* %%% avoid this when Z_RLE */
n = s->hash_size;
p = &s->head[n];
do {
@@ -1329,7 +1452,7 @@ local void fill_window(s)
#endif
more += wsize;
}
- if (s->strm->avail_in == 0) return;
+ if (s->strm->avail_in == 0) break;
/* If there was no sliding:
* strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
@@ -1348,39 +1471,88 @@ local void fill_window(s)
s->lookahead += n;
/* Initialize the hash value now that we have some input: */
- if (s->lookahead >= MIN_MATCH) {
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+ if (s->lookahead + s->insert >= MIN_MATCH) {
+ uInt str = s->strstart - s->insert;
+ s->ins_h = s->window[str];
+ UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
#if MIN_MATCH != 3
Call UPDATE_HASH() MIN_MATCH-3 more times
#endif
+ while (s->insert) {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ s->insert--;
+ if (s->lookahead + s->insert < MIN_MATCH)
+ break;
+ }
}
/* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
* but this is not important since only literal bytes will be emitted.
*/
} while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+ /* If the WIN_INIT bytes after the end of the current data have never been
+ * written, then zero those bytes in order to avoid memory check reports of
+ * the use of uninitialized (or uninitialised as Julian writes) bytes by
+ * the longest match routines. Update the high water mark for the next
+ * time through here. WIN_INIT is set to MAX_MATCH since the longest match
+ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+ */
+ if (s->high_water < s->window_size) {
+ ulg curr = s->strstart + (ulg)(s->lookahead);
+ ulg init;
+
+ if (s->high_water < curr) {
+ /* Previous high water mark below current data -- zero WIN_INIT
+ * bytes or up to end of window, whichever is less.
+ */
+ init = s->window_size - curr;
+ if (init > WIN_INIT)
+ init = WIN_INIT;
+ zmemzero(s->window + curr, (unsigned)init);
+ s->high_water = curr + init;
+ }
+ else if (s->high_water < (ulg)curr + WIN_INIT) {
+ /* High water mark at or above current data, but below current data
+ * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+ * to end of window, whichever is less.
+ */
+ init = (ulg)curr + WIN_INIT - s->high_water;
+ if (init > s->window_size - s->high_water)
+ init = s->window_size - s->high_water;
+ zmemzero(s->window + s->high_water, (unsigned)init);
+ s->high_water += init;
+ }
+ }
+
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "not enough room for search");
}
/* ===========================================================================
* Flush the current block, with given end-of-file flag.
* IN assertion: strstart is set to the end of the current match.
*/
-#define FLUSH_BLOCK_ONLY(s, eof) { \
+#define FLUSH_BLOCK_ONLY(s, last) { \
_tr_flush_block(s, (s->block_start >= 0L ? \
(charf *)&s->window[(unsigned)s->block_start] : \
(charf *)Z_NULL), \
(ulg)((long)s->strstart - s->block_start), \
- (eof)); \
+ (last)); \
s->block_start = s->strstart; \
flush_pending(s->strm); \
Tracev((stderr,"[FLUSH]")); \
}
/* Same but force premature exit if necessary. */
-#define FLUSH_BLOCK(s, eof) { \
- FLUSH_BLOCK_ONLY(s, eof); \
- if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
+#define FLUSH_BLOCK(s, last) { \
+ FLUSH_BLOCK_ONLY(s, last); \
+ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
}
/* ===========================================================================
@@ -1439,8 +1611,14 @@ local block_state deflate_stored(s, flush)
FLUSH_BLOCK(s, 0);
}
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if ((long)s->strstart > s->block_start)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
/* ===========================================================================
@@ -1454,7 +1632,7 @@ local block_state deflate_fast(s, flush)
deflate_state *s;
int flush;
{
- IPos hash_head = NIL; /* head of the hash chain */
+ IPos hash_head; /* head of the hash chain */
int bflush; /* set if current block must be flushed */
for (;;) {
@@ -1474,6 +1652,7 @@ local block_state deflate_fast(s, flush)
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
+ hash_head = NIL;
if (s->lookahead >= MIN_MATCH) {
INSERT_STRING(s, s->strstart, hash_head);
}
@@ -1486,19 +1665,8 @@ local block_state deflate_fast(s, flush)
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
-#ifdef FASTEST
- if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) ||
- (s->strategy == Z_RLE && s->strstart - hash_head == 1)) {
- s->match_length = longest_match_fast (s, hash_head);
- }
-#else
- if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {
- s->match_length = longest_match (s, hash_head);
- } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
- s->match_length = longest_match_fast (s, hash_head);
- }
-#endif
- /* longest_match() or longest_match_fast() sets match_start */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
}
if (s->match_length >= MIN_MATCH) {
check_match(s, s->strstart, s->match_start, s->match_length);
@@ -1546,8 +1714,14 @@ local block_state deflate_fast(s, flush)
}
if (bflush) FLUSH_BLOCK(s, 0);
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
#ifndef FASTEST
@@ -1560,7 +1734,7 @@ local block_state deflate_slow(s, flush)
deflate_state *s;
int flush;
{
- IPos hash_head = NIL; /* head of hash chain */
+ IPos hash_head; /* head of hash chain */
int bflush; /* set if current block must be flushed */
/* Process the input block. */
@@ -1581,6 +1755,7 @@ local block_state deflate_slow(s, flush)
/* Insert the string window[strstart .. strstart+2] in the
* dictionary, and set hash_head to the head of the hash chain:
*/
+ hash_head = NIL;
if (s->lookahead >= MIN_MATCH) {
INSERT_STRING(s, s->strstart, hash_head);
}
@@ -1596,12 +1771,8 @@ local block_state deflate_slow(s, flush)
* of window index 0 (in particular we have to avoid a match
* of the string with itself at the start of the input file).
*/
- if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {
- s->match_length = longest_match (s, hash_head);
- } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
- s->match_length = longest_match_fast (s, hash_head);
- }
- /* longest_match() or longest_match_fast() sets match_start */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
if (s->match_length <= 5 && (s->strategy == Z_FILTERED
#if TOO_FAR <= 32767
@@ -1674,12 +1845,17 @@ local block_state deflate_slow(s, flush)
_tr_tally_lit(s, s->window[s->strstart-1], bflush);
s->match_available = 0;
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
#endif /* FASTEST */
-#if 0
/* ===========================================================================
* For Z_RLE, simply look for runs of bytes, generate matches only of distance
* one. Do not maintain a hash table. (It will be regenerated if this run of
@@ -1689,43 +1865,52 @@ local block_state deflate_rle(s, flush)
deflate_state *s;
int flush;
{
- int bflush; /* set if current block must be flushed */
- uInt run; /* length of run */
- uInt max; /* maximum length of run */
- uInt prev; /* byte at distance one to match */
- Bytef *scan; /* scan for end of run */
+ int bflush; /* set if current block must be flushed */
+ uInt prev; /* byte at distance one to match */
+ Bytef *scan, *strend; /* scan goes up to strend for length of run */
for (;;) {
/* Make sure that we always have enough lookahead, except
* at the end of the input file. We need MAX_MATCH bytes
- * for the longest encodable run.
+ * for the longest run, plus one for the unrolled loop.
*/
- if (s->lookahead < MAX_MATCH) {
+ if (s->lookahead <= MAX_MATCH) {
fill_window(s);
- if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {
+ if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
return need_more;
}
if (s->lookahead == 0) break; /* flush the current block */
}
/* See how many times the previous byte repeats */
- run = 0;
- if (s->strstart > 0) { /* if there is a previous byte, that is */
- max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH;
+ s->match_length = 0;
+ if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
scan = s->window + s->strstart - 1;
- prev = *scan++;
- do {
- if (*scan++ != prev)
- break;
- } while (++run < max);
+ prev = *scan;
+ if (prev == *++scan && prev == *++scan && prev == *++scan) {
+ strend = s->window + s->strstart + MAX_MATCH;
+ do {
+ } while (prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ scan < strend);
+ s->match_length = MAX_MATCH - (int)(strend - scan);
+ if (s->match_length > s->lookahead)
+ s->match_length = s->lookahead;
+ }
+ Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
}
/* Emit match if have run of MIN_MATCH or longer, else emit literal */
- if (run >= MIN_MATCH) {
- check_match(s, s->strstart, s->strstart - 1, run);
- _tr_tally_dist(s, 1, run - MIN_MATCH, bflush);
- s->lookahead -= run;
- s->strstart += run;
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->strstart - 1, s->match_length);
+
+ _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+ s->strstart += s->match_length;
+ s->match_length = 0;
} else {
/* No match, output a literal byte */
Tracevv((stderr,"%c", s->window[s->strstart]));
@@ -1735,7 +1920,51 @@ local block_state deflate_rle(s, flush)
}
if (bflush) FLUSH_BLOCK(s, 0);
}
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
+ */
+local block_state deflate_huff(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we have a literal to write. */
+ if (s->lookahead == 0) {
+ fill_window(s);
+ if (s->lookahead == 0) {
+ if (flush == Z_NO_FLUSH)
+ return need_more;
+ break; /* flush the current block */
+ }
+ }
+
+ /* Output a literal byte */
+ s->match_length = 0;
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
}
-#endif
diff --git a/erts/emulator/zlib/deflate.h b/erts/emulator/zlib/deflate.h
index 92b037c9d2..ce0299edd1 100644
--- a/erts/emulator/zlib/deflate.h
+++ b/erts/emulator/zlib/deflate.h
@@ -1,10 +1,8 @@
/* deflate.h -- internal compression state
- * Copyright (C) 1995-2004 Jean-loup Gailly
+ * Copyright (C) 1995-2012 Jean-loup Gailly
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
@@ -50,6 +48,9 @@
#define MAX_BITS 15
/* All codes must not exceed MAX_BITS bits */
+#define Buf_size 16
+/* size of bit buffer in bi_buf */
+
#define INIT_STATE 42
#define EXTRA_STATE 69
#define NAME_STATE 73
@@ -103,7 +104,7 @@ typedef struct internal_state {
int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
gz_headerp gzhead; /* gzip header information to write */
uInt gzindex; /* where in extra, name, or comment */
- Byte method; /* STORED (for zip only) or DEFLATED */
+ Byte method; /* can only be DEFLATED */
int last_flush; /* value of flush param for previous deflate call */
/* used by deflate.c: */
@@ -190,7 +191,7 @@ typedef struct internal_state {
int nice_match; /* Stop searching when current match exceeds this */
/* used by trees.c: */
- /* Didn't use ct_data typedef below to supress compiler warning */
+ /* Didn't use ct_data typedef below to suppress compiler warning */
struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
@@ -246,7 +247,7 @@ typedef struct internal_state {
ulg opt_len; /* bit length of current block with optimal trees */
ulg static_len; /* bit length of current block with static trees */
uInt matches; /* number of string matches in current block */
- int last_eob_len; /* bit length of EOB code for last block */
+ uInt insert; /* bytes at end of window left to insert */
#ifdef DEBUG
ulg compressed_len; /* total bit length of compressed file mod 2^32 */
@@ -262,6 +263,13 @@ typedef struct internal_state {
* are always zero.
*/
+ ulg high_water;
+ /* High water mark offset in window for initialized bytes -- bytes above
+ * this are set to zero in order to avoid memory check warnings when
+ * longest match routines access bytes past the input. This is then
+ * updated to the new high water mark.
+ */
+
} FAR deflate_state;
/* Output a byte on the stream.
@@ -280,14 +288,19 @@ typedef struct internal_state {
* distances are limited to MAX_DIST instead of WSIZE.
*/
+#define WIN_INIT MAX_MATCH
+/* Number of bytes after end of data in window to initialize in order to avoid
+ memory checker errors from longest match routines */
+
/* in trees.c */
-void _tr_init OF((deflate_state *s));
-int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
-void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
-void _tr_align OF((deflate_state *s));
-void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
+void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
+int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
#define d_code(dist) \
((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
@@ -300,11 +313,11 @@ void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
/* Inline versions of _tr_tally for speed: */
#if defined(GEN_TREES_H) || !defined(STDC)
- extern uch _length_code[];
- extern uch _dist_code[];
+ extern uch ZLIB_INTERNAL _length_code[];
+ extern uch ZLIB_INTERNAL _dist_code[];
#else
- extern const uch _length_code[];
- extern const uch _dist_code[];
+ extern const uch ZLIB_INTERNAL _length_code[];
+ extern const uch ZLIB_INTERNAL _dist_code[];
#endif
# define _tr_tally_lit(s, c, flush) \
diff --git a/erts/emulator/zlib/example.c b/erts/emulator/zlib/example.c
deleted file mode 100644
index ebe828f72d..0000000000
--- a/erts/emulator/zlib/example.c
+++ /dev/null
@@ -1,570 +0,0 @@
-/* example.c -- usage example of the zlib compression library
- * Copyright (C) 1995-2004 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* %ExternalCopyright% */
-
-/* @(#) $Id$ */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include <stdio.h>
-#include "zlib.h"
-
-#ifdef STDC
-# include <string.h>
-# include <stdlib.h>
-#endif
-
-#if defined(VMS) || defined(RISCOS)
-# define TESTFILE "foo-gz"
-#else
-# define TESTFILE "foo.gz"
-#endif
-
-#define CHECK_ERR(err, msg) { \
- if (err != Z_OK) { \
- fprintf(stderr, "%s error: %d\n", msg, err); \
- exit(1); \
- } \
-}
-
-const char hello[] = "hello, hello!";
-/* "hello world" would be more standard, but the repeated "hello"
- * stresses the compression code better, sorry...
- */
-
-const char dictionary[] = "hello";
-uLong dictId; /* Adler32 value of the dictionary */
-
-void test_compress OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-void test_gzio OF((const char *fname,
- Byte *uncompr, uLong uncomprLen));
-void test_deflate OF((Byte *compr, uLong comprLen));
-void test_inflate OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-void test_large_deflate OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-void test_large_inflate OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-void test_flush OF((Byte *compr, uLong *comprLen));
-void test_sync OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-void test_dict_deflate OF((Byte *compr, uLong comprLen));
-void test_dict_inflate OF((Byte *compr, uLong comprLen,
- Byte *uncompr, uLong uncomprLen));
-int main OF((int argc, char *argv[]));
-
-/* ===========================================================================
- * Test compress() and uncompress()
- */
-void test_compress(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- int err;
- uLong len = (uLong)strlen(hello)+1;
-
- err = compress(compr, &comprLen, (const Bytef*)hello, len);
- CHECK_ERR(err, "compress");
-
- strcpy((char*)uncompr, "garbage");
-
- err = uncompress(uncompr, &uncomprLen, compr, comprLen);
- CHECK_ERR(err, "uncompress");
-
- if (strcmp((char*)uncompr, hello)) {
- fprintf(stderr, "bad uncompress\n");
- exit(1);
- } else {
- printf("uncompress(): %s\n", (char *)uncompr);
- }
-}
-
-/* ===========================================================================
- * Test read/write of .gz files
- */
-void test_gzio(fname, uncompr, uncomprLen)
- const char *fname; /* compressed file name */
- Byte *uncompr;
- uLong uncomprLen;
-{
-#ifdef NO_GZCOMPRESS
- fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
-#else
- int err;
- int len = (int)strlen(hello)+1;
- gzFile file;
- z_off_t pos;
-
- file = gzopen(fname, "wb");
- if (file == NULL) {
- fprintf(stderr, "gzopen error\n");
- exit(1);
- }
- gzputc(file, 'h');
- if (gzputs(file, "ello") != 4) {
- fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
- exit(1);
- }
- if (gzprintf(file, ", %s!", "hello") != 8) {
- fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
- exit(1);
- }
- gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
- gzclose(file);
-
- file = gzopen(fname, "rb");
- if (file == NULL) {
- fprintf(stderr, "gzopen error\n");
- exit(1);
- }
- strcpy((char*)uncompr, "garbage");
-
- if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
- fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
- exit(1);
- }
- if (strcmp((char*)uncompr, hello)) {
- fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
- exit(1);
- } else {
- printf("gzread(): %s\n", (char*)uncompr);
- }
-
- pos = gzseek(file, -8L, SEEK_CUR);
- if (pos != 6 || gztell(file) != pos) {
- fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
- (long)pos, (long)gztell(file));
- exit(1);
- }
-
- if (gzgetc(file) != ' ') {
- fprintf(stderr, "gzgetc error\n");
- exit(1);
- }
-
- if (gzungetc(' ', file) != ' ') {
- fprintf(stderr, "gzungetc error\n");
- exit(1);
- }
-
- gzgets(file, (char*)uncompr, (int)uncomprLen);
- if (strlen((char*)uncompr) != 7) { /* " hello!" */
- fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
- exit(1);
- }
- if (strcmp((char*)uncompr, hello + 6)) {
- fprintf(stderr, "bad gzgets after gzseek\n");
- exit(1);
- } else {
- printf("gzgets() after gzseek: %s\n", (char*)uncompr);
- }
-
- gzclose(file);
-#endif
-}
-
-/* ===========================================================================
- * Test deflate() with small buffers
- */
-void test_deflate(compr, comprLen)
- Byte *compr;
- uLong comprLen;
-{
- z_stream c_stream; /* compression stream */
- int err;
- uLong len = (uLong)strlen(hello)+1;
-
- c_stream.zalloc = (alloc_func)0;
- c_stream.zfree = (free_func)0;
- c_stream.opaque = (voidpf)0;
-
- err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
- CHECK_ERR(err, "deflateInit");
-
- c_stream.next_in = (Bytef*)hello;
- c_stream.next_out = compr;
-
- while (c_stream.total_in != len && c_stream.total_out < comprLen) {
- c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
- err = deflate(&c_stream, Z_NO_FLUSH);
- CHECK_ERR(err, "deflate");
- }
- /* Finish the stream, still forcing small buffers: */
- for (;;) {
- c_stream.avail_out = 1;
- err = deflate(&c_stream, Z_FINISH);
- if (err == Z_STREAM_END) break;
- CHECK_ERR(err, "deflate");
- }
-
- err = deflateEnd(&c_stream);
- CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with small buffers
- */
-void test_inflate(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- int err;
- z_stream d_stream; /* decompression stream */
-
- strcpy((char*)uncompr, "garbage");
-
- d_stream.zalloc = (alloc_func)0;
- d_stream.zfree = (free_func)0;
- d_stream.opaque = (voidpf)0;
-
- d_stream.next_in = compr;
- d_stream.avail_in = 0;
- d_stream.next_out = uncompr;
-
- err = inflateInit(&d_stream);
- CHECK_ERR(err, "inflateInit");
-
- while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
- d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
- err = inflate(&d_stream, Z_NO_FLUSH);
- if (err == Z_STREAM_END) break;
- CHECK_ERR(err, "inflate");
- }
-
- err = inflateEnd(&d_stream);
- CHECK_ERR(err, "inflateEnd");
-
- if (strcmp((char*)uncompr, hello)) {
- fprintf(stderr, "bad inflate\n");
- exit(1);
- } else {
- printf("inflate(): %s\n", (char *)uncompr);
- }
-}
-
-/* ===========================================================================
- * Test deflate() with large buffers and dynamic change of compression level
- */
-void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- z_stream c_stream; /* compression stream */
- int err;
-
- c_stream.zalloc = (alloc_func)0;
- c_stream.zfree = (free_func)0;
- c_stream.opaque = (voidpf)0;
-
- err = deflateInit(&c_stream, Z_BEST_SPEED);
- CHECK_ERR(err, "deflateInit");
-
- c_stream.next_out = compr;
- c_stream.avail_out = (uInt)comprLen;
-
- /* At this point, uncompr is still mostly zeroes, so it should compress
- * very well:
- */
- c_stream.next_in = uncompr;
- c_stream.avail_in = (uInt)uncomprLen;
- err = deflate(&c_stream, Z_NO_FLUSH);
- CHECK_ERR(err, "deflate");
- if (c_stream.avail_in != 0) {
- fprintf(stderr, "deflate not greedy\n");
- exit(1);
- }
-
- /* Feed in already compressed data and switch to no compression: */
- deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
- c_stream.next_in = compr;
- c_stream.avail_in = (uInt)comprLen/2;
- err = deflate(&c_stream, Z_NO_FLUSH);
- CHECK_ERR(err, "deflate");
-
- /* Switch back to compressing mode: */
- deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
- c_stream.next_in = uncompr;
- c_stream.avail_in = (uInt)uncomprLen;
- err = deflate(&c_stream, Z_NO_FLUSH);
- CHECK_ERR(err, "deflate");
-
- err = deflate(&c_stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- fprintf(stderr, "deflate should report Z_STREAM_END\n");
- exit(1);
- }
- err = deflateEnd(&c_stream);
- CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with large buffers
- */
-void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- int err;
- z_stream d_stream; /* decompression stream */
-
- strcpy((char*)uncompr, "garbage");
-
- d_stream.zalloc = (alloc_func)0;
- d_stream.zfree = (free_func)0;
- d_stream.opaque = (voidpf)0;
-
- d_stream.next_in = compr;
- d_stream.avail_in = (uInt)comprLen;
-
- err = inflateInit(&d_stream);
- CHECK_ERR(err, "inflateInit");
-
- for (;;) {
- d_stream.next_out = uncompr; /* discard the output */
- d_stream.avail_out = (uInt)uncomprLen;
- err = inflate(&d_stream, Z_NO_FLUSH);
- if (err == Z_STREAM_END) break;
- CHECK_ERR(err, "large inflate");
- }
-
- err = inflateEnd(&d_stream);
- CHECK_ERR(err, "inflateEnd");
-
- if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
- fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
- exit(1);
- } else {
- printf("large_inflate(): OK\n");
- }
-}
-
-/* ===========================================================================
- * Test deflate() with full flush
- */
-void test_flush(compr, comprLen)
- Byte *compr;
- uLong *comprLen;
-{
- z_stream c_stream; /* compression stream */
- int err;
- uInt len = (uInt)strlen(hello)+1;
-
- c_stream.zalloc = (alloc_func)0;
- c_stream.zfree = (free_func)0;
- c_stream.opaque = (voidpf)0;
-
- err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
- CHECK_ERR(err, "deflateInit");
-
- c_stream.next_in = (Bytef*)hello;
- c_stream.next_out = compr;
- c_stream.avail_in = 3;
- c_stream.avail_out = (uInt)*comprLen;
- err = deflate(&c_stream, Z_FULL_FLUSH);
- CHECK_ERR(err, "deflate");
-
- compr[3]++; /* force an error in first compressed block */
- c_stream.avail_in = len - 3;
-
- err = deflate(&c_stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- CHECK_ERR(err, "deflate");
- }
- err = deflateEnd(&c_stream);
- CHECK_ERR(err, "deflateEnd");
-
- *comprLen = c_stream.total_out;
-}
-
-/* ===========================================================================
- * Test inflateSync()
- */
-void test_sync(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- int err;
- z_stream d_stream; /* decompression stream */
-
- strcpy((char*)uncompr, "garbage");
-
- d_stream.zalloc = (alloc_func)0;
- d_stream.zfree = (free_func)0;
- d_stream.opaque = (voidpf)0;
-
- d_stream.next_in = compr;
- d_stream.avail_in = 2; /* just read the zlib header */
-
- err = inflateInit(&d_stream);
- CHECK_ERR(err, "inflateInit");
-
- d_stream.next_out = uncompr;
- d_stream.avail_out = (uInt)uncomprLen;
-
- inflate(&d_stream, Z_NO_FLUSH);
- CHECK_ERR(err, "inflate");
-
- d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */
- err = inflateSync(&d_stream); /* but skip the damaged part */
- CHECK_ERR(err, "inflateSync");
-
- err = inflate(&d_stream, Z_FINISH);
- if (err != Z_DATA_ERROR) {
- fprintf(stderr, "inflate should report DATA_ERROR\n");
- /* Because of incorrect adler32 */
- exit(1);
- }
- err = inflateEnd(&d_stream);
- CHECK_ERR(err, "inflateEnd");
-
- printf("after inflateSync(): hel%s\n", (char *)uncompr);
-}
-
-/* ===========================================================================
- * Test deflate() with preset dictionary
- */
-void test_dict_deflate(compr, comprLen)
- Byte *compr;
- uLong comprLen;
-{
- z_stream c_stream; /* compression stream */
- int err;
-
- c_stream.zalloc = (alloc_func)0;
- c_stream.zfree = (free_func)0;
- c_stream.opaque = (voidpf)0;
-
- err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
- CHECK_ERR(err, "deflateInit");
-
- err = deflateSetDictionary(&c_stream,
- (const Bytef*)dictionary, sizeof(dictionary));
- CHECK_ERR(err, "deflateSetDictionary");
-
- dictId = c_stream.adler;
- c_stream.next_out = compr;
- c_stream.avail_out = (uInt)comprLen;
-
- c_stream.next_in = (Bytef*)hello;
- c_stream.avail_in = (uInt)strlen(hello)+1;
-
- err = deflate(&c_stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- fprintf(stderr, "deflate should report Z_STREAM_END\n");
- exit(1);
- }
- err = deflateEnd(&c_stream);
- CHECK_ERR(err, "deflateEnd");
-}
-
-/* ===========================================================================
- * Test inflate() with a preset dictionary
- */
-void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
- Byte *compr, *uncompr;
- uLong comprLen, uncomprLen;
-{
- int err;
- z_stream d_stream; /* decompression stream */
-
- strcpy((char*)uncompr, "garbage");
-
- d_stream.zalloc = (alloc_func)0;
- d_stream.zfree = (free_func)0;
- d_stream.opaque = (voidpf)0;
-
- d_stream.next_in = compr;
- d_stream.avail_in = (uInt)comprLen;
-
- err = inflateInit(&d_stream);
- CHECK_ERR(err, "inflateInit");
-
- d_stream.next_out = uncompr;
- d_stream.avail_out = (uInt)uncomprLen;
-
- for (;;) {
- err = inflate(&d_stream, Z_NO_FLUSH);
- if (err == Z_STREAM_END) break;
- if (err == Z_NEED_DICT) {
- if (d_stream.adler != dictId) {
- fprintf(stderr, "unexpected dictionary");
- exit(1);
- }
- err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
- sizeof(dictionary));
- }
- CHECK_ERR(err, "inflate with dict");
- }
-
- err = inflateEnd(&d_stream);
- CHECK_ERR(err, "inflateEnd");
-
- if (strcmp((char*)uncompr, hello)) {
- fprintf(stderr, "bad inflate with dict\n");
- exit(1);
- } else {
- printf("inflate with dictionary: %s\n", (char *)uncompr);
- }
-}
-
-/* ===========================================================================
- * Usage: example [output.gz [input.gz]]
- */
-
-int main(argc, argv)
- int argc;
- char *argv[];
-{
- Byte *compr, *uncompr;
- uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
- uLong uncomprLen = comprLen;
- static const char* myVersion = ZLIB_VERSION;
-
- if (zlibVersion()[0] != myVersion[0]) {
- fprintf(stderr, "incompatible zlib version\n");
- exit(1);
-
- } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
- fprintf(stderr, "warning: different zlib version\n");
- }
-
- printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
- ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
-
- compr = (Byte*)calloc((uInt)comprLen, 1);
- uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
- /* compr and uncompr are cleared to avoid reading uninitialized
- * data and to ensure that uncompr compresses well.
- */
- if (compr == Z_NULL || uncompr == Z_NULL) {
- printf("out of memory\n");
- exit(1);
- }
- test_compress(compr, comprLen, uncompr, uncomprLen);
-
- test_gzio((argc > 1 ? argv[1] : TESTFILE),
- uncompr, uncomprLen);
-
- test_deflate(compr, comprLen);
- test_inflate(compr, comprLen, uncompr, uncomprLen);
-
- test_large_deflate(compr, comprLen, uncompr, uncomprLen);
- test_large_inflate(compr, comprLen, uncompr, uncomprLen);
-
- test_flush(compr, &comprLen);
- test_sync(compr, comprLen, uncompr, uncomprLen);
- comprLen = uncomprLen;
-
- test_dict_deflate(compr, comprLen);
- test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
-
- free(compr);
- free(uncompr);
-
- return 0;
-}
diff --git a/erts/emulator/zlib/gzguts.h b/erts/emulator/zlib/gzguts.h
new file mode 100644
index 0000000000..d87659d031
--- /dev/null
+++ b/erts/emulator/zlib/gzguts.h
@@ -0,0 +1,209 @@
+/* gzguts.h -- zlib internal header definitions for gz* operations
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#ifdef _LARGEFILE64_SOURCE
+# ifndef _LARGEFILE_SOURCE
+# define _LARGEFILE_SOURCE 1
+# endif
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+#endif
+
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
+#include <stdio.h>
+#include "zlib.h"
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+# include <limits.h>
+#endif
+#include <fcntl.h>
+
+#ifdef _WIN32
+# include <stddef.h>
+#endif
+
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
+# include <io.h>
+#endif
+
+#ifdef WINAPI_FAMILY
+# define open _open
+# define read _read
+# define write _write
+# define close _close
+#endif
+
+#ifdef NO_DEFLATE /* for compatibility with old definition */
+# define NO_GZCOMPRESS
+#endif
+
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(__CYGWIN__)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+# ifdef MSDOS
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+ but for now we just assume it doesn't. */
+# define NO_vsnprintf
+# endif
+# ifdef __TURBOC__
+# define NO_vsnprintf
+# endif
+# ifdef WIN32
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+# if !defined(vsnprintf) && !defined(NO_vsnprintf)
+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+# define vsnprintf _vsnprintf
+# endif
+# endif
+# endif
+# ifdef __SASC
+# define NO_vsnprintf
+# endif
+# ifdef VMS
+# define NO_vsnprintf
+# endif
+# ifdef __OS400__
+# define NO_vsnprintf
+# endif
+# ifdef __MVS__
+# define NO_vsnprintf
+# endif
+#endif
+
+/* unlike snprintf (which is required in C99, yet still not supported by
+ Microsoft more than a decade later!), _snprintf does not guarantee null
+ termination of the result -- however this is only used in gzlib.c where
+ the result is assured to fit in the space provided */
+#ifdef _MSC_VER
+# define snprintf _snprintf
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+/* gz* functions always use library allocation functions */
+#ifndef STDC
+ extern voidp malloc OF((uInt size));
+ extern void free OF((voidpf ptr));
+#endif
+
+/* get errno and strerror definition */
+#if defined UNDER_CE
+# include <windows.h>
+# define zstrerror() gz_strwinerror((DWORD)GetLastError())
+#else
+# ifndef NO_STRERROR
+# include <errno.h>
+# define zstrerror() strerror(errno)
+# else
+# define zstrerror() "stdio error (consult errno)"
+# endif
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+#endif
+
+/* default memLevel */
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+
+/* default i/o buffer size -- double this for output when reading (this and
+ twice this must be able to fit in an unsigned type) */
+#define GZBUFSIZE 8192
+
+/* gzip modes, also provide a little integrity check on the passed structure */
+#define GZ_NONE 0
+#define GZ_READ 7247
+#define GZ_WRITE 31153
+#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
+
+/* values for gz_state how */
+#define LOOK 0 /* look for a gzip header */
+#define COPY 1 /* copy input directly */
+#define GZIP 2 /* decompress a gzip stream */
+
+/* internal gzip file state data structure */
+typedef struct {
+ /* exposed contents for gzgetc() macro */
+ struct gzFile_s x; /* "x" for exposed */
+ /* x.have: number of bytes available at x.next */
+ /* x.next: next output data to deliver or write */
+ /* x.pos: current position in uncompressed data */
+ /* used for both reading and writing */
+ int mode; /* see gzip modes above */
+ int fd; /* file descriptor */
+ char *path; /* path or fd for error messages */
+ unsigned size; /* buffer size, zero if not allocated yet */
+ unsigned want; /* requested buffer size, default is GZBUFSIZE */
+ unsigned char *in; /* input buffer */
+ unsigned char *out; /* output buffer (double-sized when reading) */
+ int direct; /* 0 if processing gzip, 1 if transparent */
+ /* just for reading */
+ int how; /* 0: get header, 1: copy, 2: decompress */
+ z_off64_t start; /* where the gzip data started, for rewinding */
+ int eof; /* true if end of input file reached */
+ int past; /* true if read requested past end */
+ /* just for writing */
+ int level; /* compression level */
+ int strategy; /* compression strategy */
+ /* seek request */
+ z_off64_t skip; /* amount to skip (already rewound if backwards) */
+ int seek; /* true if seek request pending */
+ /* error information */
+ int err; /* error code */
+ char *msg; /* error message */
+ /* zlib inflate or deflate stream */
+ z_stream strm; /* stream structure in-place (not a pointer) */
+} gz_state;
+typedef gz_state FAR *gz_statep;
+
+/* shared functions */
+void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+#if defined UNDER_CE
+char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+#endif
+
+/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
+ value -- needed when comparing unsigned to z_off64_t, which is signed
+ (possible z_off64_t types off_t, off64_t, and long are all signed) */
+#ifdef INT_MAX
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
+#else
+unsigned ZLIB_INTERNAL gz_intmax OF((void));
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
+#endif
diff --git a/erts/emulator/zlib/inffast.c b/erts/emulator/zlib/inffast.c
index eb81884888..5187743fde 100644
--- a/erts/emulator/zlib/inffast.c
+++ b/erts/emulator/zlib/inffast.c
@@ -1,10 +1,8 @@
/* inffast.c -- fast decoding
- * Copyright (C) 1995-2004 Mark Adler
+ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -69,13 +67,13 @@
requires strm->avail_out >= 258 for each loop to avoid checking for
output space.
*/
-void inflate_fast(strm, start)
+void ZLIB_INTERNAL inflate_fast(strm, start)
z_streamp strm;
unsigned start; /* inflate()'s starting value for strm->avail_out */
{
struct inflate_state FAR *state;
- unsigned char FAR *in; /* local strm->next_in */
- unsigned char FAR *last; /* while in < last, enough input available */
+ z_const unsigned char FAR *in; /* local strm->next_in */
+ z_const unsigned char FAR *last; /* have enough input while in < last */
unsigned char FAR *out; /* local strm->next_out */
unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
unsigned char FAR *end; /* while out < end, enough space available */
@@ -84,7 +82,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
#endif
unsigned wsize; /* window size or zero if not using window */
unsigned whave; /* valid bytes in the window */
- unsigned write; /* window write index */
+ unsigned wnext; /* window write index */
unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
unsigned long hold; /* local strm->hold */
unsigned bits; /* local strm->bits */
@@ -92,7 +90,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
code const FAR *dcode; /* local strm->distcode */
unsigned lmask; /* mask for first level of length codes */
unsigned dmask; /* mask for first level of distance codes */
- code this; /* retrieved table entry */
+ code here; /* retrieved table entry */
unsigned op; /* code bits, operation, extra bits, or */
/* window position, window bytes to copy */
unsigned len; /* match length, unused bytes */
@@ -111,7 +109,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
#endif
wsize = state->wsize;
whave = state->whave;
- write = state->write;
+ wnext = state->wnext;
window = state->window;
hold = state->hold;
bits = state->bits;
@@ -129,20 +127,20 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
hold += (unsigned long)(PUP(in)) << bits;
bits += 8;
}
- this = lcode[hold & lmask];
+ here = lcode[hold & lmask];
dolen:
- op = (unsigned)(this.bits);
+ op = (unsigned)(here.bits);
hold >>= op;
bits -= op;
- op = (unsigned)(this.op);
+ op = (unsigned)(here.op);
if (op == 0) { /* literal */
- Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
"inflate: literal '%c'\n" :
- "inflate: literal 0x%02x\n", this.val));
- PUP(out) = (unsigned char)(this.val);
+ "inflate: literal 0x%02x\n", here.val));
+ PUP(out) = (unsigned char)(here.val);
}
else if (op & 16) { /* length base */
- len = (unsigned)(this.val);
+ len = (unsigned)(here.val);
op &= 15; /* number of extra bits */
if (op) {
if (bits < op) {
@@ -160,14 +158,14 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
hold += (unsigned long)(PUP(in)) << bits;
bits += 8;
}
- this = dcode[hold & dmask];
+ here = dcode[hold & dmask];
dodist:
- op = (unsigned)(this.bits);
+ op = (unsigned)(here.bits);
hold >>= op;
bits -= op;
- op = (unsigned)(this.op);
+ op = (unsigned)(here.op);
if (op & 16) { /* distance base */
- dist = (unsigned)(this.val);
+ dist = (unsigned)(here.val);
op &= 15; /* number of extra bits */
if (bits < op) {
hold += (unsigned long)(PUP(in)) << bits;
@@ -192,12 +190,34 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
if (dist > op) { /* see if copy from window */
op = dist - op; /* distance back in window */
if (op > whave) {
- strm->msg = (char *)"invalid distance too far back";
- state->mode = BAD;
- break;
+ if (state->sane) {
+ strm->msg =
+ (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ if (len <= op - whave) {
+ do {
+ PUP(out) = 0;
+ } while (--len);
+ continue;
+ }
+ len -= op - whave;
+ do {
+ PUP(out) = 0;
+ } while (--op > whave);
+ if (op == 0) {
+ from = out - dist;
+ do {
+ PUP(out) = PUP(from);
+ } while (--len);
+ continue;
+ }
+#endif
}
from = window - OFF;
- if (write == 0) { /* very common case */
+ if (wnext == 0) { /* very common case */
from += wsize - op;
if (op < len) { /* some from window */
len -= op;
@@ -207,17 +227,17 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
from = out - dist; /* rest from output */
}
}
- else if (write < op) { /* wrap around window */
- from += wsize + write - op;
- op -= write;
+ else if (wnext < op) { /* wrap around window */
+ from += wsize + wnext - op;
+ op -= wnext;
if (op < len) { /* some from end of window */
len -= op;
do {
PUP(out) = PUP(from);
} while (--op);
from = window - OFF;
- if (write < len) { /* some from start of window */
- op = write;
+ if (wnext < len) { /* some from start of window */
+ op = wnext;
len -= op;
do {
PUP(out) = PUP(from);
@@ -227,7 +247,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
}
}
else { /* contiguous in window */
- from += write - op;
+ from += wnext - op;
if (op < len) { /* some from window */
len -= op;
do {
@@ -264,7 +284,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
}
}
else if ((op & 64) == 0) { /* 2nd level distance code */
- this = dcode[this.val + (hold & ((1U << op) - 1))];
+ here = dcode[here.val + (hold & ((1U << op) - 1))];
goto dodist;
}
else {
@@ -274,7 +294,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
}
}
else if ((op & 64) == 0) { /* 2nd level length code */
- this = lcode[this.val + (hold & ((1U << op) - 1))];
+ here = lcode[here.val + (hold & ((1U << op) - 1))];
goto dolen;
}
else if (op & 32) { /* end-of-block */
@@ -310,7 +330,7 @@ unsigned start; /* inflate()'s starting value for strm->avail_out */
inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
- Using bit fields for code structure
- Different op definition to avoid & for extra bits (do & for table bits)
- - Three separate decoding do-loops for direct, window, and write == 0
+ - Three separate decoding do-loops for direct, window, and wnext == 0
- Special case for distance > 1 copies to do overlapped load and store copy
- Explicit branch predictions (based on measured branch probabilities)
- Deferring match copy and interspersed it with decoding subsequent codes
diff --git a/erts/emulator/zlib/inffast.h b/erts/emulator/zlib/inffast.h
index 623ed83c08..e5c1aa4ca8 100644
--- a/erts/emulator/zlib/inffast.h
+++ b/erts/emulator/zlib/inffast.h
@@ -1,13 +1,11 @@
/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995-2003 Mark Adler
+ * Copyright (C) 1995-2003, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
*/
-void inflate_fast OF((z_streamp strm, unsigned start));
+void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/erts/emulator/zlib/inffixed.h b/erts/emulator/zlib/inffixed.h
index 75ed4b5978..d628327769 100644
--- a/erts/emulator/zlib/inffixed.h
+++ b/erts/emulator/zlib/inffixed.h
@@ -2,9 +2,9 @@
* Generated automatically by makefixed().
*/
- /* WARNING: this file should *not* be used by applications. It
- is part of the implementation of the compression library and
- is subject to change. Applications should only use zlib.h.
+ /* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
*/
static const code lenfix[512] = {
diff --git a/erts/emulator/zlib/inflate.c b/erts/emulator/zlib/inflate.c
index 1764447c66..532330b06b 100644
--- a/erts/emulator/zlib/inflate.c
+++ b/erts/emulator/zlib/inflate.c
@@ -1,13 +1,8 @@
/* inflate.c -- zlib decompression
- * Copyright (C) 1995-2005 Mark Adler
+ * Copyright (C) 1995-2012 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
/*
* Change history:
*
@@ -50,7 +45,7 @@
* - Rearrange window copies in inflate_fast() for speed and simplification
* - Unroll last copy for window match in inflate_fast()
* - Use local copies of window variables in inflate_fast() for speed
- * - Pull out common write == 0 case for speed in inflate_fast()
+ * - Pull out common wnext == 0 case for speed in inflate_fast()
* - Make op and len in inflate_fast() unsigned for consistency
* - Add FAR to lcode and dcode declarations in inflate_fast()
* - Simplified bad distance check in inflate_fast()
@@ -85,6 +80,9 @@
* The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
*/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
#include "zutil.h"
#include "inftrees.h"
#include "inflate.h"
@@ -98,14 +96,15 @@
/* function prototypes */
local void fixedtables OF((struct inflate_state FAR *state));
-local int updatewindow OF((z_streamp strm, unsigned out));
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
+ unsigned copy));
#ifdef BUILDFIXED
void makefixed OF((void));
#endif
-local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
unsigned len));
-int ZEXPORT inflateReset(strm)
+int ZEXPORT inflateResetKeep(strm)
z_streamp strm;
{
struct inflate_state FAR *state;
@@ -114,36 +113,71 @@ z_streamp strm;
state = (struct inflate_state FAR *)strm->state;
strm->total_in = strm->total_out = state->total = 0;
strm->msg = Z_NULL;
- strm->adler = 1; /* to support ill-conceived Java test suite */
+ if (state->wrap) /* to support ill-conceived Java test suite */
+ strm->adler = state->wrap & 1;
state->mode = HEAD;
state->last = 0;
state->havedict = 0;
state->dmax = 32768U;
state->head = Z_NULL;
- state->wsize = 0;
- state->whave = 0;
- state->write = 0;
state->hold = 0;
state->bits = 0;
state->lencode = state->distcode = state->next = state->codes;
+ state->sane = 1;
+ state->back = -1;
Tracev((stderr, "inflate: reset\n"));
return Z_OK;
}
-int ZEXPORT inflatePrime(strm, bits, value)
+int ZEXPORT inflateReset(strm)
z_streamp strm;
-int bits;
-int value;
{
struct inflate_state FAR *state;
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
state = (struct inflate_state FAR *)strm->state;
- if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
- value &= (1L << bits) - 1;
- state->hold += value << state->bits;
- state->bits += bits;
- return Z_OK;
+ state->wsize = 0;
+ state->whave = 0;
+ state->wnext = 0;
+ return inflateResetKeep(strm);
+}
+
+int ZEXPORT inflateReset2(strm, windowBits)
+z_streamp strm;
+int windowBits;
+{
+ int wrap;
+ struct inflate_state FAR *state;
+
+ /* get the state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* extract wrap request from windowBits parameter */
+ if (windowBits < 0) {
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+ else {
+ wrap = (windowBits >> 4) + 1;
+#ifdef GUNZIP
+ if (windowBits < 48)
+ windowBits &= 15;
+#endif
+ }
+
+ /* set number of window bits, free window if different */
+ if (windowBits && (windowBits < 8 || windowBits > 15))
+ return Z_STREAM_ERROR;
+ if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
+ ZFREE(strm, state->window);
+ state->window = Z_NULL;
+ }
+
+ /* update state and reset the rest of it */
+ state->wrap = wrap;
+ state->wbits = (unsigned)windowBits;
+ return inflateReset(strm);
}
int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
@@ -152,6 +186,7 @@ int windowBits;
const char *version;
int stream_size;
{
+ int ret;
struct inflate_state FAR *state;
if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
@@ -160,33 +195,31 @@ int stream_size;
if (strm == Z_NULL) return Z_STREAM_ERROR;
strm->msg = Z_NULL; /* in case we return an error */
if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
strm->zalloc = zcalloc;
strm->opaque = (voidpf)0;
+#endif
}
- if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
state = (struct inflate_state FAR *)
ZALLOC(strm, 1, sizeof(struct inflate_state));
if (state == Z_NULL) return Z_MEM_ERROR;
Tracev((stderr, "inflate: allocated\n"));
strm->state = (struct internal_state FAR *)state;
- if (windowBits < 0) {
- state->wrap = 0;
- windowBits = -windowBits;
- }
- else {
- state->wrap = (windowBits >> 4) + 1;
-#ifdef GUNZIP
- if (windowBits < 48) windowBits &= 15;
-#endif
- }
- if (windowBits < 8 || windowBits > 15) {
+ state->window = Z_NULL;
+ ret = inflateReset2(strm, windowBits);
+ if (ret != Z_OK) {
ZFREE(strm, state);
strm->state = Z_NULL;
- return Z_STREAM_ERROR;
}
- state->wbits = (unsigned)windowBits;
- state->window = Z_NULL;
- return inflateReset(strm);
+ return ret;
}
int ZEXPORT inflateInit_(strm, version, stream_size)
@@ -197,6 +230,27 @@ int stream_size;
return inflateInit2_(strm, DEF_WBITS, version, stream_size);
}
+int ZEXPORT inflatePrime(strm, bits, value)
+z_streamp strm;
+int bits;
+int value;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (bits < 0) {
+ state->hold = 0;
+ state->bits = 0;
+ return Z_OK;
+ }
+ if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
+ value &= (1L << bits) - 1;
+ state->hold += value << state->bits;
+ state->bits += bits;
+ return Z_OK;
+}
+
/*
Return state with length and distance decoding tables and index sizes set to
fixed code decoding. Normally this returns fixed tables from inffixed.h.
@@ -291,8 +345,8 @@ void makefixed()
low = 0;
for (;;) {
if ((low % 7) == 0) printf("\n ");
- printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
- state.lencode[low].val);
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+ state.lencode[low].bits, state.lencode[low].val);
if (++low == size) break;
putchar(',');
}
@@ -325,12 +379,13 @@ void makefixed()
output will fall in the output data, making match copies simpler and faster.
The advantage may be dependent on the size of the processor's data caches.
*/
-local int updatewindow(strm, out)
+local int updatewindow(strm, end, copy)
z_streamp strm;
-unsigned out;
+const Bytef *end;
+unsigned copy;
{
struct inflate_state FAR *state;
- unsigned copy, dist;
+ unsigned dist;
state = (struct inflate_state FAR *)strm->state;
@@ -345,30 +400,29 @@ unsigned out;
/* if window not in use yet, initialize */
if (state->wsize == 0) {
state->wsize = 1U << state->wbits;
- state->write = 0;
+ state->wnext = 0;
state->whave = 0;
}
/* copy state->wsize or less output bytes into the circular window */
- copy = out - strm->avail_out;
if (copy >= state->wsize) {
- zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
- state->write = 0;
+ zmemcpy(state->window, end - state->wsize, state->wsize);
+ state->wnext = 0;
state->whave = state->wsize;
}
else {
- dist = state->wsize - state->write;
+ dist = state->wsize - state->wnext;
if (dist > copy) dist = copy;
- zmemcpy(state->window + state->write, strm->next_out - copy, dist);
+ zmemcpy(state->window + state->wnext, end - copy, dist);
copy -= dist;
if (copy) {
- zmemcpy(state->window, strm->next_out - copy, copy);
- state->write = copy;
+ zmemcpy(state->window, end - copy, copy);
+ state->wnext = copy;
state->whave = state->wsize;
}
else {
- state->write += dist;
- if (state->write == state->wsize) state->write = 0;
+ state->wnext += dist;
+ if (state->wnext == state->wsize) state->wnext = 0;
if (state->whave < state->wsize) state->whave += dist;
}
}
@@ -469,11 +523,6 @@ unsigned out;
bits -= bits & 7; \
} while (0)
-/* Reverse the bytes in a 32-bit value */
-#define REVERSE(q) \
- ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
- (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
-
/*
inflate() uses a state machine to process as much input data and generate as
much output data as possible before returning. The state machine is
@@ -561,7 +610,7 @@ z_streamp strm;
int flush;
{
struct inflate_state FAR *state;
- unsigned char FAR *next; /* next input */
+ z_const unsigned char FAR *next; /* next input */
unsigned char FAR *put; /* next output */
unsigned have, left; /* available input and output */
unsigned long hold; /* bit buffer */
@@ -569,7 +618,7 @@ int flush;
unsigned in, out; /* save starting available input and output */
unsigned copy; /* number of stored or match bytes to copy */
unsigned char FAR *from; /* where to copy match bytes from */
- code this; /* current decoding table entry */
+ code here; /* current decoding table entry */
code last; /* parent table entry */
unsigned len; /* length to copy for repeats, bits to drop */
int ret; /* return code */
@@ -624,7 +673,9 @@ int flush;
}
DROPBITS(4);
len = BITS(4) + 8;
- if (len > state->wbits) {
+ if (state->wbits == 0)
+ state->wbits = len;
+ else if (len > state->wbits) {
strm->msg = (char *)"invalid window size";
state->mode = BAD;
break;
@@ -765,7 +816,7 @@ int flush;
#endif
case DICTID:
NEEDBITS(32);
- strm->adler = state->check = REVERSE(hold);
+ strm->adler = state->check = ZSWAP32(hold);
INITBITS();
state->mode = DICT;
case DICT:
@@ -776,7 +827,7 @@ int flush;
strm->adler = state->check = adler32(0L, Z_NULL, 0);
state->mode = TYPE;
case TYPE:
- if (flush == Z_BLOCK) goto inf_leave;
+ if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
case TYPEDO:
if (state->last) {
BYTEBITS();
@@ -796,7 +847,11 @@ int flush;
fixedtables(state);
Tracev((stderr, "inflate: fixed codes block%s\n",
state->last ? " (last)" : ""));
- state->mode = LEN; /* decode codes */
+ state->mode = LEN_; /* decode codes */
+ if (flush == Z_TREES) {
+ DROPBITS(2);
+ goto inf_leave;
+ }
break;
case 2: /* dynamic block */
Tracev((stderr, "inflate: dynamic codes block%s\n",
@@ -821,6 +876,9 @@ int flush;
Tracev((stderr, "inflate: stored length %u\n",
state->length));
INITBITS();
+ state->mode = COPY_;
+ if (flush == Z_TREES) goto inf_leave;
+ case COPY_:
state->mode = COPY;
case COPY:
copy = state->length;
@@ -866,7 +924,7 @@ int flush;
while (state->have < 19)
state->lens[order[state->have++]] = 0;
state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
+ state->lencode = (const code FAR *)(state->next);
state->lenbits = 7;
ret = inflate_table(CODES, state->lens, 19, &(state->next),
&(state->lenbits), state->work);
@@ -881,19 +939,18 @@ int flush;
case CODELENS:
while (state->have < state->nlen + state->ndist) {
for (;;) {
- this = state->lencode[BITS(state->lenbits)];
- if ((unsigned)(this.bits) <= bits) break;
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
PULLBYTE();
}
- if (this.val < 16) {
- NEEDBITS(this.bits);
- DROPBITS(this.bits);
- state->lens[state->have++] = this.val;
+ if (here.val < 16) {
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
}
else {
- if (this.val == 16) {
- NEEDBITS(this.bits + 2);
- DROPBITS(this.bits);
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
if (state->have == 0) {
strm->msg = (char *)"invalid bit length repeat";
state->mode = BAD;
@@ -903,16 +960,16 @@ int flush;
copy = 3 + BITS(2);
DROPBITS(2);
}
- else if (this.val == 17) {
- NEEDBITS(this.bits + 3);
- DROPBITS(this.bits);
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
len = 0;
copy = 3 + BITS(3);
DROPBITS(3);
}
else {
- NEEDBITS(this.bits + 7);
- DROPBITS(this.bits);
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
len = 0;
copy = 11 + BITS(7);
DROPBITS(7);
@@ -930,9 +987,18 @@ int flush;
/* handle error breaks in while */
if (state->mode == BAD) break;
- /* build code tables */
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ state->mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftrees.h
+ concerning the ENOUGH constants, which depend on those values */
state->next = state->codes;
- state->lencode = (code const FAR *)(state->next);
+ state->lencode = (const code FAR *)(state->next);
state->lenbits = 9;
ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
&(state->lenbits), state->work);
@@ -941,7 +1007,7 @@ int flush;
state->mode = BAD;
break;
}
- state->distcode = (code const FAR *)(state->next);
+ state->distcode = (const code FAR *)(state->next);
state->distbits = 6;
ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
&(state->next), &(state->distbits), state->work);
@@ -951,88 +1017,102 @@ int flush;
break;
}
Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN_;
+ if (flush == Z_TREES) goto inf_leave;
+ case LEN_:
state->mode = LEN;
case LEN:
if (have >= 6 && left >= 258) {
RESTORE();
inflate_fast(strm, out);
LOAD();
+ if (state->mode == TYPE)
+ state->back = -1;
break;
}
+ state->back = 0;
for (;;) {
- this = state->lencode[BITS(state->lenbits)];
- if ((unsigned)(this.bits) <= bits) break;
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
PULLBYTE();
}
- if (this.op && (this.op & 0xf0) == 0) {
- last = this;
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
for (;;) {
- this = state->lencode[last.val +
+ here = state->lencode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
- if ((unsigned)(last.bits + this.bits) <= bits) break;
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
+ state->back += last.bits;
}
- DROPBITS(this.bits);
- state->length = (unsigned)this.val;
- if ((int)(this.op) == 0) {
- Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ state->length = (unsigned)here.val;
+ if ((int)(here.op) == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
"inflate: literal '%c'\n" :
- "inflate: literal 0x%02x\n", this.val));
+ "inflate: literal 0x%02x\n", here.val));
state->mode = LIT;
break;
}
- if (this.op & 32) {
+ if (here.op & 32) {
Tracevv((stderr, "inflate: end of block\n"));
+ state->back = -1;
state->mode = TYPE;
break;
}
- if (this.op & 64) {
+ if (here.op & 64) {
strm->msg = (char *)"invalid literal/length code";
state->mode = BAD;
break;
}
- state->extra = (unsigned)(this.op) & 15;
+ state->extra = (unsigned)(here.op) & 15;
state->mode = LENEXT;
case LENEXT:
if (state->extra) {
NEEDBITS(state->extra);
state->length += BITS(state->extra);
DROPBITS(state->extra);
+ state->back += state->extra;
}
Tracevv((stderr, "inflate: length %u\n", state->length));
+ state->was = state->length;
state->mode = DIST;
case DIST:
for (;;) {
- this = state->distcode[BITS(state->distbits)];
- if ((unsigned)(this.bits) <= bits) break;
+ here = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
PULLBYTE();
}
- if ((this.op & 0xf0) == 0) {
- last = this;
+ if ((here.op & 0xf0) == 0) {
+ last = here;
for (;;) {
- this = state->distcode[last.val +
+ here = state->distcode[last.val +
(BITS(last.bits + last.op) >> last.bits)];
- if ((unsigned)(last.bits + this.bits) <= bits) break;
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
PULLBYTE();
}
DROPBITS(last.bits);
+ state->back += last.bits;
}
- DROPBITS(this.bits);
- if (this.op & 64) {
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ if (here.op & 64) {
strm->msg = (char *)"invalid distance code";
state->mode = BAD;
break;
}
- state->offset = (unsigned)this.val;
- state->extra = (unsigned)(this.op) & 15;
+ state->offset = (unsigned)here.val;
+ state->extra = (unsigned)(here.op) & 15;
state->mode = DISTEXT;
case DISTEXT:
if (state->extra) {
NEEDBITS(state->extra);
state->offset += BITS(state->extra);
DROPBITS(state->extra);
+ state->back += state->extra;
}
#ifdef INFLATE_STRICT
if (state->offset > state->dmax) {
@@ -1041,11 +1121,6 @@ int flush;
break;
}
#endif
- if (state->offset > state->whave + out - left) {
- strm->msg = (char *)"invalid distance too far back";
- state->mode = BAD;
- break;
- }
Tracevv((stderr, "inflate: distance %u\n", state->offset));
state->mode = MATCH;
case MATCH:
@@ -1053,12 +1128,32 @@ int flush;
copy = out - left;
if (state->offset > copy) { /* copy from window */
copy = state->offset - copy;
- if (copy > state->write) {
- copy -= state->write;
+ if (copy > state->whave) {
+ if (state->sane) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ Trace((stderr, "inflate.c too far\n"));
+ copy -= state->whave;
+ if (copy > state->length) copy = state->length;
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = 0;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+#endif
+ }
+ if (copy > state->wnext) {
+ copy -= state->wnext;
from = state->window + (state->wsize - copy);
}
else
- from = state->window + (state->write - copy);
+ from = state->window + (state->wnext - copy);
if (copy > state->length) copy = state->length;
}
else { /* copy from output */
@@ -1093,7 +1188,7 @@ int flush;
#ifdef GUNZIP
state->flags ? hold :
#endif
- REVERSE(hold)) != state->check) {
+ ZSWAP32(hold)) != state->check) {
strm->msg = (char *)"incorrect data check";
state->mode = BAD;
break;
@@ -1137,8 +1232,9 @@ int flush;
*/
inf_leave:
RESTORE();
- if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
- if (updatewindow(strm, out)) {
+ if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
+ (state->mode < CHECK || flush != Z_FINISH)))
+ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
state->mode = MEM;
return Z_MEM_ERROR;
}
@@ -1151,7 +1247,8 @@ int flush;
strm->adler = state->check =
UPDATE(state->check, strm->next_out - out, out);
strm->data_type = state->bits + (state->last ? 64 : 0) +
- (state->mode == TYPE ? 128 : 0);
+ (state->mode == TYPE ? 128 : 0) +
+ (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
ret = Z_BUF_ERROR;
return ret;
@@ -1171,13 +1268,37 @@ z_streamp strm;
return Z_OK;
}
+int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
+z_streamp strm;
+Bytef *dictionary;
+uInt *dictLength;
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* copy dictionary */
+ if (state->whave && dictionary != Z_NULL) {
+ zmemcpy(dictionary, state->window + state->wnext,
+ state->whave - state->wnext);
+ zmemcpy(dictionary + state->whave - state->wnext,
+ state->window, state->wnext);
+ }
+ if (dictLength != Z_NULL)
+ *dictLength = state->whave;
+ return Z_OK;
+}
+
int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
z_streamp strm;
const Bytef *dictionary;
uInt dictLength;
{
struct inflate_state FAR *state;
- unsigned long id;
+ unsigned long dictid;
+ int ret;
/* check state */
if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
@@ -1185,29 +1306,21 @@ uInt dictLength;
if (state->wrap != 0 && state->mode != DICT)
return Z_STREAM_ERROR;
- /* check for correct dictionary id */
+ /* check for correct dictionary identifier */
if (state->mode == DICT) {
- id = adler32(0L, Z_NULL, 0);
- id = adler32(id, dictionary, dictLength);
- if (id != state->check)
+ dictid = adler32(0L, Z_NULL, 0);
+ dictid = adler32(dictid, dictionary, dictLength);
+ if (dictid != state->check)
return Z_DATA_ERROR;
}
- /* copy dictionary to window */
- if (updatewindow(strm, strm->avail_out)) {
+ /* copy dictionary to window using updatewindow(), which will amend the
+ existing dictionary if appropriate */
+ ret = updatewindow(strm, dictionary + dictLength, dictLength);
+ if (ret) {
state->mode = MEM;
return Z_MEM_ERROR;
}
- if (dictLength > state->wsize) {
- zmemcpy(state->window, dictionary + dictLength - state->wsize,
- state->wsize);
- state->whave = state->wsize;
- }
- else {
- zmemcpy(state->window + state->wsize - dictLength, dictionary,
- dictLength);
- state->whave = dictLength;
- }
state->havedict = 1;
Tracev((stderr, "inflate: dictionary set\n"));
return Z_OK;
@@ -1243,7 +1356,7 @@ gz_headerp head;
*/
local unsigned syncsearch(have, buf, len)
unsigned FAR *have;
-unsigned char FAR *buf;
+const unsigned char FAR *buf;
unsigned len;
{
unsigned got;
@@ -1355,8 +1468,8 @@ z_streamp source;
}
/* copy state */
- zmemcpy(dest, source, sizeof(z_stream));
- zmemcpy(copy, state, sizeof(struct inflate_state));
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
if (state->lencode >= state->codes &&
state->lencode <= state->codes + ENOUGH - 1) {
copy->lencode = copy->codes + (state->lencode - state->codes);
@@ -1371,3 +1484,32 @@ z_streamp source;
dest->state = (struct internal_state FAR *)copy;
return Z_OK;
}
+
+int ZEXPORT inflateUndermine(strm, subvert)
+z_streamp strm;
+int subvert;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ state->sane = !subvert;
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ return Z_OK;
+#else
+ state->sane = 1;
+ return Z_DATA_ERROR;
+#endif
+}
+
+long ZEXPORT inflateMark(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;
+ state = (struct inflate_state FAR *)strm->state;
+ return ((long)(state->back) << 16) +
+ (state->mode == COPY ? state->length :
+ (state->mode == MATCH ? state->was - state->length : 0));
+}
diff --git a/erts/emulator/zlib/inflate.h b/erts/emulator/zlib/inflate.h
index 59164091c5..95f4986d40 100644
--- a/erts/emulator/zlib/inflate.h
+++ b/erts/emulator/zlib/inflate.h
@@ -1,10 +1,8 @@
/* inflate.h -- internal inflate state definition
- * Copyright (C) 1995-2004 Mark Adler
+ * Copyright (C) 1995-2009 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
@@ -34,11 +32,13 @@ typedef enum {
TYPE, /* i: waiting for type bits, including last-flag bit */
TYPEDO, /* i: same, but skip check to exit inflate on new block */
STORED, /* i: waiting for stored size (length and complement) */
+ COPY_, /* i/o: same as COPY below, but only first time in */
COPY, /* i/o: waiting for input or output to copy stored block */
TABLE, /* i: waiting for dynamic block table lengths */
LENLENS, /* i: waiting for code length code lengths */
CODELENS, /* i: waiting for length/lit and distance code lengths */
- LEN, /* i: waiting for length/lit code */
+ LEN_, /* i: same as LEN below, but only first time in */
+ LEN, /* i: waiting for length/lit/eob code */
LENEXT, /* i: waiting for length extra bits */
DIST, /* i: waiting for distance code */
DISTEXT, /* i: waiting for distance extra bits */
@@ -55,19 +55,21 @@ typedef enum {
/*
State transitions between above modes -
- (most modes can go to the BAD or MEM mode -- not shown for clarity)
+ (most modes can go to BAD or MEM on error -- not shown for clarity)
Process header:
- HEAD -> (gzip) or (zlib)
- (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME
- NAME -> COMMENT -> HCRC -> TYPE
+ HEAD -> (gzip) or (zlib) or (raw)
+ (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
+ HCRC -> TYPE
(zlib) -> DICTID or TYPE
DICTID -> DICT -> TYPE
+ (raw) -> TYPEDO
Read deflate blocks:
- TYPE -> STORED or TABLE or LEN or CHECK
- STORED -> COPY -> TYPE
- TABLE -> LENLENS -> CODELENS -> LEN
- Read deflate codes:
+ TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
+ STORED -> COPY_ -> COPY -> TYPE
+ TABLE -> LENLENS -> CODELENS -> LEN_
+ LEN_ -> LEN
+ Read deflate codes in fixed or dynamic block:
LEN -> LENEXT or LIT or TYPE
LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
LIT -> LEN
@@ -75,7 +77,7 @@ typedef enum {
CHECK -> LENGTH -> DONE
*/
-/* state maintained between inflate() calls. Approximately 7K bytes. */
+/* state maintained between inflate() calls. Approximately 10K bytes. */
struct inflate_state {
inflate_mode mode; /* current inflate mode */
int last; /* true if processing last block */
@@ -90,7 +92,7 @@ struct inflate_state {
unsigned wbits; /* log base 2 of requested window size */
unsigned wsize; /* window size or zero if not using window */
unsigned whave; /* valid bytes in the window */
- unsigned write; /* window write index */
+ unsigned wnext; /* window write index */
unsigned char FAR *window; /* allocated sliding window, if needed */
/* bit accumulator */
unsigned long hold; /* input bit accumulator */
@@ -114,4 +116,7 @@ struct inflate_state {
unsigned short lens[320]; /* temporary storage for code lengths */
unsigned short work[288]; /* work area for code table building */
code codes[ENOUGH]; /* space for code tables */
+ int sane; /* if false, allow invalid distance too far */
+ int back; /* bits back of last unprocessed length/lit */
+ unsigned was; /* initial length of match */
};
diff --git a/erts/emulator/zlib/inftrees.c b/erts/emulator/zlib/inftrees.c
index 832fe28668..3766fa2646 100644
--- a/erts/emulator/zlib/inftrees.c
+++ b/erts/emulator/zlib/inftrees.c
@@ -1,10 +1,8 @@
/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2005 Mark Adler
+ * Copyright (C) 1995-2013 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
@@ -14,7 +12,7 @@
#define MAXBITS 15
const char inflate_copyright[] =
- " inflate 1.2.3 Copyright 1995-2005 Mark Adler ";
+ " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";
/*
If you use the zlib library in a product, an acknowledgment is welcome
in the documentation of your product. If for some reason you cannot
@@ -34,7 +32,7 @@ const char inflate_copyright[] =
table index bits. It will differ if the request is greater than the
longest code or if it is less than the shortest code.
*/
-int inflate_table(type, lens, codes, table, bits, work)
+int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
codetype type;
unsigned short FAR *lens;
unsigned codes;
@@ -55,7 +53,7 @@ unsigned short FAR *work;
unsigned fill; /* index for replicating entries */
unsigned low; /* low bits for current root entry */
unsigned mask; /* mask for low root bits */
- code this; /* table entry for duplication */
+ code here; /* table entry for duplication */
code FAR *next; /* next available space in table */
const unsigned short FAR *base; /* base value table to use */
const unsigned short FAR *extra; /* extra bits table to use */
@@ -67,7 +65,7 @@ unsigned short FAR *work;
35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
static const unsigned short lext[31] = { /* Length codes 257..285 extra */
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
- 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196};
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};
static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
@@ -120,15 +118,15 @@ unsigned short FAR *work;
if (count[max] != 0) break;
if (root > max) root = max;
if (max == 0) { /* no symbols to code at all */
- this.op = (unsigned char)64; /* invalid code marker */
- this.bits = (unsigned char)1;
- this.val = (unsigned short)0;
- *(*table)++ = this; /* make a table to force an error */
- *(*table)++ = this;
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)1;
+ here.val = (unsigned short)0;
+ *(*table)++ = here; /* make a table to force an error */
+ *(*table)++ = here;
*bits = 1;
return 0; /* no symbols, but wait for decoding to report error */
}
- for (min = 1; min <= MAXBITS; min++)
+ for (min = 1; min < max; min++)
if (count[min] != 0) break;
if (root < min) root = min;
@@ -171,11 +169,10 @@ unsigned short FAR *work;
entered in the tables.
used keeps track of how many table entries have been allocated from the
- provided *table space. It is checked when a LENS table is being made
- against the space in *table, ENOUGH, minus the maximum space needed by
- the worst case distance code, MAXD. This should never happen, but the
- sufficiency of ENOUGH has not been proven exhaustively, hence the check.
- This assumes that when type == LENS, bits == 9.
+ provided *table space. It is checked for LENS and DIST tables against
+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+ the initial root table size constants. See the comments in inftrees.h
+ for more information.
sym increments through all symbols, and the loop terminates when
all codes of length max, i.e. all codes, have been processed. This
@@ -214,24 +211,25 @@ unsigned short FAR *work;
mask = used - 1; /* mask for comparing low */
/* check available table space */
- if (type == LENS && used >= ENOUGH - MAXD)
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
return 1;
/* process all codes and make table entries */
for (;;) {
/* create table entry */
- this.bits = (unsigned char)(len - drop);
+ here.bits = (unsigned char)(len - drop);
if ((int)(work[sym]) < end) {
- this.op = (unsigned char)0;
- this.val = work[sym];
+ here.op = (unsigned char)0;
+ here.val = work[sym];
}
else if ((int)(work[sym]) > end) {
- this.op = (unsigned char)(extra[work[sym]]);
- this.val = base[work[sym]];
+ here.op = (unsigned char)(extra[work[sym]]);
+ here.val = base[work[sym]];
}
else {
- this.op = (unsigned char)(32 + 64); /* end of block */
- this.val = 0;
+ here.op = (unsigned char)(32 + 64); /* end of block */
+ here.val = 0;
}
/* replicate for those indices with low len bits equal to huff */
@@ -240,7 +238,7 @@ unsigned short FAR *work;
min = fill; /* save offset to next table */
do {
fill -= incr;
- next[(huff >> drop) + fill] = this;
+ next[(huff >> drop) + fill] = here;
} while (fill != 0);
/* backwards increment the len-bit code huff */
@@ -282,7 +280,8 @@ unsigned short FAR *work;
/* check for enough space */
used += 1U << curr;
- if (type == LENS && used >= ENOUGH - MAXD)
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
return 1;
/* point entry in root table to sub-table */
@@ -293,38 +292,14 @@ unsigned short FAR *work;
}
}
- /*
- Fill in rest of table for incomplete codes. This loop is similar to the
- loop above in incrementing huff for table indices. It is assumed that
- len is equal to curr + drop, so there is no loop needed to increment
- through high index bits. When the current sub-table is filled, the loop
- drops back to the root table to fill in any remaining entries there.
- */
- this.op = (unsigned char)64; /* invalid code marker */
- this.bits = (unsigned char)(len - drop);
- this.val = (unsigned short)0;
- while (huff != 0) {
- /* when done with sub-table, drop back to root table */
- if (drop != 0 && (huff & mask) != low) {
- drop = 0;
- len = root;
- next = *table;
- this.bits = (unsigned char)len;
- }
-
- /* put invalid code marker in table */
- next[huff >> drop] = this;
-
- /* backwards increment the len-bit code huff */
- incr = 1U << (len - 1);
- while (huff & incr)
- incr >>= 1;
- if (incr != 0) {
- huff &= incr - 1;
- huff += incr;
- }
- else
- huff = 0;
+ /* fill in remaining table entry if code is incomplete (guaranteed to have
+ at most one remaining entry, since if the code is incomplete, the
+ maximum code length that was allowed to get this far is one bit) */
+ if (huff != 0) {
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)(len - drop);
+ here.val = (unsigned short)0;
+ next[huff] = here;
}
/* set return parameters */
diff --git a/erts/emulator/zlib/inftrees.h b/erts/emulator/zlib/inftrees.h
index 808100f70a..baa53a0b1a 100644
--- a/erts/emulator/zlib/inftrees.h
+++ b/erts/emulator/zlib/inftrees.h
@@ -1,10 +1,8 @@
/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995-2005 Mark Adler
+ * Copyright (C) 1995-2005, 2010 Mark Adler
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
@@ -37,21 +35,28 @@ typedef struct {
01000000 - invalid code
*/
-/* Maximum size of dynamic tree. The maximum found in a long but non-
- exhaustive search was 1444 code structures (852 for length/literals
- and 592 for distances, the latter actually the result of an
- exhaustive search). The true maximum is not known, but the value
- below is more than safe. */
-#define ENOUGH 2048
-#define MAXD 592
+/* Maximum size of the dynamic table. The maximum number of code structures is
+ 1444, which is the sum of 852 for literal/length codes and 592 for distance
+ codes. These values were found by exhaustive searches using the program
+ examples/enough.c found in the zlib distribtution. The arguments to that
+ program are the number of symbols, the initial root table size, and the
+ maximum bit length of a code. "enough 286 9 15" for literal/length codes
+ returns returns 852, and "enough 30 6 15" for distance codes returns 592.
+ The initial root table size (9 or 6) is found in the fifth argument of the
+ inflate_table() calls in inflate.c and infback.c. If the root table size is
+ changed, then these maximum sizes would be need to be recalculated and
+ updated. */
+#define ENOUGH_LENS 852
+#define ENOUGH_DISTS 592
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
-/* Type of code to build for inftable() */
+/* Type of code to build for inflate_table() */
typedef enum {
CODES,
LENS,
DISTS
} codetype;
-extern int inflate_table OF((codetype type, unsigned short FAR *lens,
+int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
unsigned codes, code FAR * FAR *table,
unsigned FAR *bits, unsigned short FAR *work));
diff --git a/erts/emulator/zlib/trees.c b/erts/emulator/zlib/trees.c
index 7d9f77f451..465e944e5b 100644
--- a/erts/emulator/zlib/trees.c
+++ b/erts/emulator/zlib/trees.c
@@ -1,10 +1,9 @@
/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2005 Jean-loup Gailly
+ * Copyright (C) 1995-2012 Jean-loup Gailly
+ * detect_data_type() function provided freely by Cosmin Truta, 2006
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/*
* ALGORITHM
*
@@ -78,11 +77,6 @@ local const uch bl_order[BL_CODES]
* probability, to avoid transmitting the lengths for unused bit length codes.
*/
-#define Buf_size (8 * 2*sizeof(char))
-/* Number of bits used within bi_buf. (bi_buf might be implemented on
- * more than 16 bits on some systems.)
- */
-
/* ===========================================================================
* Local data. These are initialized only once.
*/
@@ -155,9 +149,9 @@ local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
local int build_bl_tree OF((deflate_state *s));
local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
int blcodes));
-local void compress_block OF((deflate_state *s, ct_data *ltree,
- ct_data *dtree));
-local void set_data_type OF((deflate_state *s));
+local void compress_block OF((deflate_state *s, const ct_data *ltree,
+ const ct_data *dtree));
+local int detect_data_type OF((deflate_state *s));
local unsigned bi_reverse OF((unsigned value, int length));
local void bi_windup OF((deflate_state *s));
local void bi_flush OF((deflate_state *s));
@@ -208,12 +202,12 @@ local void send_bits(s, value, length)
* unused bits in value.
*/
if (s->bi_valid > (int)Buf_size - length) {
- s->bi_buf |= (value << s->bi_valid);
+ s->bi_buf |= (ush)value << s->bi_valid;
put_short(s, s->bi_buf);
s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
s->bi_valid += length - Buf_size;
} else {
- s->bi_buf |= value << s->bi_valid;
+ s->bi_buf |= (ush)value << s->bi_valid;
s->bi_valid += length;
}
}
@@ -223,12 +217,12 @@ local void send_bits(s, value, length)
{ int len = length;\
if (s->bi_valid > (int)Buf_size - len) {\
int val = value;\
- s->bi_buf |= (val << s->bi_valid);\
+ s->bi_buf |= (ush)val << s->bi_valid;\
put_short(s, s->bi_buf);\
s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
s->bi_valid += len - Buf_size;\
} else {\
- s->bi_buf |= (value) << s->bi_valid;\
+ s->bi_buf |= (ush)(value) << s->bi_valid;\
s->bi_valid += len;\
}\
}
@@ -255,11 +249,13 @@ local void tr_static_init()
if (static_init_done) return;
/* For some embedded targets, global variables are not initialized: */
+#ifdef NO_INIT_GLOBAL_POINTERS
static_l_desc.static_tree = static_ltree;
static_l_desc.extra_bits = extra_lbits;
static_d_desc.static_tree = static_dtree;
static_d_desc.extra_bits = extra_dbits;
static_bl_desc.extra_bits = extra_blbits;
+#endif
/* Initialize the mapping length (0..255) -> length code (0..28) */
length = 0;
@@ -353,13 +349,14 @@ void gen_trees_header()
static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
}
- fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
+ fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");
for (i = 0; i < DIST_CODE_LEN; i++) {
fprintf(header, "%2u%s", _dist_code[i],
SEPARATOR(i, DIST_CODE_LEN-1, 20));
}
- fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+ fprintf(header,
+ "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
fprintf(header, "%2u%s", _length_code[i],
SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
@@ -384,7 +381,7 @@ void gen_trees_header()
/* ===========================================================================
* Initialize the tree data structures for a new zlib stream.
*/
-void _tr_init(s)
+void ZLIB_INTERNAL _tr_init(s)
deflate_state *s;
{
tr_static_init();
@@ -400,7 +397,6 @@ void _tr_init(s)
s->bi_buf = 0;
s->bi_valid = 0;
- s->last_eob_len = 8; /* enough lookahead for inflate */
#ifdef DEBUG
s->compressed_len = 0L;
s->bits_sent = 0L;
@@ -869,13 +865,13 @@ local void send_all_trees(s, lcodes, dcodes, blcodes)
/* ===========================================================================
* Send a stored block
*/
-void _tr_stored_block(s, buf, stored_len, eof)
+void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
deflate_state *s;
charf *buf; /* input block */
ulg stored_len; /* length of input block */
- int eof; /* true if this is the last block for a file */
+ int last; /* one if this is the last block for a file */
{
- send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
+ send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */
#ifdef DEBUG
s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
s->compressed_len += (stored_len + 4) << 3;
@@ -884,17 +880,19 @@ void _tr_stored_block(s, buf, stored_len, eof)
}
/* ===========================================================================
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
+ */
+void ZLIB_INTERNAL _tr_flush_bits(s)
+ deflate_state *s;
+{
+ bi_flush(s);
+}
+
+/* ===========================================================================
* Send one empty static block to give enough lookahead for inflate.
* This takes 10 bits, of which 7 may remain in the bit buffer.
- * The current inflate code requires 9 bits of lookahead. If the
- * last two codes for the previous block (real code plus EOB) were coded
- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- * the last real code. In this case we send two empty static blocks instead
- * of one. (There are no problems if the previous block is stored or fixed.)
- * To simplify the code, we assume the worst case of last real code encoded
- * on one bit only.
*/
-void _tr_align(s)
+void ZLIB_INTERNAL _tr_align(s)
deflate_state *s;
{
send_bits(s, STATIC_TREES<<1, 3);
@@ -903,31 +901,17 @@ void _tr_align(s)
s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
#endif
bi_flush(s);
- /* Of the 10 bits for the empty block, we have already sent
- * (10 - bi_valid) bits. The lookahead for the last real code (before
- * the EOB of the previous block) was thus at least one plus the length
- * of the EOB plus what we have just sent of the empty static block.
- */
- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L;
-#endif
- bi_flush(s);
- }
- s->last_eob_len = 7;
}
/* ===========================================================================
* Determine the best encoding for the current block: dynamic trees, static
* trees or store, and output the encoded block to the zip file.
*/
-void _tr_flush_block(s, buf, stored_len, eof)
+void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
deflate_state *s;
charf *buf; /* input block, or NULL if too old */
ulg stored_len; /* length of input block */
- int eof; /* true if this is the last block for a file */
+ int last; /* one if this is the last block for a file */
{
ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
int max_blindex = 0; /* index of last bit length code of non zero freq */
@@ -936,8 +920,8 @@ void _tr_flush_block(s, buf, stored_len, eof)
if (s->level > 0) {
/* Check if the file is binary or text */
- if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN)
- set_data_type(s);
+ if (s->strm->data_type == Z_UNKNOWN)
+ s->strm->data_type = detect_data_type(s);
/* Construct the literal and distance trees */
build_tree(s, (tree_desc *)(&(s->l_desc)));
@@ -983,23 +967,25 @@ void _tr_flush_block(s, buf, stored_len, eof)
* successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
* transform a block into a stored block.
*/
- _tr_stored_block(s, buf, stored_len, eof);
+ _tr_stored_block(s, buf, stored_len, last);
#ifdef FORCE_STATIC
} else if (static_lenb >= 0) { /* force static trees */
#else
} else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
#endif
- send_bits(s, (STATIC_TREES<<1)+eof, 3);
- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
+ send_bits(s, (STATIC_TREES<<1)+last, 3);
+ compress_block(s, (const ct_data *)static_ltree,
+ (const ct_data *)static_dtree);
#ifdef DEBUG
s->compressed_len += 3 + s->static_len;
#endif
} else {
- send_bits(s, (DYN_TREES<<1)+eof, 3);
+ send_bits(s, (DYN_TREES<<1)+last, 3);
send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
max_blindex+1);
- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
+ compress_block(s, (const ct_data *)s->dyn_ltree,
+ (const ct_data *)s->dyn_dtree);
#ifdef DEBUG
s->compressed_len += 3 + s->opt_len;
#endif
@@ -1010,21 +996,21 @@ void _tr_flush_block(s, buf, stored_len, eof)
*/
init_block(s);
- if (eof) {
+ if (last) {
bi_windup(s);
#ifdef DEBUG
s->compressed_len += 7; /* align on byte boundary */
#endif
}
Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- s->compressed_len-7*eof));
+ s->compressed_len-7*last));
}
/* ===========================================================================
* Save the match info and tally the frequency counts. Return true if
* the current block must be flushed.
*/
-int _tr_tally (s, dist, lc)
+int ZLIB_INTERNAL _tr_tally (s, dist, lc)
deflate_state *s;
unsigned dist; /* distance of matched string */
unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
@@ -1076,8 +1062,8 @@ int _tr_tally (s, dist, lc)
*/
local void compress_block(s, ltree, dtree)
deflate_state *s;
- ct_data *ltree; /* literal tree */
- ct_data *dtree; /* distance tree */
+ const ct_data *ltree; /* literal tree */
+ const ct_data *dtree; /* distance tree */
{
unsigned dist; /* distance of matched string */
int lc; /* match length or unmatched char (if dist == 0) */
@@ -1119,28 +1105,48 @@ local void compress_block(s, ltree, dtree)
} while (lx < s->last_lit);
send_code(s, END_BLOCK, ltree);
- s->last_eob_len = ltree[END_BLOCK].Len;
}
/* ===========================================================================
- * Set the data type to BINARY or TEXT, using a crude approximation:
- * set it to Z_TEXT if all symbols are either printable characters (33 to 255)
- * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise.
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ * a) There are no non-portable control characters belonging to the
+ * "black list" (0..6, 14..25, 28..31).
+ * b) There is at least one printable character belonging to the
+ * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ * "gray list" that is ignored in this detection algorithm:
+ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
* IN assertion: the fields Freq of dyn_ltree are set.
*/
-local void set_data_type(s)
+local int detect_data_type(s)
deflate_state *s;
{
+ /* black_mask is the bit mask of black-listed bytes
+ * set bits 0..6, 14..25, and 28..31
+ * 0xf3ffc07f = binary 11110011111111111100000001111111
+ */
+ unsigned long black_mask = 0xf3ffc07fUL;
int n;
- for (n = 0; n < 9; n++)
+ /* Check for non-textual ("black-listed") bytes. */
+ for (n = 0; n <= 31; n++, black_mask >>= 1)
+ if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+ return Z_BINARY;
+
+ /* Check for textual ("white-listed") bytes. */
+ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+ || s->dyn_ltree[13].Freq != 0)
+ return Z_TEXT;
+ for (n = 32; n < LITERALS; n++)
if (s->dyn_ltree[n].Freq != 0)
- break;
- if (n == 9)
- for (n = 14; n < 32; n++)
- if (s->dyn_ltree[n].Freq != 0)
- break;
- s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY;
+ return Z_TEXT;
+
+ /* There are no "black-listed" or "white-listed" bytes:
+ * this stream either is empty or has tolerated ("gray-listed") bytes only.
+ */
+ return Z_BINARY;
}
/* ===========================================================================
@@ -1206,7 +1212,6 @@ local void copy_block(s, buf, len, header)
int header; /* true if block header must be written */
{
bi_windup(s); /* align on byte boundary */
- s->last_eob_len = 8; /* enough lookahead for inflate */
if (header) {
put_short(s, (ush)len);
diff --git a/erts/emulator/zlib/trees.h b/erts/emulator/zlib/trees.h
index 72facf900f..d35639d82a 100644
--- a/erts/emulator/zlib/trees.h
+++ b/erts/emulator/zlib/trees.h
@@ -70,7 +70,7 @@ local const ct_data static_dtree[D_CODES] = {
{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
};
-const uch _dist_code[DIST_CODE_LEN] = {
+const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
@@ -99,7 +99,7 @@ const uch _dist_code[DIST_CODE_LEN] = {
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
};
-const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
+const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
diff --git a/erts/emulator/zlib/uncompr.c b/erts/emulator/zlib/uncompr.c
index cbc93cb1eb..864d571719 100644
--- a/erts/emulator/zlib/uncompr.c
+++ b/erts/emulator/zlib/uncompr.c
@@ -1,10 +1,8 @@
/* uncompr.c -- decompress a memory buffer
- * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
#ifdef HAVE_CONFIG_H
@@ -21,8 +19,6 @@
been saved previously by the compressor and transmitted to the decompressor
by some mechanism outside the scope of this compression library.)
Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_BUF_ERROR if there was not enough room in the output
@@ -37,7 +33,7 @@ int ZEXPORT uncompress (dest, destLen, source, sourceLen)
z_stream stream;
int err;
- stream.next_in = (Bytef*)source;
+ stream.next_in = (z_const Bytef *)source;
stream.avail_in = (uInt)sourceLen;
/* Check for source > 64K on 16-bit machine: */
if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
diff --git a/erts/emulator/zlib/zconf.h b/erts/emulator/zlib/zconf.h
index b7979d48d3..9987a77553 100644
--- a/erts/emulator/zlib/zconf.h
+++ b/erts/emulator/zlib/zconf.h
@@ -1,10 +1,8 @@
/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
#ifndef ZCONF_H
@@ -13,52 +11,145 @@
/*
* If you *really* need a unique prefix for all types and library functions,
* compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
*/
-#ifdef Z_PREFIX
-# define deflateInit_ z_deflateInit_
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
# define deflateEnd z_deflateEnd
-# define inflateInit_ z_inflateInit_
-# define inflate z_inflate
-# define inflateEnd z_inflateEnd
# define deflateInit2_ z_deflateInit2_
-# define deflateSetDictionary z_deflateSetDictionary
-# define deflateCopy z_deflateCopy
-# define deflateReset z_deflateReset
+# define deflateInit_ z_deflateInit_
# define deflateParams z_deflateParams
-# define deflateBound z_deflateBound
+# define deflatePending z_deflatePending
# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzvprintf z_gzvprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetHeader z_inflateGetHeader
# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
# define inflateSetDictionary z_inflateSetDictionary
+# define inflateGetDictionary z_inflateGetDictionary
# define inflateSync z_inflateSync
# define inflateSyncPoint z_inflateSyncPoint
-# define inflateCopy z_inflateCopy
-# define inflateReset z_inflateReset
-# define inflateBack z_inflateBack
-# define inflateBackEnd z_inflateBackEnd
-# define compress z_compress
-# define compress2 z_compress2
-# define compressBound z_compressBound
-# define uncompress z_uncompress
-# define adler32 z_adler32
-# define crc32 z_crc32
-# define get_crc_table z_get_crc_table
+# define inflateUndermine z_inflateUndermine
+# define inflateResetKeep z_inflateResetKeep
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# endif
# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
# define alloc_func z_alloc_func
+# define charf z_charf
# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
# define in_func z_in_func
+# define intf z_intf
# define out_func z_out_func
-# define Byte z_Byte
# define uInt z_uInt
-# define uLong z_uLong
-# define Bytef z_Bytef
-# define charf z_charf
-# define intf z_intf
# define uIntf z_uIntf
+# define uLong z_uLong
# define uLongf z_uLongf
-# define voidpf z_voidpf
# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
#endif
#if defined(__MSDOS__) && !defined(MSDOS)
@@ -127,6 +218,12 @@
# endif
#endif
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
/* Some Mac compilers merge all .h files incorrectly: */
#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)
# define NO_DUMMY_DECL
@@ -173,6 +270,14 @@
# endif
#endif
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
/* The following definitions for FAR are needed only for MSDOS mixed
* model programming (small or medium model with some far allocations).
* This was tested only with MSC; for other MSDOS compilers you may have
@@ -286,49 +391,121 @@ typedef uLong FAR uLongf;
typedef Byte *voidp;
#endif
-#if 0 /* HAVE_UNISTD_H -- this line is updated by ./configure */
-# include <sys/types.h> /* for off_t */
-# include <unistd.h> /* for SEEK_* and off_t */
-# ifdef VMS
-# include <unixio.h> /* for off_t */
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
# endif
-# define z_off_t off_t
#endif
-#ifndef SEEK_SET
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
# define SEEK_SET 0 /* Seek from beginning of file. */
# define SEEK_CUR 1 /* Seek from current position. */
# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
#endif
+
#ifndef z_off_t
# define z_off_t long
#endif
-#if defined(__OS400__)
-# define NO_vsnprintf
-#endif
-
-#if defined(__MVS__)
-# define NO_vsnprintf
-# ifdef FAR
-# undef FAR
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
# endif
#endif
/* MVS linker does not support external names larger than 8 bytes */
#if defined(__MVS__)
-# pragma map(deflateInit_,"DEIN")
-# pragma map(deflateInit2_,"DEIN2")
-# pragma map(deflateEnd,"DEEND")
-# pragma map(deflateBound,"DEBND")
-# pragma map(inflateInit_,"ININ")
-# pragma map(inflateInit2_,"ININ2")
-# pragma map(inflateEnd,"INEND")
-# pragma map(inflateSync,"INSY")
-# pragma map(inflateSetDictionary,"INSEDI")
-# pragma map(compressBound,"CMBND")
-# pragma map(inflate_table,"INTABL")
-# pragma map(inflate_fast,"INFA")
-# pragma map(inflate_copyright,"INCOPY")
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
#endif
#endif /* ZCONF_H */
diff --git a/erts/emulator/zlib/zlib.h b/erts/emulator/zlib/zlib.h
index 9209774383..3e0c7672ac 100644
--- a/erts/emulator/zlib/zlib.h
+++ b/erts/emulator/zlib/zlib.h
@@ -1,7 +1,7 @@
/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.2.3, July 18th, 2005
+ version 1.2.8, April 28th, 2013
- Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+ Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
@@ -24,12 +24,10 @@
The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
*/
-/* %ExternalCopyright% */
-
#ifndef ZLIB_H
#define ZLIB_H
@@ -39,41 +37,44 @@
extern "C" {
#endif
-#define ZLIB_VERSION "1.2.3"
-#define ZLIB_VERNUM 0x1230
+#define ZLIB_VERSION "1.2.8"
+#define ZLIB_VERNUM 0x1280
+#define ZLIB_VER_MAJOR 1
+#define ZLIB_VER_MINOR 2
+#define ZLIB_VER_REVISION 8
+#define ZLIB_VER_SUBREVISION 0
/*
- The 'zlib' compression library provides in-memory compression and
- decompression functions, including integrity checks of the uncompressed
- data. This version of the library supports only one compression method
- (deflation) but other algorithms will be added later and will have the same
- stream interface.
-
- Compression can be done in a single step if the buffers are large
- enough (for example if an input file is mmap'ed), or can be done by
- repeated calls of the compression function. In the latter case, the
- application must provide more input and/or consume the output
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed data.
+ This version of the library supports only one compression method (deflation)
+ but other algorithms will be added later and will have the same stream
+ interface.
+
+ Compression can be done in a single step if the buffers are large enough,
+ or can be done by repeated calls of the compression function. In the latter
+ case, the application must provide more input and/or consume the output
(providing more output space) before each call.
- The compressed data format used by default by the in-memory functions is
+ The compressed data format used by default by the in-memory functions is
the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
around a deflate stream, which is itself documented in RFC 1951.
- The library also supports reading and writing files in gzip (.gz) format
+ The library also supports reading and writing files in gzip (.gz) format
with an interface similar to that of stdio using the functions that start
with "gz". The gzip format is different from the zlib format. gzip is a
gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
- This library can optionally read and write gzip streams in memory as well.
+ This library can optionally read and write gzip streams in memory as well.
- The zlib format was designed to be compact and fast for use in memory
+ The zlib format was designed to be compact and fast for use in memory
and on communications channels. The gzip format was designed for single-
file compression on file systems, has a larger header than zlib to maintain
directory information, and uses a different, slower check method than zlib.
- The library does not install any signal handler. The decoder checks
- the consistency of the compressed data, so the library should never
- crash even in case of corrupted input.
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never crash
+ even in case of corrupted input.
*/
typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
@@ -82,15 +83,15 @@ typedef void (*free_func) OF((voidpf opaque, voidpf address));
struct internal_state;
typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
+ z_const Bytef *next_in; /* next input byte */
uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
+ uLong total_in; /* total number of input bytes read so far */
Bytef *next_out; /* next output byte should be put there */
uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
+ uLong total_out; /* total number of bytes output so far */
- char *msg; /* last error message, NULL if no error */
+ z_const char *msg; /* last error message, NULL if no error */
struct internal_state FAR *state; /* not visible by applications */
alloc_func zalloc; /* used to allocate the internal state */
@@ -128,45 +129,45 @@ typedef struct gz_header_s {
typedef gz_header FAR *gz_headerp;
/*
- The application must update next_in and avail_in when avail_in has
- dropped to zero. It must update next_out and avail_out when avail_out
- has dropped to zero. The application must initialize zalloc, zfree and
- opaque before calling the init function. All other fields are set by the
- compression library and must not be updated by the application.
-
- The opaque value provided by the application will be passed as the first
- parameter for calls of zalloc and zfree. This can be useful for custom
- memory management. The compression library attaches no meaning to the
+ The application must update next_in and avail_in when avail_in has dropped
+ to zero. It must update next_out and avail_out when avail_out has dropped
+ to zero. The application must initialize zalloc, zfree and opaque before
+ calling the init function. All other fields are set by the compression
+ library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
opaque value.
- zalloc must return Z_NULL if there is not enough memory for the object.
+ zalloc must return Z_NULL if there is not enough memory for the object.
If zlib is used in a multi-threaded application, zalloc and zfree must be
thread safe.
- On 16-bit systems, the functions zalloc and zfree must be able to allocate
- exactly 65536 bytes, but will not be required to allocate more than this
- if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
- pointers returned by zalloc for objects of exactly 65536 bytes *must*
- have their offset normalized to zero. The default allocation function
- provided by this library ensures this (see zutil.c). To reduce memory
- requirements and avoid any allocation of 64K objects, at the expense of
- compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
- The fields total_in and total_out can be used for statistics or
- progress reports. After compression, total_in holds the total size of
- the uncompressed data and may be saved for use in the decompressor
- (particularly if the decompressor wants to decompress everything in
- a single step).
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this if
+ the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers
+ returned by zalloc for objects of exactly 65536 bytes *must* have their
+ offset normalized to zero. The default allocation function provided by this
+ library ensures this (see zutil.c). To reduce memory requirements and avoid
+ any allocation of 64K objects, at the expense of compression ratio, compile
+ the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or progress
+ reports. After compression, total_in holds the total size of the
+ uncompressed data and may be saved for use in the decompressor (particularly
+ if the decompressor wants to decompress everything in a single step).
*/
/* constants */
#define Z_NO_FLUSH 0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_PARTIAL_FLUSH 1
#define Z_SYNC_FLUSH 2
#define Z_FULL_FLUSH 3
#define Z_FINISH 4
#define Z_BLOCK 5
+#define Z_TREES 6
/* Allowed flush values; see deflate() and inflate() below for details */
#define Z_OK 0
@@ -178,8 +179,8 @@ typedef gz_header FAR *gz_headerp;
#define Z_MEM_ERROR (-4)
#define Z_BUF_ERROR (-5)
#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
*/
#define Z_NO_COMPRESSION 0
@@ -209,119 +210,141 @@ typedef gz_header FAR *gz_headerp;
#define zlib_version zlibVersion()
/* for compatibility with versions < 1.0.2 */
+
/* basic functions */
ZEXTERN const char * ZEXPORT zlibVersion OF((void));
/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
- If the first character differs, the library code actually used is
- not compatible with the zlib.h header file used by the application.
- This check is automatically made by deflateInit and inflateInit.
+ If the first character differs, the library code actually used is not
+ compatible with the zlib.h header file used by the application. This check
+ is automatically made by deflateInit and inflateInit.
*/
/*
ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
- Initializes the internal stream state for compression. The fields
- zalloc, zfree and opaque must be initialized before by the caller.
- If zalloc and zfree are set to Z_NULL, deflateInit updates them to
- use default allocation functions.
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller. If
+ zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
+ allocation functions.
The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
- 1 gives best speed, 9 gives best compression, 0 gives no compression at
- all (the input data is simply copied a block at a time).
- Z_DEFAULT_COMPRESSION requests a default compromise between speed and
- compression (currently equivalent to level 6).
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at all
+ (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION
+ requests a default compromise between speed and compression (currently
+ equivalent to level 6).
- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if level is not a valid compression level, or
Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
- with the version assumed by the caller (ZLIB_VERSION).
- msg is set to null if there is no error message. deflateInit does not
- perform any compression: this will be done by deflate().
+ with the version assumed by the caller (ZLIB_VERSION). msg is set to null
+ if there is no error message. deflateInit does not perform any compression:
+ this will be done by deflate().
*/
ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
/*
deflate compresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce some
- output latency (reading input without producing any output) except when
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
forced to flush.
- The detailed semantics are as follows. deflate performs one or both of the
+ The detailed semantics are as follows. deflate performs one or both of the
following actions:
- Compress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
+ accordingly. If not all input can be processed (because there is not
enough room in the output buffer), next_in and avail_in are updated and
processing will resume at this point for the next call of deflate().
- Provide more output starting at next_out and update next_out and avail_out
- accordingly. This action is forced if the parameter flush is non zero.
+ accordingly. This action is forced if the parameter flush is non zero.
Forcing flush frequently degrades the compression ratio, so this parameter
- should be set only when necessary (in interactive applications).
- Some output may be provided even if flush is not set.
-
- Before the call of deflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating avail_in or avail_out accordingly; avail_out
- should never be zero before the call. The application can consume the
- compressed output when it wants, for example when the output buffer is full
- (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
- and with zero avail_out, it must be called again after making room in the
- output buffer because there might be more output pending.
+ should be set only when necessary (in interactive applications). Some
+ output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating avail_in or avail_out accordingly; avail_out should
+ never be zero before the call. The application can consume the compressed
+ output when it wants, for example when the output buffer is full (avail_out
+ == 0), or after each call of deflate(). If deflate returns Z_OK and with
+ zero avail_out, it must be called again after making room in the output
+ buffer because there might be more output pending.
Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
- decide how much data to accumualte before producing output, in order to
+ decide how much data to accumulate before producing output, in order to
maximize compression.
If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
flushed to the output buffer and the output is aligned on a byte boundary, so
- that the decompressor can get all input data available so far. (In particular
- avail_in is zero after the call if enough output space has been provided
- before the call.) Flushing may degrade compression for some compression
- algorithms and so it should be used only when necessary.
+ that the decompressor can get all input data available so far. (In
+ particular avail_in is zero after the call if enough output space has been
+ provided before the call.) Flushing may degrade compression for some
+ compression algorithms and so it should be used only when necessary. This
+ completes the current deflate block and follows it with an empty stored block
+ that is three bits plus filler bits to the next byte, followed by four bytes
+ (00 00 ff ff).
+
+ If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the
+ output buffer, but the output is not aligned to a byte boundary. All of the
+ input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.
+ This completes the current deflate block and follows it with an empty fixed
+ codes block that is 10 bits long. This assures that enough bytes are output
+ in order for the decompressor to finish the block before the empty fixed code
+ block.
+
+ If flush is set to Z_BLOCK, a deflate block is completed and emitted, as
+ for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to
+ seven bits of the current block are held to be written as the next byte after
+ the next deflate block is completed. In this case, the decompressor may not
+ be provided enough bits at this point in order to complete decompression of
+ the data provided so far to the compressor. It may need to wait for the next
+ block to be emitted. This is for advanced applications that need to control
+ the emission of deflate blocks.
If flush is set to Z_FULL_FLUSH, all output is flushed as with
Z_SYNC_FLUSH, and the compression state is reset so that decompression can
restart from this point if previous compressed data has been damaged or if
- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
compression.
If deflate returns with avail_out == 0, this function must be called again
with the same value of the flush parameter and more output space (updated
avail_out), until the flush is complete (deflate returns with non-zero
- avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
avail_out is greater than six to avoid repeated flush markers due to
avail_out == 0 on return.
If the parameter flush is set to Z_FINISH, pending input is processed,
- pending output is flushed and deflate returns with Z_STREAM_END if there
- was enough output space; if deflate returns with Z_OK, this function must be
+ pending output is flushed and deflate returns with Z_STREAM_END if there was
+ enough output space; if deflate returns with Z_OK, this function must be
called again with Z_FINISH and more output space (updated avail_out) but no
- more input data, until it returns with Z_STREAM_END or an error. After
- deflate has returned Z_STREAM_END, the only possible operations on the
- stream are deflateReset or deflateEnd.
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the stream
+ are deflateReset or deflateEnd.
Z_FINISH can be used immediately after deflateInit if all the compression
- is to be done in a single step. In this case, avail_out must be at least
- the value returned by deflateBound (see below). If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
+ is to be done in a single step. In this case, avail_out must be at least the
+ value returned by deflateBound (see below). Then deflate is guaranteed to
+ return Z_STREAM_END. If not enough output space is provided, deflate will
+ not return Z_STREAM_END, and it must be called again as described above.
deflate() sets strm->adler to the adler32 checksum of all input read
so far (that is, total_in bytes).
deflate() may update strm->data_type if it can make a good guess about
- the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
- binary. This field is only for information purposes and does not affect
- the compression algorithm in any manner.
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect the
+ compression algorithm in any manner.
deflate() returns Z_OK if some progress has been made (more input
processed or more output produced), Z_STREAM_END if all input has been
consumed and all output has been produced (only when flush is set to
Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
- if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
- (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
fatal, and deflate() can be called again with more input and more output
space to continue compressing.
*/
@@ -330,13 +353,13 @@ ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
/*
All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
+ This function discards any unprocessed input and does not flush any pending
+ output.
deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
stream state was inconsistent, Z_DATA_ERROR if the stream was freed
- prematurely (some input or output was discarded). In the error case,
- msg may be set but then points to a static string (which must not be
+ prematurely (some input or output was discarded). In the error case, msg
+ may be set but then points to a static string (which must not be
deallocated).
*/
@@ -344,10 +367,10 @@ ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
/*
ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
- Initializes the internal stream state for decompression. The fields
+ Initializes the internal stream state for decompression. The fields
next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
- value depends on the compression method), inflateInit determines the
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the
+ exact value depends on the compression method), inflateInit determines the
compression method from the zlib header and allocates all data structures
accordingly; otherwise the allocation will be deferred to the first call of
inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
@@ -355,95 +378,116 @@ ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
- version assumed by the caller. msg is set to null if there is no error
- message. inflateInit does not perform any decompression apart from reading
- the zlib header if present: this will be done by inflate(). (So next_in and
- avail_in may be modified, but next_out and avail_out are unchanged.)
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit() does not process any header information -- that is deferred
+ until inflate() is called.
*/
ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
/*
inflate decompresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce
+ buffer becomes empty or the output buffer becomes full. It may introduce
some output latency (reading input without producing any output) except when
forced to flush.
- The detailed semantics are as follows. inflate performs one or both of the
+ The detailed semantics are as follows. inflate performs one or both of the
following actions:
- Decompress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in is updated and processing
- will resume at this point for the next call of inflate().
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing will
+ resume at this point for the next call of inflate().
- Provide more output starting at next_out and update next_out and avail_out
- accordingly. inflate() provides as much output as possible, until there
- is no more input data or no more space in the output buffer (see below
- about the flush parameter).
-
- Before the call of inflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating the next_* and avail_* values accordingly.
- The application can consume the uncompressed output when it wants, for
- example when the output buffer is full (avail_out == 0), or after each
- call of inflate(). If inflate returns Z_OK and with zero avail_out, it
- must be called again after making room in the output buffer because there
- might be more output pending.
-
- The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
- Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
- output as possible to the output buffer. Z_BLOCK requests that inflate() stop
- if and when it gets to the next deflate block boundary. When decoding the
- zlib or gzip format, this will cause inflate() to return immediately after
- the header and before the first block. When doing a raw inflate, inflate()
- will go ahead and process the first block, and will return when it gets to
- the end of that block, or when it runs out of data.
+ accordingly. inflate() provides as much output as possible, until there is
+ no more input data or no more space in the output buffer (see below about
+ the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating the next_* and avail_* values accordingly. The
+ application can consume the uncompressed output when it wants, for example
+ when the output buffer is full (avail_out == 0), or after each call of
+ inflate(). If inflate returns Z_OK and with zero avail_out, it must be
+ called again after making room in the output buffer because there might be
+ more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,
+ Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate()
+ stop if and when it gets to the next deflate block boundary. When decoding
+ the zlib or gzip format, this will cause inflate() to return immediately
+ after the header and before the first block. When doing a raw inflate,
+ inflate() will go ahead and process the first block, and will return when it
+ gets to the end of that block, or when it runs out of data.
The Z_BLOCK option assists in appending to or combining deflate streams.
Also to assist in this, on return inflate() will set strm->data_type to the
- number of unused bits in the last byte taken from strm->next_in, plus 64
- if inflate() is currently decoding the last block in the deflate stream,
- plus 128 if inflate() returned immediately after decoding an end-of-block
- code or decoding the complete header up to just before the first byte of the
- deflate stream. The end-of-block will not be indicated until all of the
- uncompressed data from that block has been written to strm->next_out. The
- number of unused bits may in general be greater than seven, except when
- bit 7 of data_type is set, in which case the number of unused bits will be
- less than eight.
+ number of unused bits in the last byte taken from strm->next_in, plus 64 if
+ inflate() is currently decoding the last block in the deflate stream, plus
+ 128 if inflate() returned immediately after decoding an end-of-block code or
+ decoding the complete header up to just before the first byte of the deflate
+ stream. The end-of-block will not be indicated until all of the uncompressed
+ data from that block has been written to strm->next_out. The number of
+ unused bits may in general be greater than seven, except when bit 7 of
+ data_type is set, in which case the number of unused bits will be less than
+ eight. data_type is set as noted here every time inflate() returns for all
+ flush options, and so can be used to determine the amount of currently
+ consumed input in bits.
+
+ The Z_TREES option behaves as Z_BLOCK does, but it also returns when the
+ end of each deflate block header is reached, before any actual data in that
+ block is decoded. This allows the caller to determine the length of the
+ deflate block header for later use in random access within a deflate block.
+ 256 is added to the value of strm->data_type when inflate() returns
+ immediately after reaching the end of the deflate block header.
inflate() should normally be called until it returns Z_STREAM_END or an
- error. However if all decompression is to be performed in a single step
- (a single call of inflate), the parameter flush should be set to
- Z_FINISH. In this case all pending input is processed and all pending
- output is flushed; avail_out must be large enough to hold all the
- uncompressed data. (The size of the uncompressed data may have been saved
- by the compressor for this purpose.) The next operation on this stream must
- be inflateEnd to deallocate the decompression state. The use of Z_FINISH
- is never required, but can be used to inform inflate that a faster approach
- may be used for the single inflate() call.
+ error. However if all decompression is to be performed in a single step (a
+ single call of inflate), the parameter flush should be set to Z_FINISH. In
+ this case all pending input is processed and all pending output is flushed;
+ avail_out must be large enough to hold all of the uncompressed data for the
+ operation to complete. (The size of the uncompressed data may have been
+ saved by the compressor for this purpose.) The use of Z_FINISH is not
+ required to perform an inflation in one step. However it may be used to
+ inform inflate that a faster approach can be used for the single inflate()
+ call. Z_FINISH also informs inflate to not maintain a sliding window if the
+ stream completes, which reduces inflate's memory footprint. If the stream
+ does not complete, either because not all of the stream is provided or not
+ enough output space is provided, then a sliding window will be allocated and
+ inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+ been used.
In this implementation, inflate() always flushes as much output as
possible to the output buffer, and always uses the faster approach on the
- first call. So the only effect of the flush parameter in this implementation
- is on the return value of inflate(), as noted below, or when it returns early
- because Z_BLOCK is used.
+ first call. So the effects of the flush parameter in this implementation are
+ on the return value of inflate() as noted below, when inflate() returns early
+ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+ memory for a sliding window when Z_FINISH is used.
If a preset dictionary is needed after this call (see inflateSetDictionary
- below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
- strm->adler to the adler32 checksum of all output produced so far (that is,
+ strm->adler to the Adler-32 checksum of all output produced so far (that is,
total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
- below. At the end of the stream, inflate() checks that its computed adler32
+ below. At the end of the stream, inflate() checks that its computed adler32
checksum is equal to that saved by the compressor and returns Z_STREAM_END
only if the checksum is correct.
- inflate() will decompress and check either zlib-wrapped or gzip-wrapped
- deflate data. The header type is detected automatically. Any information
- contained in the gzip header is not retained, so applications that need that
- information should instead use raw inflate, see inflateInit2() below, or
- inflateBack() and perform their own processing of the gzip header and
- trailer.
+ inflate() can decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically, if requested when
+ initializing with inflateInit2(). Any information contained in the gzip
+ header is not retained, so applications that need that information should
+ instead use raw inflate, see inflateInit2() below, or inflateBack() and
+ perform their own processing of the gzip header and trailer. When processing
+ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+ producted so far. The CRC-32 is checked against the gzip trailer.
inflate() returns Z_OK if some progress has been made (more input processed
or more output produced), Z_STREAM_END if the end of the compressed data has
@@ -451,27 +495,28 @@ ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
corrupted (input stream not conforming to the zlib format or incorrect check
value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
- if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+ next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,
Z_BUF_ERROR if no progress is possible or if there was not enough room in the
- output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
inflate() can be called again with more input and more output space to
- continue decompressing. If Z_DATA_ERROR is returned, the application may then
- call inflateSync() to look for a good compression block if a partial recovery
- of the data is desired.
+ continue decompressing. If Z_DATA_ERROR is returned, the application may
+ then call inflateSync() to look for a good compression block if a partial
+ recovery of the data is desired.
*/
ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
/*
All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
+ This function discards any unprocessed input and does not flush any pending
+ output.
inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
- was inconsistent. In the error case, msg may be set but then points to a
+ was inconsistent. In the error case, msg may be set but then points to a
static string (which must not be deallocated).
*/
+
/* Advanced functions */
/*
@@ -486,55 +531,57 @@ ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
int memLevel,
int strategy));
- This is another version of deflateInit with more compression options. The
- fields next_in, zalloc, zfree and opaque must be initialized before by
- the caller.
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by the
+ caller.
- The method parameter is the compression method. It must be Z_DEFLATED in
+ The method parameter is the compression method. It must be Z_DEFLATED in
this version of the library.
The windowBits parameter is the base two logarithm of the window size
- (the size of the history buffer). It should be in the range 8..15 for this
- version of the library. Larger values of this parameter result in better
- compression at the expense of memory usage. The default value is 15 if
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
deflateInit is used instead.
- windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
- determines the window size. deflate() will then generate raw deflate data
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
with no zlib header or trailer, and will not compute an adler32 check value.
- windowBits can also be greater than 15 for optional gzip encoding. Add
+ windowBits can also be greater than 15 for optional gzip encoding. Add
16 to windowBits to write a simple gzip header and trailer around the
- compressed data instead of a zlib wrapper. The gzip header will have no
- file name, no extra data, no comment, no modification time (set to zero),
- no header crc, and the operating system will be set to 255 (unknown). If a
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero), no
+ header crc, and the operating system will be set to 255 (unknown). If a
gzip stream is being written, strm->adler is a crc32 instead of an adler32.
The memLevel parameter specifies how much memory should be allocated
- for the internal compression state. memLevel=1 uses minimum memory but
- is slow and reduces compression ratio; memLevel=9 uses maximum memory
- for optimal speed. The default value is 8. See zconf.h for total memory
- usage as a function of windowBits and memLevel.
+ for the internal compression state. memLevel=1 uses minimum memory but is
+ slow and reduces compression ratio; memLevel=9 uses maximum memory for
+ optimal speed. The default value is 8. See zconf.h for total memory usage
+ as a function of windowBits and memLevel.
- The strategy parameter is used to tune the compression algorithm. Use the
+ The strategy parameter is used to tune the compression algorithm. Use the
value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
string match), or Z_RLE to limit match distances to one (run-length
- encoding). Filtered data consists mostly of small values with a somewhat
- random distribution. In this case, the compression algorithm is tuned to
- compress them better. The effect of Z_FILTERED is to force more Huffman
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
coding and less string matching; it is somewhat intermediate between
- Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
- Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
- parameter only affects the compression ratio but not the correctness of the
- compressed output even if it is not set appropriately. Z_FIXED prevents the
- use of dynamic Huffman codes, allowing for a simpler decoder for special
- applications.
-
- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
- method). msg is set to null if there is no error message. deflateInit2 does
- not perform any compression: this will be done by deflate().
+ Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as
+ fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The
+ strategy parameter only affects the compression ratio but not the
+ correctness of the compressed output even if it is not set appropriately.
+ Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
+ decoder for special applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
+ method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is
+ incompatible with the version assumed by the caller (ZLIB_VERSION). msg is
+ set to null if there is no error message. deflateInit2 does not perform any
+ compression: this will be done by deflate().
*/
ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
@@ -542,38 +589,43 @@ ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
uInt dictLength));
/*
Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any
- call of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
+ without producing any compressed output. When using the zlib format, this
+ function must be called immediately after deflateInit, deflateInit2 or
+ deflateReset, and before any call of deflate. When doing raw deflate, this
+ function must be called either before any call of deflate, or immediately
+ after the completion of a deflate block, i.e. after all input has been
+ consumed and all output has been delivered when using any of the flush
+ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The
+ compressor and decompressor must use exactly the same dictionary (see
+ inflateSetDictionary).
The dictionary should consist of strings (byte sequences) that are likely
to be encountered later in the data to be compressed, with the most commonly
- used strings preferably put towards the end of the dictionary. Using a
+ used strings preferably put towards the end of the dictionary. Using a
dictionary is most useful when the data to be compressed is short and can be
predicted with good accuracy; the data can then be compressed better than
with the default empty dictionary.
Depending on the size of the compression data structures selected by
deflateInit or deflateInit2, a part of the dictionary may in effect be
- discarded, for example if the dictionary is larger than the window size in
- deflate or deflate2. Thus the strings most likely to be useful should be
- put at the end of the dictionary, not at the front. In addition, the
- current implementation of deflate will use at most the window size minus
- 262 bytes of the provided dictionary.
+ discarded, for example if the dictionary is larger than the window size
+ provided in deflateInit or deflateInit2. Thus the strings most likely to be
+ useful should be put at the end of the dictionary, not at the front. In
+ addition, the current implementation of deflate will use at most the window
+ size minus 262 bytes of the provided dictionary.
Upon return of this function, strm->adler is set to the adler32 value
of the dictionary; the decompressor may later use this value to determine
- which dictionary has been used by the compressor. (The adler32 value
+ which dictionary has been used by the compressor. (The adler32 value
applies to the whole dictionary even if only a subset of the dictionary is
actually used by the compressor.) If a raw deflate was requested, then the
adler32 value is not computed and strm->adler is not set.
deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
+ or if not at a block boundary for raw deflate). deflateSetDictionary does
+ not perform any compression: this will be done by deflate().
*/
ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
@@ -583,26 +635,26 @@ ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
This function can be useful when several compression strategies will be
tried, for example when there are several ways of pre-processing the input
- data with a filter. The streams that will be discarded should then be freed
+ data with a filter. The streams that will be discarded should then be freed
by calling deflateEnd. Note that deflateCopy duplicates the internal
- compression state which can be quite large, so this strategy is slow and
- can consume lots of memory.
+ compression state which can be quite large, so this strategy is slow and can
+ consume lots of memory.
deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
destination.
*/
ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
/*
This function is equivalent to deflateEnd followed by deflateInit,
- but does not free and reallocate all the internal compression state.
- The stream will keep the same compression level and any other attributes
- that may have been set by deflateInit2.
+ but does not free and reallocate all the internal compression state. The
+ stream will keep the same compression level and any other attributes that
+ may have been set by deflateInit2.
- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
*/
ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
@@ -612,18 +664,18 @@ ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
Dynamically update the compression level and compression strategy. The
interpretation of level and strategy is as in deflateInit2. This can be
used to switch between compression and straight copy of the input data, or
- to switch to a different kind of input data requiring a different
- strategy. If the compression level is changed, the input available so far
- is compressed with the old level (and may be flushed); the new level will
- take effect only at the next call of deflate().
+ to switch to a different kind of input data requiring a different strategy.
+ If the compression level is changed, the input available so far is
+ compressed with the old level (and may be flushed); the new level will take
+ effect only at the next call of deflate().
Before the call of deflateParams, the stream state must be set as for
- a call of deflate(), since the currently available input may have to
- be compressed and flushed. In particular, strm->avail_out must be non-zero.
+ a call of deflate(), since the currently available input may have to be
+ compressed and flushed. In particular, strm->avail_out must be non-zero.
deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
- if strm->avail_out was zero.
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if
+ strm->avail_out was zero.
*/
ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
@@ -647,31 +699,53 @@ ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
uLong sourceLen));
/*
deflateBound() returns an upper bound on the compressed size after
- deflation of sourceLen bytes. It must be called after deflateInit()
- or deflateInit2(). This would be used to allocate an output buffer
- for deflation in a single pass, and so would be called before deflate().
+ deflation of sourceLen bytes. It must be called after deflateInit() or
+ deflateInit2(), and after deflateSetHeader(), if used. This would be used
+ to allocate an output buffer for deflation in a single pass, and so would be
+ called before deflate(). If that first deflate() call is provided the
+ sourceLen input bytes, an output buffer allocated to the size returned by
+ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+ to return Z_STREAM_END. Note that it is possible for the compressed size to
+ be larger than the value returned by deflateBound() if flush options other
+ than Z_FINISH or Z_NO_FLUSH are used.
*/
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+ unsigned *pending,
+ int *bits));
+/*
+ deflatePending() returns the number of bytes and bits of output that have
+ been generated, but not yet provided in the available output. The bytes not
+ provided would be due to the available output space having being consumed.
+ The number of bits of output not provided are between 0 and 7, where they
+ await more bits to join them in order to fill out a full byte. If pending
+ or bits are Z_NULL, then those values are not set.
+
+ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+ */
+
ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
int bits,
int value));
/*
deflatePrime() inserts bits in the deflate output stream. The intent
- is that this function is used to start off the deflate output with the
- bits leftover from a previous deflate stream when appending to it. As such,
- this function can only be used for raw deflate, and must be used before the
- first deflate() call after a deflateInit2() or deflateReset(). bits must be
- less than or equal to 16, and that many of the least significant bits of
- value will be inserted in the output.
-
- deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent.
+ is that this function is used to start off the deflate output with the bits
+ leftover from a previous deflate stream when appending to it. As such, this
+ function can only be used for raw deflate, and must be used before the first
+ deflate() call after a deflateInit2() or deflateReset(). bits must be less
+ than or equal to 16, and that many of the least significant bits of value
+ will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+ source stream state was inconsistent.
*/
ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
gz_headerp head));
/*
- deflateSetHeader() provides gzip header information for when a gzip
+ deflateSetHeader() provides gzip header information for when a gzip
stream is requested by deflateInit2(). deflateSetHeader() may be called
after deflateInit2() or deflateReset() and before the first call of
deflate(). The text, time, os, extra field, name, and comment information
@@ -684,11 +758,11 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
1.3.x) do not support header crc's, and will report that it is a "multi-part
gzip file" and give up.
- If deflateSetHeader is not used, the default gzip header has text false,
+ If deflateSetHeader is not used, the default gzip header has text false,
the time set to zero, and os set to 255, with no extra, name, or comment
fields. The gzip header is returned to the default state by deflateReset().
- deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
@@ -696,43 +770,50 @@ ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
int windowBits));
- This is another version of inflateInit with an extra parameter. The
+ This is another version of inflateInit with an extra parameter. The
fields next_in, avail_in, zalloc, zfree and opaque must be initialized
before by the caller.
The windowBits parameter is the base two logarithm of the maximum window
size (the size of the history buffer). It should be in the range 8..15 for
- this version of the library. The default value is 15 if inflateInit is used
- instead. windowBits must be greater than or equal to the windowBits value
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
provided to deflateInit2() while compressing, or it must be equal to 15 if
- deflateInit2() was not used. If a compressed stream with a larger window
+ deflateInit2() was not used. If a compressed stream with a larger window
size is given as input, inflate() will return with the error code
Z_DATA_ERROR instead of trying to allocate a larger window.
- windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
- determines the window size. inflate() will then process raw deflate data,
+ windowBits can also be zero to request that inflate use the window size in
+ the zlib header of the compressed stream.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
not looking for a zlib or gzip header, not generating a check value, and not
- looking for any check values for comparison at the end of the stream. This
+ looking for any check values for comparison at the end of the stream. This
is for use with other formats that use the deflate compressed data format
- such as zip. Those formats provide their own check values. If a custom
+ such as zip. Those formats provide their own check values. If a custom
format is developed using the raw deflate format for compressed data, it is
recommended that a check value such as an adler32 or a crc32 be applied to
the uncompressed data as is done in the zlib, gzip, and zip formats. For
- most applications, the zlib format should be used as is. Note that comments
+ most applications, the zlib format should be used as is. Note that comments
above on the use in deflateInit2() applies to the magnitude of windowBits.
- windowBits can also be greater than 15 for optional gzip decoding. Add
+ windowBits can also be greater than 15 for optional gzip decoding. Add
32 to windowBits to enable zlib and gzip decoding with automatic header
detection, or add 16 to decode only the gzip format (the zlib format will
- return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
- a crc32 instead of an adler32.
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
+ crc32 instead of an adler32.
inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
- is set to null if there is no error message. inflateInit2 does not perform
- any decompression apart from reading the zlib header if present: this will
- be done by inflate(). (So next_in and avail_in may be modified, but next_out
- and avail_out are unchanged.)
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit2 does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit2() does not process any header information -- that is
+ deferred until inflate() is called.
*/
ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
@@ -740,36 +821,56 @@ ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
uInt dictLength));
/*
Initializes the decompression dictionary from the given uncompressed byte
- sequence. This function must be called immediately after a call of inflate,
- if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
can be determined from the adler32 value returned by that call of inflate.
The compressor and decompressor must use exactly the same dictionary (see
- deflateSetDictionary). For raw inflate, this function can be called
- immediately after inflateInit2() or inflateReset() and before any call of
- inflate() to set the dictionary. The application must insure that the
- dictionary that was used for compression is provided.
+ deflateSetDictionary). For raw inflate, this function can be called at any
+ time to set the dictionary. If the provided dictionary is smaller than the
+ window and there is already data in the window, then the provided dictionary
+ will amend what's there. The application must insure that the dictionary
+ that was used for compression is provided.
inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
- expected one (incorrect adler32 value). inflateSetDictionary does not
+ expected one (incorrect adler32 value). inflateSetDictionary does not
perform any decompression: this will be done by subsequent calls of
inflate().
*/
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
- available input is skipped. No output is provided.
+ Returns the sliding dictionary being maintained by inflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If inflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been found,
- or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
- case, the application may save the current current value of total_in which
- indicates where valid compressed data was found. In the error case, the
- application may repeatedly call inflateSync, providing more input each time,
- until success or end of the input data.
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a possible full flush point (see above
+ for the description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+ All full flush points have this pattern, but not all occurrences of this
+ pattern are full flush points.
+
+ inflateSync returns Z_OK if a possible full flush point has been found,
+ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+ In the success case, the application may save the current current value of
+ total_in which indicates where valid compressed data was found. In the
+ error case, the application may repeatedly call inflateSync, providing more
+ input each time, until success or end of the input data.
*/
ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
@@ -784,18 +885,30 @@ ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
destination.
*/
ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
/*
This function is equivalent to inflateEnd followed by inflateInit,
- but does not free and reallocate all the internal decompression state.
- The stream will keep attributes that may have been set by inflateInit2.
+ but does not free and reallocate all the internal decompression state. The
+ stream will keep attributes that may have been set by inflateInit2.
- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
+ int windowBits));
+/*
+ This function is the same as inflateReset, but it also permits changing
+ the wrap and window size requests. The windowBits parameter is interpreted
+ the same as it is for inflateInit2.
+
+ inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL), or if
+ the windowBits parameter is invalid.
*/
ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
@@ -803,54 +916,87 @@ ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
int value));
/*
This function inserts bits in the inflate input stream. The intent is
- that this function is used to start inflating at a bit position in the
- middle of a byte. The provided bits will be used before any bytes are used
- from next_in. This function should only be used with raw inflate, and
- should be used before the first inflate() call after inflateInit2() or
- inflateReset(). bits must be less than or equal to 16, and that many of the
- least significant bits of value will be inserted in the input.
-
- inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ If bits is negative, then the input stream bit buffer is emptied. Then
+ inflatePrime() can be called again to put bits in the buffer. This is used
+ to clear out bits leftover after feeding inflate a block description prior
+ to feeding inflate codes.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+/*
+ This function returns two values, one in the lower 16 bits of the return
+ value, and the other in the remaining upper bits, obtained by shifting the
+ return value down 16 bits. If the upper value is -1 and the lower value is
+ zero, then inflate() is currently decoding information outside of a block.
+ If the upper value is -1 and the lower value is non-zero, then inflate is in
+ the middle of a stored block, with the lower value equaling the number of
+ bytes from the input remaining to copy. If the upper value is not -1, then
+ it is the number of bits back from the current bit position in the input of
+ the code (literal or length/distance pair) currently being processed. In
+ that case the lower value is the number of bytes already emitted for that
+ code.
+
+ A code is being processed if inflate is waiting for more input to complete
+ decoding of the code, or if it has completed decoding but is waiting for
+ more output space to write the literal or match data.
+
+ inflateMark() is used to mark locations in the input data for random
+ access, which may be at bit positions, and to note those cases where the
+ output of a code may span boundaries of random access blocks. The current
+ location in the input stream can be determined from avail_in and data_type
+ as noted in the description for the Z_BLOCK flush parameter for inflate.
+
+ inflateMark returns the value noted above or -1 << 16 if the provided
+ source stream state was inconsistent.
+*/
+
ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
gz_headerp head));
/*
- inflateGetHeader() requests that gzip header information be stored in the
+ inflateGetHeader() requests that gzip header information be stored in the
provided gz_header structure. inflateGetHeader() may be called after
inflateInit2() or inflateReset(), and before the first call of inflate().
As inflate() processes the gzip stream, head->done is zero until the header
is completed, at which time head->done is set to one. If a zlib stream is
being decoded, then head->done is set to -1 to indicate that there will be
- no gzip header information forthcoming. Note that Z_BLOCK can be used to
- force inflate() to return immediately after header processing is complete
- and before any actual data is decompressed.
+ no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be
+ used to force inflate() to return immediately after header processing is
+ complete and before any actual data is decompressed.
- The text, time, xflags, and os fields are filled in with the gzip header
+ The text, time, xflags, and os fields are filled in with the gzip header
contents. hcrc is set to true if there is a header CRC. (The header CRC
- was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
contains the maximum number of bytes to write to extra. Once done is true,
extra_len contains the actual extra field length, and extra contains the
extra field, or that field truncated if extra_max is less than extra_len.
If name is not Z_NULL, then up to name_max characters are written there,
terminated with a zero unless the length is greater than name_max. If
comment is not Z_NULL, then up to comm_max characters are written there,
- terminated with a zero unless the length is greater than comm_max. When
- any of extra, name, or comment are not Z_NULL and the respective field is
- not present in the header, then that field is set to Z_NULL to signal its
+ terminated with a zero unless the length is greater than comm_max. When any
+ of extra, name, or comment are not Z_NULL and the respective field is not
+ present in the header, then that field is set to Z_NULL to signal its
absence. This allows the use of deflateSetHeader() with the returned
structure to duplicate the header. However if those fields are set to
allocated memory, then the application will need to save those pointers
elsewhere so that they can be eventually freed.
- If inflateGetHeader is not used, then the header information is simply
+ If inflateGetHeader is not used, then the header information is simply
discarded. The header is always checked for validity, including the header
CRC if present. inflateReset() will reset the process to discard the header
information. The application would need to call inflateGetHeader() again to
retrieve the header from the next gzip stream.
- inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
stream state was inconsistent.
*/
@@ -871,12 +1017,13 @@ ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
See inflateBack() for the usage of these routines.
inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
- the paramaters are invalid, Z_MEM_ERROR if the internal state could not
- be allocated, or Z_VERSION_ERROR if the version of the library does not
- match the version of the header file.
+ the parameters are invalid, Z_MEM_ERROR if the internal state could not be
+ allocated, or Z_VERSION_ERROR if the version of the library does not match
+ the version of the header file.
*/
-typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef unsigned (*in_func) OF((void FAR *,
+ z_const unsigned char FAR * FAR *));
typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
@@ -884,24 +1031,25 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
out_func out, void FAR *out_desc));
/*
inflateBack() does a raw inflate with a single call using a call-back
- interface for input and output. This is more efficient than inflate() for
- file i/o applications in that it avoids copying between the output and the
- sliding window by simply making the window itself the output buffer. This
- function trusts the application to not change the output buffer passed by
- the output function, at least until inflateBack() returns.
+ interface for input and output. This is potentially more efficient than
+ inflate() for file i/o applications, in that it avoids copying between the
+ output and the sliding window by simply making the window itself the output
+ buffer. inflate() can be faster on modern CPUs when used with large
+ buffers. inflateBack() trusts the application to not change the output
+ buffer passed by the output function, at least until inflateBack() returns.
inflateBackInit() must be called first to allocate the internal state
and to initialize the state with the user-provided window buffer.
inflateBack() may then be used multiple times to inflate a complete, raw
- deflate stream with each call. inflateBackEnd() is then called to free
- the allocated state.
+ deflate stream with each call. inflateBackEnd() is then called to free the
+ allocated state.
A raw deflate stream is one with no zlib or gzip header or trailer.
This routine would normally be used in a utility that reads zip or gzip
files and writes out uncompressed files. The utility would decode the
- header and process the trailer on its own, hence this routine expects
- only the raw deflate stream to decompress. This is different from the
- normal behavior of inflate(), which expects either a zlib or gzip header and
+ header and process the trailer on its own, hence this routine expects only
+ the raw deflate stream to decompress. This is different from the normal
+ behavior of inflate(), which expects either a zlib or gzip header and
trailer around the deflate stream.
inflateBack() uses two subroutines supplied by the caller that are then
@@ -927,7 +1075,7 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
must also be initialized, and then if strm->avail_in is not zero, input will
- initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
The in_desc and out_desc parameters of inflateBack() is passed as the
first parameter of in() and out() respectively when they are called. These
@@ -937,15 +1085,15 @@ ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
On return, inflateBack() will set strm->next_in and strm->avail_in to
pass back any unused input that was provided by the last in() call. The
return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
- if in() or out() returned an error, Z_DATA_ERROR if there was a format
- error in the deflate stream (in which case strm->msg is set to indicate the
- nature of the error), or Z_STREAM_ERROR if the stream was not properly
- initialized. In the case of Z_BUF_ERROR, an input or output error can be
- distinguished using strm->next_in which will be Z_NULL only if in() returned
- an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
- out() returning non-zero. (in() will always be called before out(), so
- strm->next_in is assured to be defined if out() returns non-zero.) Note
- that inflateBack() cannot return Z_OK.
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format error
+ in the deflate stream (in which case strm->msg is set to indicate the nature
+ of the error), or Z_STREAM_ERROR if the stream was not properly initialized.
+ In the case of Z_BUF_ERROR, an input or output error can be distinguished
+ using strm->next_in which will be Z_NULL only if in() returned an error. If
+ strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning
+ non-zero. (in() will always be called before out(), so strm->next_in is
+ assured to be defined if out() returns non-zero.) Note that inflateBack()
+ cannot return Z_OK.
*/
ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
@@ -997,27 +1145,27 @@ ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
27-31: 0 (reserved)
*/
+#ifndef Z_SOLO
/* utility functions */
/*
- The following utility functions are implemented on top of the
- basic stream-oriented functions. To simplify the interface, some
- default options are assumed (compression level and memory usage,
- standard memory allocation functions). The source code of these
- utility functions can easily be modified if you need special options.
+ The following utility functions are implemented on top of the basic
+ stream-oriented functions. To simplify the interface, some default options
+ are assumed (compression level and memory usage, standard memory allocation
+ functions). The source code of these utility functions can be modified if
+ you need special options.
*/
ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen));
/*
Compresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be at least the value returned
- by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
compressed buffer.
- This function can be used to compress a whole file at once if the
- input file is mmap'ed.
+
compress returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_BUF_ERROR if there was not enough room in the output
buffer.
@@ -1027,11 +1175,11 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen,
int level));
/*
- Compresses the source buffer into the destination buffer. The level
+ Compresses the source buffer into the destination buffer. The level
parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
+ length of the source buffer. Upon entry, destLen is the total size of the
destination buffer, which must be at least the value returned by
- compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
compressed buffer.
compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
@@ -1042,159 +1190,255 @@ ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
/*
compressBound() returns an upper bound on the compressed size after
- compress() or compress2() on sourceLen bytes. It would be used before
- a compress() or compress2() call to allocate the destination buffer.
+ compress() or compress2() on sourceLen bytes. It would be used before a
+ compress() or compress2() call to allocate the destination buffer.
*/
ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
const Bytef *source, uLong sourceLen));
/*
Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit, destLen
+ is the actual size of the uncompressed buffer.
uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
+ the case where there is not enough room, uncompress() will fill the output
+ buffer with the uncompressed data up to that point.
*/
+ /* gzip file access functions */
-typedef voidp gzFile;
+/*
+ This library supports reading and writing files in gzip (.gz) format with
+ an interface similar to that of stdio, using the functions that start with
+ "gz". The gzip format is different from the zlib format. gzip is a gzip
+ wrapper, documented in RFC 1952, wrapped around a deflate stream.
+*/
+
+typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
/*
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb") but can also include a compression level
- ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
- Huffman only compression as in "wb1h", or 'R' for run-length encoding
- as in "wb1R". (See the description of deflateInit2 for more information
- about the strategy parameter.)
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+
+ Opens a gzip (.gz) file for reading or writing. The mode parameter is as
+ in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
+ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
+ compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
+ for fixed code compression as in "wb9F". (See the description of
+ deflateInit2 for more information about the strategy parameter.) 'T' will
+ request transparent writing or appending with no compression and not using
+ the gzip format.
+
+ "a" can be used instead of "w" to request that the gzip stream that will
+ be written be appended to the file. "+" will result in an error, since
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
+
+ These functions, as well as gzip, will read and decode a sequence of gzip
+ streams in a file. The append function of gzopen() can be used to create
+ such a file. (Also see gzflush() for another way to do this.) When
+ appending, gzopen does not test whether the file begins with a gzip stream,
+ nor does it look for the end of the gzip streams to begin appending. gzopen
+ will simply append a gzip stream to the existing file.
gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
+ case gzread will directly read from the file without decompression. When
+ reading, this will be detected automatically by looking for the magic two-
+ byte gzip header.
+
+ gzopen returns NULL if the file could not be opened, if there was
+ insufficient memory to allocate the gzFile state, or if an invalid mode was
+ specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
+ errno can be checked to determine if the reason gzopen failed was that the
+ file could not be opened.
+*/
- gzopen returns NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR). */
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen associates a gzFile with the file descriptor fd. File descriptors
+ are obtained from calls like open, dup, creat, pipe or fileno (if the file
+ has been previously opened with fopen). The mode parameter is as in gzopen.
+
+ The next call of gzclose on the returned gzFile will also close the file
+ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
+ fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
+ mode);. The duplicated descriptor should be saved to avoid a leak, since
+ gzdopen does not close fd if it fails. If you are using fileno() to get the
+ file descriptor from a FILE *, then you will have to use dup() to avoid
+ double-close()ing the file descriptor. Both gzclose() and fclose() will
+ close the associated file descriptor, so they need to have different file
+ descriptors.
+
+ gzdopen returns NULL if there was insufficient memory to allocate the
+ gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
+ provided, or '+' was provided), or if fd is -1. The file descriptor is not
+ used until the next gz* read, write, seek, or close operation, so gzdopen
+ will not detect if fd is invalid (unless fd is -1).
+*/
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
/*
- gzdopen() associates a gzFile with the file descriptor fd. File
- descriptors are obtained from calls like open, dup, creat, pipe or
- fileno (in the file has been previously opened with fopen).
- The mode parameter is as in gzopen.
- The next call of gzclose on the returned gzFile will also close the
- file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
- descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
- gzdopen returns NULL if there was insufficient memory to allocate
- the (de)compression state.
+ Set the internal buffer size used by this library's functions. The
+ default buffer size is 8192 bytes. This function must be called after
+ gzopen() or gzdopen(), and before any other calls that read or write the
+ file. The buffer memory allocation is always deferred to the first read or
+ write. Two buffers are allocated, either both of the specified size when
+ writing, or one of the specified size and the other twice that size when
+ reading. A larger buffer size of, for example, 64K or 128K bytes will
+ noticeably increase the speed of decompression (reading).
+
+ The new buffer size also affects the maximum length for gzprintf().
+
+ gzbuffer() returns 0 on success, or -1 on failure, such as being called
+ too late.
*/
ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
/*
- Dynamically update the compression level or strategy. See the description
+ Dynamically update the compression level or strategy. See the description
of deflateInit2 for the meaning of these parameters.
+
gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
opened for writing.
*/
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
/*
- Reads the given number of uncompressed bytes from the compressed file.
- If the input file was not in gzip format, gzread copies the given number
- of bytes into the buffer.
- gzread returns the number of uncompressed bytes actually read (0 for
- end of file, -1 for error). */
+ Reads the given number of uncompressed bytes from the compressed file. If
+ the input file is not in gzip format, gzread copies the given number of
+ bytes into the buffer directly from the file.
+
+ After reaching the end of a gzip stream in the input, gzread will continue
+ to read, looking for another gzip stream. Any number of gzip streams may be
+ concatenated in the input file, and will all be decompressed by gzread().
+ If something other than a gzip stream is encountered after a gzip stream,
+ that remaining trailing garbage is ignored (and no error is returned).
+
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
+
+ gzread returns the number of uncompressed bytes actually read, less than
+ len for end of file, or -1 for error.
+*/
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
- voidpc buf, unsigned len));
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
/*
Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of uncompressed bytes actually written
- (0 in case of error).
+ gzwrite returns the number of uncompressed bytes written or 0 in case of
+ error.
*/
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
/*
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error). The number of
- uncompressed bytes written is limited to 4095. The caller should assure that
- this limit is not exceeded. If it is exceeded, then gzprintf() will return
- return an error (0) with nothing written. In this case, there may also be a
- buffer overflow with unpredictable consequences, which is possible only if
- zlib was compiled with the insecure functions sprintf() or vsprintf()
- because the secure snprintf() or vsnprintf() functions were not available.
+ Converts, formats, and writes the arguments to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written, or 0 in case of error. The number of
+ uncompressed bytes written is limited to 8191, or one less than the buffer
+ size given to gzbuffer(). The caller should assure that this limit is not
+ exceeded. If it is exceeded, then gzprintf() will return an error (0) with
+ nothing written. In this case, there may also be a buffer overflow with
+ unpredictable consequences, which is possible only if zlib was compiled with
+ the insecure functions sprintf() or vsprintf() because the secure snprintf()
+ or vsnprintf() functions were not available. This can be determined using
+ zlibCompileFlags().
*/
ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
/*
- Writes the given null-terminated string to the compressed file, excluding
+ Writes the given null-terminated string to the compressed file, excluding
the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
+
+ gzputs returns the number of characters written, or -1 in case of error.
*/
ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
/*
- Reads bytes from the compressed file until len-1 characters are read, or
- a newline character is read and transferred to buf, or an end-of-file
- condition is encountered. The string is then terminated with a null
- character.
- gzgets returns buf, or Z_NULL in case of error.
+ Reads bytes from the compressed file until len-1 characters are read, or a
+ newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. If any characters are read or if len == 1, the
+ string is terminated with a null character. If no characters are read due
+ to an end-of-file or len < 1, then the buffer is left untouched.
+
+ gzgets returns buf which is a null-terminated string, or it returns NULL
+ for end-of-file or in case of error. If there was an error, the contents at
+ buf are indeterminate.
*/
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
/*
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
+ Writes c, converted to an unsigned char, into the compressed file. gzputc
+ returns the value that was written, or -1 in case of error.
*/
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
/*
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
+ Reads one byte from the compressed file. gzgetc returns this byte or -1
+ in case of end of file or error. This is implemented as a macro for speed.
+ As such, it does not do all of the checking the other functions do. I.e.
+ it does not check to see if file is NULL, nor whether the structure file
+ points to has been clobbered or not.
*/
-ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
/*
- Push one character back onto the stream to be read again later.
- Only one character of push-back is allowed. gzungetc() returns the
- character pushed, or -1 on failure. gzungetc() will fail if a
- character has been pushed but not read yet, or if c is -1. The pushed
- character will be discarded if the stream is repositioned with gzseek()
- or gzrewind().
+ Push one character back onto the stream to be read as the first character
+ on the next read. At least one character of push-back is allowed.
+ gzungetc() returns the character pushed, or -1 on failure. gzungetc() will
+ fail if c is -1, and may fail if a character has been pushed but not read
+ yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
+ output buffer size of pushed characters is allowed. (See gzbuffer above.)
+ The pushed character will be discarded if the stream is repositioned with
+ gzseek() or gzrewind().
*/
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
/*
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function. The return value is the zlib
- error number (see function gzerror below). gzflush returns Z_OK if
- the flush parameter is Z_FINISH and all output could be flushed.
- gzflush should be called only when strictly necessary because it can
- degrade compression.
+ Flushes all pending output into the compressed file. The parameter flush
+ is as in the deflate() function. The return value is the zlib error number
+ (see function gzerror below). gzflush is only permitted when writing.
+
+ If the flush parameter is Z_FINISH, the remaining data is written and the
+ gzip stream is completed in the output. If gzwrite() is called again, a new
+ gzip stream will be started in the output. gzread() is able to read such
+ concatented gzip streams.
+
+ gzflush should be called only when strictly necessary because it will
+ degrade compression if called too often.
*/
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
/*
- Sets the starting position for the next gzread or gzwrite on the
- given compressed file. The offset represents a number of bytes in the
- uncompressed data stream. The whence parameter is defined as in lseek(2);
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+
+ Sets the starting position for the next gzread or gzwrite on the given
+ compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
the value SEEK_END is not supported.
+
If the file is opened for reading, this function is emulated but can be
- extremely slow. If the file is opened for writing, only forward seeks are
+ extremely slow. If the file is opened for writing, only forward seeks are
supported; gzseek then compresses a sequence of zeroes up to the new
starting position.
- gzseek returns the resulting offset location as measured in bytes from
+ gzseek returns the resulting offset location as measured in bytes from
the beginning of the uncompressed stream, or -1 in case of error, in
particular if the file is opened for writing and the new starting position
would be before the current position.
@@ -1204,68 +1448,134 @@ ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
/*
Rewinds the given file. This function is supported only for reading.
- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
*/
+/*
ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+
+ Returns the starting position for the next gzread or gzwrite on the given
+ compressed file. This position represents a number of bytes in the
+ uncompressed data stream, and is zero when starting, even if appending or
+ reading a gzip stream from the middle of a file using gzdopen().
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
/*
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+ Returns the current offset in the file being read or written. This offset
+ includes the count of bytes that precede the gzip stream, for example when
+ appending or when using gzdopen() for reading. When reading, the offset
+ does not include as yet unused buffered input. This information can be used
+ for a progress indicator. On error, gzoffset() returns -1.
*/
ZEXTERN int ZEXPORT gzeof OF((gzFile file));
/*
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
+ Returns true (1) if the end-of-file indicator has been set while reading,
+ false (0) otherwise. Note that the end-of-file indicator is set only if the
+ read tried to go past the end of the input, but came up short. Therefore,
+ just like feof(), gzeof() may return false even if there is no more data to
+ read, in the event that the last read request was for the exact number of
+ bytes remaining in the input file. This will happen if the input file size
+ is an exact multiple of the buffer size.
+
+ If gzeof() returns true, then the read functions will return no more data,
+ unless the end-of-file indicator is reset by gzclearerr() and the input file
+ has grown since the previous end of file was detected.
*/
ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
/*
- Returns 1 if file is being read directly without decompression, otherwise
- zero.
+ Returns true (1) if file is being copied directly while reading, or false
+ (0) if file is a gzip stream being decompressed.
+
+ If the input file is empty, gzdirect() will return true, since the input
+ does not contain a gzip stream.
+
+ If gzdirect() is used immediately after gzopen() or gzdopen() it will
+ cause buffers to be allocated to allow reading the file to determine if it
+ is a gzip file. Therefore if gzbuffer() is used, it should be called before
+ gzdirect().
+
+ When writing, gzdirect() returns true (1) if transparent writing was
+ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
+ gzdirect() is not needed when writing. Transparent writing must be
+ explicitly requested, so the application already knows the answer. When
+ linking statically, using gzdirect() will include all of the zlib code for
+ gzip file reading and decompression, which may not be desired.)
*/
ZEXTERN int ZEXPORT gzclose OF((gzFile file));
/*
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state. The return value is the zlib
- error number (see function gzerror below).
+ Flushes all pending output if necessary, closes the compressed file and
+ deallocates the (de)compression state. Note that once file is closed, you
+ cannot call gzerror with file, since its structures have been deallocated.
+ gzclose must not be called more than once on the same file, just as free
+ must not be called more than once on the same allocation.
+
+ gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
+*/
+
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+/*
+ Same as gzclose(), but gzclose_r() is only for use when reading, and
+ gzclose_w() is only for use when writing or appending. The advantage to
+ using these instead of gzclose() is that they avoid linking in zlib
+ compression or decompression code that is not used when only reading or only
+ writing respectively. If gzclose() is used, then both compression and
+ decompression code will be included the application when linking to a static
+ zlib library.
*/
ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
/*
- Returns the error message for the last error which occurred on the
- given compressed file. errnum is set to zlib error number. If an
- error occurred in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
+ Returns the error message for the last error which occurred on the given
+ compressed file. errnum is set to zlib error number. If an error occurred
+ in the file system and not in the compression library, errnum is set to
+ Z_ERRNO and the application may consult errno to get the exact error code.
+
+ The application must not modify the returned string. Future calls to
+ this function may invalidate the previously returned string. If file is
+ closed, then the string previously returned by gzerror will no longer be
+ available.
+
+ gzerror() should be used to distinguish errors from end-of-file for those
+ functions above that do not distinguish those cases in their return values.
*/
ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
/*
- Clears the error and end-of-file flags for file. This is analogous to the
- clearerr() function in stdio. This is useful for continuing to read a gzip
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
file that is being written concurrently.
*/
+#endif /* !Z_SOLO */
+
/* checksum functions */
/*
These functions are not related to compression but are exported
- anyway because they might be useful in applications using the
- compression library.
+ anyway because they might be useful in applications using the compression
+ library.
*/
ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
/*
Update a running Adler-32 checksum with the bytes buf[0..len-1] and
- return the updated checksum. If buf is NULL, this function returns
- the required initial value for the checksum.
- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
- much faster. Usage example:
+ return the updated checksum. If buf is Z_NULL, this function returns the
+ required initial value for the checksum.
+
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster.
+
+ Usage example:
uLong adler = adler32(0L, Z_NULL, 0);
@@ -1275,21 +1585,25 @@ ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
if (adler != original_adler) error();
*/
+/*
ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
z_off_t len2));
-/*
+
Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
- seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
+ negative, the result has no meaning or utility.
*/
ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
/*
Update a running CRC-32 with the bytes buf[0..len-1] and return the
- updated CRC-32. If buf is NULL, this function returns the required initial
- value for the for the crc. Pre- and post-conditioning (one's complement) is
+ updated CRC-32. If buf is Z_NULL, this function returns the required
+ initial value for the crc. Pre- and post-conditioning (one's complement) is
performed within this function so it shouldn't be done by the application.
+
Usage example:
uLong crc = crc32(0L, Z_NULL, 0);
@@ -1300,9 +1614,9 @@ ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
if (crc != original_crc) error();
*/
+/*
ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
-/*
Combine two CRC-32 check values into one. For two sequences of bytes,
seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
@@ -1331,26 +1645,121 @@ ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
const char *version,
int stream_size));
#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
#define inflateBackInit(strm, windowBits, window) \
inflateBackInit_((strm), (windowBits), (window), \
- ZLIB_VERSION, sizeof(z_stream))
+ ZLIB_VERSION, (int)sizeof(z_stream))
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure. Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro. The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously. They can
+ * only be used by the gzgetc() macro. You have been warned.
+ */
+struct gzFile_s {
+ unsigned have;
+ unsigned char *next;
+ z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+# define z_gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#else
+# define gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))
+#endif
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
+ * both are true, the application gets the *64 functions, and the regular
+ * functions are changed to 64 bits) -- in case these are set on systems
+ * without large file support, _LFS64_LARGEFILE must also be true
+ */
+#ifdef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+#endif
+
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+# ifdef Z_PREFIX_SET
+# define z_gzopen z_gzopen64
+# define z_gzseek z_gzseek64
+# define z_gztell z_gztell64
+# define z_gzoffset z_gzoffset64
+# define z_adler32_combine z_adler32_combine64
+# define z_crc32_combine z_crc32_combine64
+# else
+# define gzopen gzopen64
+# define gzseek gzseek64
+# define gztell gztell64
+# define gzoffset gzoffset64
+# define adler32_combine adler32_combine64
+# define crc32_combine crc32_combine64
+# endif
+# ifndef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+# endif
+#else
+ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+#endif
+
+#else /* Z_SOLO */
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
+/* hack for buggy compilers */
#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;}; /* hack for buggy compilers */
+ struct internal_state {int dummy;};
#endif
+/* undocumented functions */
ZEXTERN const char * ZEXPORT zError OF((int));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
+ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+#if defined(_WIN32) && !defined(Z_SOLO)
+ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
+ const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+ const char *format,
+ va_list va));
+# endif
+#endif
#ifdef __cplusplus
}
diff --git a/erts/emulator/zlib/zutil.c b/erts/emulator/zlib/zutil.c
index fa5b43126a..27a8af4a2b 100644
--- a/erts/emulator/zlib/zutil.c
+++ b/erts/emulator/zlib/zutil.c
@@ -1,22 +1,23 @@
/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* @(#) $Id$ */
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include "zutil.h"
+#ifndef Z_SOLO
+# include "gzguts.h"
+#endif
#ifndef NO_DUMMY_DECL
struct internal_state {int dummy;}; /* for buggy compilers */
#endif
-const char * const z_errmsg[10] = {
+z_const char * const z_errmsg[10] = {
"need dictionary", /* Z_NEED_DICT 2 */
"stream end", /* Z_STREAM_END 1 */
"", /* Z_OK 0 */
@@ -39,25 +40,25 @@ uLong ZEXPORT zlibCompileFlags()
uLong flags;
flags = 0;
- switch (sizeof(uInt)) {
+ switch ((int)(sizeof(uInt))) {
case 2: break;
case 4: flags += 1; break;
case 8: flags += 2; break;
default: flags += 3;
}
- switch (sizeof(uLong)) {
+ switch ((int)(sizeof(uLong))) {
case 2: break;
case 4: flags += 1 << 2; break;
case 8: flags += 2 << 2; break;
default: flags += 3 << 2;
}
- switch (sizeof(voidpf)) {
+ switch ((int)(sizeof(voidpf))) {
case 2: break;
case 4: flags += 1 << 4; break;
case 8: flags += 2 << 4; break;
default: flags += 3 << 4;
}
- switch (sizeof(z_off_t)) {
+ switch ((int)(sizeof(z_off_t))) {
case 2: break;
case 4: flags += 1 << 6; break;
case 8: flags += 2 << 6; break;
@@ -90,27 +91,27 @@ uLong ZEXPORT zlibCompileFlags()
#ifdef FASTEST
flags += 1L << 21;
#endif
-#ifdef STDC
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
# ifdef NO_vsnprintf
- flags += 1L << 25;
+ flags += 1L << 25;
# ifdef HAS_vsprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# else
# ifdef HAS_vsnprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# endif
#else
- flags += 1L << 24;
+ flags += 1L << 24;
# ifdef NO_snprintf
- flags += 1L << 25;
+ flags += 1L << 25;
# ifdef HAS_sprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# else
# ifdef HAS_snprintf_void
- flags += 1L << 26;
+ flags += 1L << 26;
# endif
# endif
#endif
@@ -122,9 +123,9 @@ uLong ZEXPORT zlibCompileFlags()
# ifndef verbose
# define verbose 0
# endif
-int z_verbose = verbose;
+int ZLIB_INTERNAL z_verbose = verbose;
-void z_error (m)
+void ZLIB_INTERNAL z_error (m)
char *m;
{
fprintf(stderr, "%s\n", m);
@@ -151,7 +152,7 @@ const char * ZEXPORT zError(err)
#ifndef HAVE_MEMCPY
-void zmemcpy(dest, source, len)
+void ZLIB_INTERNAL zmemcpy(dest, source, len)
Bytef* dest;
const Bytef* source;
uInt len;
@@ -162,7 +163,7 @@ void zmemcpy(dest, source, len)
} while (--len != 0);
}
-int zmemcmp(s1, s2, len)
+int ZLIB_INTERNAL zmemcmp(s1, s2, len)
const Bytef* s1;
const Bytef* s2;
uInt len;
@@ -175,7 +176,7 @@ int zmemcmp(s1, s2, len)
return 0;
}
-void zmemzero(dest, len)
+void ZLIB_INTERNAL zmemzero(dest, len)
Bytef* dest;
uInt len;
{
@@ -186,6 +187,7 @@ void zmemzero(dest, len)
}
#endif
+#ifndef Z_SOLO
#ifdef SYS16BIT
@@ -218,7 +220,7 @@ local ptr_table table[MAX_PTR];
* a protected system like OS/2. Use Microsoft C instead.
*/
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
{
voidpf buf = opaque; /* just to make some compilers happy */
ulg bsize = (ulg)items*size;
@@ -242,7 +244,7 @@ voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
return buf;
}
-void zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
{
int n;
if (*(ush*)&ptr != 0) { /* object < 64K */
@@ -277,13 +279,13 @@ void zcfree (voidpf opaque, voidpf ptr)
# define _hfree hfree
#endif
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
{
if (opaque) opaque = 0; /* to make compiler happy */
return _halloc((long)items, size);
}
-void zcfree (voidpf opaque, voidpf ptr)
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
{
if (opaque) opaque = 0; /* to make compiler happy */
_hfree(ptr);
@@ -302,26 +304,24 @@ extern voidp calloc OF((uInt items, uInt size));
extern void free OF((voidpf ptr));
#endif
-extern void* sys_alloc(unsigned);
-extern void* sys_free(void *);
-
-voidpf zcalloc (opaque, items, size)
+voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
voidpf opaque;
unsigned items;
unsigned size;
{
- unsigned sz = items * size;
- voidpf* ptr = (voidpf) sys_alloc(sz);
if (opaque) items += size - size; /* make compiler happy */
- return ptr;
+ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
+ (voidpf)calloc(items, size);
}
-void zcfree (opaque, ptr)
+void ZLIB_INTERNAL zcfree (opaque, ptr)
voidpf opaque;
voidpf ptr;
{
- sys_free(ptr);
+ free(ptr);
if (opaque) return; /* make compiler happy */
}
#endif /* MY_ZCALLOC */
+
+#endif /* !Z_SOLO */
diff --git a/erts/emulator/zlib/zutil.h b/erts/emulator/zlib/zutil.h
index a8872e1c88..24ab06b1cf 100644
--- a/erts/emulator/zlib/zutil.h
+++ b/erts/emulator/zlib/zutil.h
@@ -1,10 +1,8 @@
/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * Copyright (C) 1995-2013 Jean-loup Gailly.
* For conditions of distribution and use, see copyright notice in zlib.h
*/
-/* %ExternalCopyright% */
-
/* WARNING: this file should *not* be used by applications. It is
part of the implementation of the compression library and is
subject to change. Applications should only use zlib.h.
@@ -15,30 +13,24 @@
#ifndef ZUTIL_H
#define ZUTIL_H
-#define ZLIB_INTERNAL
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
#include "zlib.h"
-#ifdef STDC
-# ifndef _WIN32_WCE
+#if defined(STDC) && !defined(Z_SOLO)
+# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
# include <stddef.h>
# endif
# include <string.h>
# include <stdlib.h>
#endif
-#ifdef NO_ERRNO_H
-# ifdef _WIN32_WCE
- /* The Microsoft C Run-Time Library for Windows CE doesn't have
- * errno. We define it as a global variable to simplify porting.
- * Its value is always 0 and should not be used. We rename it to
- * avoid conflict with other libraries that use the same workaround.
- */
-# define errno z_errno
-# endif
- extern int errno;
-#else
-# ifndef _WIN32_WCE
-# include <errno.h>
-# endif
+
+#ifdef Z_SOLO
+ typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
#endif
#ifndef local
@@ -52,13 +44,13 @@ typedef unsigned short ush;
typedef ush FAR ushf;
typedef unsigned long ulg;
-extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* (size given to avoid silly warnings with Visual C++) */
#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
#define ERR_RETURN(strm,err) \
- return (strm->msg = (char*)ERR_MSG(err), (err))
+ return (strm->msg = ERR_MSG(err), (err))
/* To be used only when the state is known to be valid */
/* common constants */
@@ -90,16 +82,18 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
# define OS_CODE 0x00
-# if defined(__TURBOC__) || defined(__BORLANDC__)
-# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
- /* Allow compilation with ANSI keywords only enabled */
- void _Cdecl farfree( void *block );
- void *_Cdecl farmalloc( unsigned long nbytes );
-# else
-# include <alloc.h>
+# ifndef Z_SOLO
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
# endif
-# else /* MSC or DJGPP */
-# include <malloc.h>
# endif
#endif
@@ -119,18 +113,20 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#ifdef OS2
# define OS_CODE 0x06
-# ifdef M_I86
- #include <malloc.h>
+# if defined(M_I86) && !defined(Z_SOLO)
+# include <malloc.h>
# endif
#endif
#if defined(MACOS) || defined(TARGET_OS_MAC)
# define OS_CODE 0x07
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include <unix.h> /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
+# ifndef Z_SOLO
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
# endif
# endif
#endif
@@ -142,7 +138,6 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
#ifdef WIN32
# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
# define OS_CODE 0x0b
-# define F_OPEN(name, mode) _wfopen((WCHAR *)(name), (WCHAR *)(mode)) /* Unicode */
# endif
#endif
@@ -154,7 +149,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define fdopen(fd,mode) NULL /* No fdopen() */
#endif
-#if (defined(_MSC_VER) && (_MSC_VER > 600))
+#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
# if defined(_WIN32_WCE)
# define fdopen(fd,mode) NULL /* No fdopen() */
# ifndef _PTRDIFF_T_DEFINED
@@ -166,6 +161,19 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# endif
#endif
+#if defined(__BORLANDC__) && !defined(MSDOS)
+ #pragma warn -8004
+ #pragma warn -8008
+ #pragma warn -8066
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_WIN32) && \
+ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+#endif
+
/* common defaults */
#ifndef OS_CODE
@@ -178,40 +186,7 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
/* functions */
-#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#if defined(__CYGWIN__)
-# ifndef HAVE_VSNPRINTF
-# define HAVE_VSNPRINTF
-# endif
-#endif
-#ifndef HAVE_VSNPRINTF
-# ifdef MSDOS
- /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
- but for now we just assume it doesn't. */
-# define NO_vsnprintf
-# endif
-# ifdef __TURBOC__
-# define NO_vsnprintf
-# endif
-# ifdef WIN32
- /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
-# if !defined(vsnprintf) && !defined(NO_vsnprintf)
-# define vsnprintf _vsnprintf
-# endif
-# endif
-# ifdef __SASC
-# define NO_vsnprintf
-# endif
-#endif
-#ifdef VMS
-# define NO_vsnprintf
-#endif
-
-#if defined(pyr)
+#if defined(pyr) || defined(Z_SOLO)
# define NO_MEMCPY
#endif
#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
@@ -235,16 +210,16 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define zmemzero(dest, len) memset(dest, 0, len)
# endif
#else
- extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
- extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
- extern void zmemzero OF((Bytef* dest, uInt len));
+ void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
+ int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
+ void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
#endif
/* Diagnostic functions */
#ifdef DEBUG
# include <stdio.h>
- extern int z_verbose;
- extern void z_error OF((char *m));
+ extern int ZLIB_INTERNAL z_verbose;
+ extern void ZLIB_INTERNAL z_error OF((char *m));
# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
# define Trace(x) {if (z_verbose>=0) fprintf x ;}
# define Tracev(x) {if (z_verbose>0) fprintf x ;}
@@ -260,13 +235,19 @@ extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
# define Tracecv(c,x)
#endif
-
-voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
-void zcfree OF((voidpf opaque, voidpf ptr));
+#ifndef Z_SOLO
+ voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
+ unsigned size));
+ void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+#endif
#define ZALLOC(strm, items, size) \
(*((strm)->zalloc))((strm)->opaque, (items), (size))
#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+/* Reverse the bytes in a 32-bit value */
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
#endif /* ZUTIL_H */
diff --git a/erts/epmd/src/epmd_cli.c b/erts/epmd/src/epmd_cli.c
index 8817bde8d7..bd30bc35d9 100644
--- a/erts/epmd/src/epmd_cli.c
+++ b/erts/epmd/src/epmd_cli.c
@@ -118,7 +118,7 @@ void epmd_call(EpmdVars *g,int what)
if (!g->silent) {
rval = erts_snprintf(buf, OUTBUF_SIZE,
"epmd: up and running on port %d with data:\n", j);
- write(1, buf, rval);
+ fwrite(buf, 1, rval, stdout);
}
while(1) {
if ((rval = read(fd,buf,OUTBUF_SIZE)) <= 0) {
@@ -126,7 +126,7 @@ void epmd_call(EpmdVars *g,int what)
epmd_cleanup_exit(g,0);
}
if (!g->silent)
- write(1, buf, rval); /* Potentially UTF-8 encoded */
+ fwrite(buf, 1, rval, stdout); /* Potentially UTF-8 encoded */
}
}
diff --git a/erts/epmd/test/epmd_SUITE.erl b/erts/epmd/test/epmd_SUITE.erl
index cc24a556a3..a752abf33b 100644
--- a/erts/epmd/test/epmd_SUITE.erl
+++ b/erts/epmd/test/epmd_SUITE.erl
@@ -69,6 +69,8 @@
returns_valid_empty_extra/1,
returns_valid_populated_extra_with_nulls/1,
+ names_stdout/1,
+
buffer_overrun_1/1,
buffer_overrun_2/1,
no_nonlocal_register/1,
@@ -118,6 +120,7 @@ all() ->
too_large, alive_req_too_small_1, alive_req_too_small_2,
alive_req_too_large, returns_valid_empty_extra,
returns_valid_populated_extra_with_nulls,
+ names_stdout,
{group, buffer_overrun}, no_nonlocal_register,
no_nonlocal_kill, no_live_killing].
@@ -759,6 +762,24 @@ returns_valid_populated_extra_with_nulls(Config) when is_list(Config) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+names_stdout(doc) ->
+ ["Test that epmd -names prints registered nodes to stdout"];
+names_stdout(suite) ->
+ [];
+names_stdout(Config) when is_list(Config) ->
+ ?line ok = epmdrun(),
+ ?line {ok,Sock} = register_node("foobar"),
+ ?line ok = epmdrun("-names"),
+ ?line {ok, Data} = receive {_Port, {data, D}} -> {ok, D}
+ after 10000 -> {error, timeout}
+ end,
+ ?line {match,_} = re:run(Data, "^epmd: up and running", [multiline]),
+ ?line {match,_} = re:run(Data, "^name foobar at port", [multiline]),
+ ?line ok = close(Sock),
+ ok.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
buffer_overrun_1(suite) ->
[];
buffer_overrun_1(doc) ->
@@ -968,7 +989,7 @@ epmdrun(Epmd,Args0) ->
O ->
" "++O
end,
- osrun("\"" ++ Epmd ++ "\"" ++ Args ++ " " ?EPMDARGS " -port " ++ integer_to_list(?PORT)).
+ osrun("\"" ++ Epmd ++ "\"" ++ " " ?EPMDARGS " -port " ++ integer_to_list(?PORT) ++ Args).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/erts/etc/common/erlexec.c b/erts/etc/common/erlexec.c
index 1d7811d570..78a50744ef 100644
--- a/erts/etc/common/erlexec.c
+++ b/erts/etc/common/erlexec.c
@@ -135,6 +135,7 @@ static char *pluss_val_switches[] = {
"ws",
"ss",
"pp",
+ "ub",
NULL
};
/* +h arguments with values */
@@ -1972,35 +1973,8 @@ get_file_args(char *filename, argv_buf *abp, argv_buf *xabp)
}
static void
-write_erl_otp_flags(char *bufp)
-{
- /* ERL_OTP<MAJOR-VSN>_FLAGS */
- int ix = 0;
- char *otp_p;
- char otp[] = OTP_SYSTEM_VERSION;
-
- bufp[ix++] = 'E';
- bufp[ix++] = 'R';
- bufp[ix++] = 'L';
- bufp[ix++] = '_';
- bufp[ix++] = 'O';
- bufp[ix++] = 'T';
- bufp[ix++] = 'P';
- for (otp_p = &otp[0]; '0' <= *otp_p && *otp_p <= '9'; otp_p++)
- bufp[ix++] = *otp_p;
- bufp[ix++] = '_';
- bufp[ix++] = 'F';
- bufp[ix++] = 'L';
- bufp[ix++] = 'A';
- bufp[ix++] = 'G';
- bufp[ix++] = 'S';
- bufp[ix] = '\0';
-}
-
-static void
initial_argv_massage(int *argc, char ***argv)
{
- char erl_otp_flags_buf[] = "ERL_OTP" OTP_SYSTEM_VERSION "_FLAGS";
argv_buf ab = {0}, xab = {0};
int ix, vix, ac;
char **av;
@@ -2016,8 +1990,7 @@ initial_argv_massage(int *argc, char ***argv)
vix = 0;
- write_erl_otp_flags(erl_otp_flags_buf);
- av = build_args_from_env(erl_otp_flags_buf);
+ av = build_args_from_env("ERL_OTP" OTP_SYSTEM_VERSION "_FLAGS");
if (av)
avv[vix++].argv = av;
diff --git a/erts/etc/unix/cerl.src b/erts/etc/unix/cerl.src
index be8343e87e..78fefbea55 100644
--- a/erts/etc/unix/cerl.src
+++ b/erts/etc/unix/cerl.src
@@ -86,6 +86,7 @@ run_valgrind=no
# Default rootdir
ROOTDIR=%SRC_ROOTDIR%
BINDIR="$ROOTDIR/bin/`$ROOTDIR/erts/autoconf/config.guess`"
+TARGET=%TARGET%
#BINDIR="$ROOTDIR/bin/%TARGET%"
PROGNAME=$ROOTDIR/bin/cerl
EMU=beam
@@ -248,6 +249,12 @@ while [ $# -gt 0 ]; do
done
+if [ ! -f $BINDIR/erlexec -a -f $ROOTDIR/bin/$TARGET/erlexec ]; then
+ # We are in a strange target (I'm looking at you openbsd) where
+ # TARGET != config.guess
+ BINDIR=$ROOTDIR/bin/$TARGET
+fi
+
PATH=$BINDIR:$ROOTDIR/bin:$PATH
EXEC=$BINDIR/erlexec
diff --git a/erts/etc/unix/etp-commands.in b/erts/etc/unix/etp-commands.in
index 73887931cc..8520d58f47 100644
--- a/erts/etc/unix/etp-commands.in
+++ b/erts/etc/unix/etp-commands.in
@@ -652,7 +652,7 @@ end
define etp-ct-atom-1
# Args: int
#
-# Determines if integer is a atom first character
+# Determines if integer is an atom first character
#
# Non-reentrant
# Returns: $etp_ct_atom
@@ -1278,6 +1278,250 @@ document etpf-stackdump
%---------------------------------------------------------------------------
end
+define etp-heapdump
+# Args: Process*
+#
+# Non-reentrant
+ etp-heapdump-1 ($arg0)->heap ($arg0)->htop
+end
+
+document etp-heapdump
+%---------------------------------------------------------------------------
+% etp-heapdump Process*
+%
+% Take an Process* and print a heapdump for the process heap.
+%---------------------------------------------------------------------------
+end
+
+define etp-heapdump-old
+# Args: Process*
+#
+# Non-reentrant
+ etp-heapdump-1 ($arg0)->old_heap ($arg0)->old_htop
+end
+
+document etp-heapdump
+%---------------------------------------------------------------------------
+% etp-heapdump-old Process*
+%
+% Take an Process* and print a heapdump for the process old heap (gen-heap).
+%---------------------------------------------------------------------------
+end
+
+
+define etp-heapdump-1
+# Args: Eterm* heap, Eterm* htop
+#
+# Non-reentrant
+ set $etp_heapdump_heap = (Eterm*)($arg0)
+ set $etp_heapdump_p = (Eterm*)($arg0)
+ set $etp_heapdump_end = (Eterm*)($arg1)
+ set $etp_heapdump_skips = 0
+ printf "%% heapdump (%u):\n", $etp_heapdump_end-$etp_heapdump_p
+ while $etp_heapdump_p < $etp_heapdump_end
+ set $etp_heapdump_ix = 0
+ printf " %p: ", $etp_heapdump_p
+ while $etp_heapdump_p < $etp_heapdump_end && $etp_heapdump_ix < 8
+ if ($etp_heapdump_skips > 0)
+ printf "| 0x%08x ", ($etp_heapdump_p)
+ set $etp_heapdump_skips--
+ else
+ etp-term-dump $etp_heapdump_p[0]
+ end
+ set $etp_heapdump_p++
+ set $etp_heapdump_ix++
+ end
+ printf "\n"
+ end
+end
+
+
+define etp-term-dump
+# Args: Eterm
+ if (($arg0) & 0x3) == 0
+ etp-term-dump-header ($arg0)
+ else
+ if (($arg0) & 0x3) == 1
+ # Cons pointer
+ set $etp_term_dump_cons_p = ((Eterm*)(($arg0) & ~0x3))
+ if $etp_term_dump_cons_p > $etp_heapdump_heap && $etp_term_dump_cons_p < $etp_heapdump_end
+ printf "| C:0x%08x ", $etp_term_dump_cons_p
+ #printf "| C: --> %5d ", $etp_heapdump_p - $etp_term_dump_cons_p - 1
+ else
+ printf "| C:0x%08x ", $etp_term_dump_cons_p
+ end
+ else
+ if (($arg0) & 0x3) == 2
+ # Box pointer
+ printf "| B:0x%08x ", ($arg0)
+ else
+ if (($arg0) & 0x3) == 3
+ # immediate
+ etp-term-dump-immediate ($arg0)
+ else
+ printf "| U:0x%08x ", ($arg0)
+ end
+ end
+ end
+ end
+end
+
+define etp-term-dump-immediate
+# Args: immediate term
+ if (($arg0) & 0xF) == 0xf
+ # Fixnum
+ etp-ct-printable-1 ((long)((Sint)($arg0)>>4))
+ if $etp_ct_printable
+ if $etp_ct_printable < 0
+ printf "| I: %c (%3ld) ", (long)((Sint)($arg0)>>4), (long)((Sint)($arg0)>>4)
+ else
+ printf "| I: \\%c (%3ld) ", (long)((Sint)($arg0)>>4), (long)((Sint)($arg0)>>4)
+ end
+ else
+ printf "| I:%10ld ", (long)((Sint)($arg0)>>4)
+ end
+ else
+ if (($arg0) & 0xF) == 0x3
+ etp-term-dump-pid ($arg0)
+ else
+ if (($arg0) & 0xF) == 0x7
+ printf "| port:0x%05x ", ($arg0)
+ else
+ # Immediate2 - 0xB
+ if (($arg0) & 0x3f) == 0x0b
+ etp-term-dump-atom ($arg0)
+ else
+ if (($arg0) & 0x3f) == 0x1b
+ printf "| #Catch<%06d> ", ($arg0)>>6
+ else
+ if (($arg0) == $etp_nil)
+ printf "| [] (NIL) "
+ else
+ printf "| I:0x%08x ", ($arg0)
+ end
+ end
+ end
+ end
+ end
+ end
+end
+
+define etp-term-dump-atom
+# Args: atom term
+ set $etp_atom_1_ap = (Atom*)erts_atom_table.seg_table[(Eterm)($arg0)>>16][((Eterm)($arg0)>>6)&0x3FF]
+ set $etp_atom_1_i = ($etp_atom_1_ap)->len
+ set $etp_atom_1_p = ($etp_atom_1_ap)->name
+ set $etp_atom_1_quote = 1
+ set $etp_atom_indent = 13
+
+ if ($etp_atom_1_i < 11)
+ if ($etp_atom_1_i > 0)
+ etp-ct-atom-1 (*$etp_atom_1_p)
+ if $etp_ct_atom
+ set $etp_atom_indent = 13
+ else
+ set $etp_atom_indent = 11
+ end
+ end
+ # perform indentation
+ printf "|"
+ while ($etp_atom_1_i < $etp_atom_indent)
+ printf " "
+ set $etp_atom_1_i++
+ end
+ set $etp_atom_1_i = ($etp_atom_1_ap)->len
+ # Check if atom has to be quoted
+ if ($etp_atom_1_i > 0)
+ etp-ct-atom-1 (*$etp_atom_1_p)
+ if $etp_ct_atom
+ # Atom start character
+ set $etp_atom_1_p++
+ set $etp_atom_1_i--
+ set $etp_atom_1_quote = 0
+ else
+ set $etp_atom_1_i = 0
+ end
+ end
+ while $etp_atom_1_i > 0
+ etp-ct-name-1 (*$etp_atom_1_p)
+ if $etp_ct_name
+ # Name character
+ set $etp_atom_1_p++
+ set $etp_atom_1_i--
+ else
+ set $etp_atom_1_quote = 1
+ set $etp_atom_1_i = 0
+ end
+ end
+ # Print the atom
+ if $etp_atom_1_quote
+ printf "'"
+ end
+ set $etp_atom_1_i = ($etp_atom_1_ap)->len
+ set $etp_atom_1_p = ($etp_atom_1_ap)->name
+ while $etp_atom_1_i > 0
+ etp-char-1 (*$etp_atom_1_p) '\''
+ set $etp_atom_1_p++
+ set $etp_atom_1_i--
+ end
+ if $etp_atom_1_quote
+ printf "'"
+ end
+ printf " "
+ else
+ printf "| A:0x%08x ", ($arg0)
+ end
+end
+
+define etp-term-dump-pid
+# Args: Eterm pid
+#
+# Non-reentrant
+#
+ set $etp_pid_1 = (Eterm)($arg0)
+ if ($etp_pid_1 & 0xF) == 0x3
+ if (etp_arch_bits == 64 && etp_halfword == 0)
+ if (etp_big_endian)
+ set $etp_pid_data = (unsigned) ((((Uint64) $etp_pid_1) >> 36) & 0x0fffffff)
+ else
+ set $etp_pid_data = (unsigned) ((((Uint64) $etp_pid_1) >> 4) & 0x0fffffff)
+ end
+ else
+ set $etp_pid_data = (unsigned) (((((Uint32) $etp_pid_1) >> 4) & ~erts_proc.r.o.pix_mask) | ((((Uint32) $etp_pid_1) >> (erts_proc.r.o.pix_cl_shift + 4)) & erts_proc.r.o.pix_cl_mask) | (((((Uint32) $etp_pid_1) >> 4) & erts_proc.r.o.pix_cli_mask) << erts_proc.r.o.pix_cli_shift))
+ end
+ # Internal pid
+ printf "| <0.%04u.%03u> ", $etp_pid_data & 0x7fff, ($etp_pid_data >> 15) & 0x1fff
+ else
+ printf "| #NotPid<%#x> ", ($arg0)
+ end
+end
+
+define etp-term-dump-header
+# Args: Header term
+ if (($arg0) & 0x3f) == 0
+ printf "| H:%4d-tuple ", ($arg0) >> 6
+ else
+ set $etp_heapdump_skips = ($arg0) >> 6
+ if ((($arg0) & 0x3f) == 0x18)
+ printf "| H: float %3d ", ($arg0) >> 6
+ else
+ if ((($arg0) & 0x3f) == 0x28)
+ # sub-binary
+ printf "| H: sub-bin "
+ else
+ if ((($arg0) & 0x3f) == 0x8)
+ # pos-bignum
+ printf "| H:bignum %3u ", ($arg0) >> 6
+ else
+ printf "| header %5d ", ($arg0) >> 6
+ end
+ end
+ end
+ end
+end
+
+
+
define etp-pid2pix-1
# Args: Eterm
#
@@ -1445,7 +1689,7 @@ define etp-process-info
# Args: Process*
#
printf " Pid: "
- etp-1 $arg0->common.id
+ etp-1 ($arg0)->common.id
printf "\n State: "
etp-proc-state $arg0
if $proxy_process != 0
@@ -1523,11 +1767,104 @@ end
document etp-processes
%---------------------------------------------------------------------------
% etp-processes
-%
+%
% Print misc info about all processes
%---------------------------------------------------------------------------
end
+define etp-processes-memory
+ if (!erts_initialized)
+ printf "No processes, since system isn't initialized!\n"
+ else
+ set $proc_ix = 0
+ printf "--- (%ld processes in wheel)\n", erts_proc.r.o.max
+ while $proc_ix < erts_proc.r.o.max
+ set $proc = (Process *) *((UWord *) &erts_proc.r.o.tab[$proc_ix])
+ if ($proc != ((Process *) 0) && $proc != &erts_invalid_process)
+ etp-process-memory-info $proc
+ end
+ set $proc_ix++
+ end
+ printf "---\n",
+ end
+end
+
+document etp-processes-memory
+%---------------------------------------------------------------------------
+% etp-processes-memory
+%
+% Print memory info about all processes
+%---------------------------------------------------------------------------
+end
+
+define etp-process-memory-info
+# Args: Process*
+#
+ if ((*(((Uint32 *) &(((Process *) $arg0)->state)))) & 0x400000)
+ set $proxy_process = 1
+ else
+ set $proxy_process = 0
+ end
+ printf " "
+ etp-1 $arg0->common.id
+ printf ": (Process *) %p ", $arg0
+ if $proxy_process != 0
+ printf "(Process *) %p ", $arg0
+ printf " *** PROXY process struct *** refer to next: \n"
+ etp-pid2proc-1 $arg0->common.id
+ printf " -"
+ etp-process-memory-info $proc
+ else
+ printf " [Heap: %5ld", $arg0->heap_sz
+ if ($arg0->old_heap)
+ printf " | %5ld", $arg0->old_hend - $arg0->old_heap
+ else
+ printf " | none "
+ end
+ printf "] [Mbuf: %5ld", $arg0->mbuf_sz
+ if (etp_smp_compiled)
+ printf " | %3ld (%3ld | %3ld)", ($arg0->msg.len + $arg0->msg_inq.len), $arg0->msg.len, $arg0->msg_inq.len
+ else
+ printf " | %3ld", $arg0->msg.len
+ end
+ printf "] "
+ if ($arg0->i)
+ printf " I: "
+ etp-cp-1 $arg0->i
+ printf " "
+ end
+
+ if ($arg0->current)
+ etp-1 $arg0->current[0]
+ printf ":"
+ etp-1 $arg0->current[1]
+ printf "/%d ", $arg0->current[2]
+ end
+
+ if (*(((Uint32 *) &(((Process *) $arg0)->state))) & 0x4) == 0
+ if ($arg0->common.u.alive.reg)
+ etp-1 $arg0->common.u.alive.reg->name
+ printf " "
+ end
+ end
+
+ if ($arg0->cp)
+ printf " CP: "
+ etp-cp-1 $arg0->cp
+ printf " "
+ end
+ printf "\n"
+ end
+end
+
+document etp-process-memory-info
+%---------------------------------------------------------------------------
+% etp-process-memory-info Process*
+%
+% Print memory info about process
+%---------------------------------------------------------------------------
+end
+
define etp-port-id2pix-1
# Args: Eterm
#
diff --git a/erts/etc/win32/erlang.ico b/erts/etc/win32/erlang.ico
index cee8b58af9..7b62d31aa9 100644
--- a/erts/etc/win32/erlang.ico
+++ b/erts/etc/win32/erlang.ico
Binary files differ
diff --git a/erts/preloaded/ebin/erlang.beam b/erts/preloaded/ebin/erlang.beam
index fb222cb64b..3c77d6ae0f 100644
--- a/erts/preloaded/ebin/erlang.beam
+++ b/erts/preloaded/ebin/erlang.beam
Binary files differ
diff --git a/erts/preloaded/ebin/erts_internal.beam b/erts/preloaded/ebin/erts_internal.beam
index 9ab806718b..12b36913a9 100644
--- a/erts/preloaded/ebin/erts_internal.beam
+++ b/erts/preloaded/ebin/erts_internal.beam
Binary files differ
diff --git a/erts/preloaded/ebin/zlib.beam b/erts/preloaded/ebin/zlib.beam
index 5b51280838..ffd80f51ba 100644
--- a/erts/preloaded/ebin/zlib.beam
+++ b/erts/preloaded/ebin/zlib.beam
Binary files differ
diff --git a/erts/preloaded/src/erlang.erl b/erts/preloaded/src/erlang.erl
index a21da2ecc9..f99d5bfdd0 100644
--- a/erts/preloaded/src/erlang.erl
+++ b/erts/preloaded/src/erlang.erl
@@ -362,15 +362,25 @@ binary_to_list(_Binary, _Start, _Stop) ->
%% binary_to_term/1
-spec binary_to_term(Binary) -> term() when
Binary :: ext_binary().
-binary_to_term(_Binary) ->
- erlang:nif_error(undefined).
+binary_to_term(Binary) ->
+ %% This BIF may throw badarg while trapping
+ try
+ erts_internal:binary_to_term(Binary)
+ catch
+ error:Reason -> erlang:error(Reason,[Binary])
+ end.
%% binary_to_term/2
-spec binary_to_term(Binary, Opts) -> term() when
Binary :: ext_binary(),
Opts :: [safe].
-binary_to_term(_Binary, _Opts) ->
- erlang:nif_error(undefined).
+binary_to_term(Binary, Opts) ->
+ %% This BIF may throw badarg while trapping
+ try
+ erts_internal:binary_to_term(Binary,Opts)
+ catch
+ error:Reason -> erlang:error(Reason,[Binary,Opts])
+ end.
%% bit_size/1
%% Shadowed by erl_bif_types: erlang:bit_size/1
@@ -2236,6 +2246,7 @@ tuple_to_list(_Tuple) ->
(modified_timing_level) -> integer() | undefined;
(multi_scheduling) -> disabled | blocked | enabled;
(multi_scheduling_blockers) -> [PID :: pid()];
+ (otp_correction_package) -> string();
(otp_release) -> string();
(port_count) -> non_neg_integer();
(port_limit) -> pos_integer();
diff --git a/erts/preloaded/src/erts_internal.erl b/erts/preloaded/src/erts_internal.erl
index c8e8e7e069..d6a185482e 100644
--- a/erts/preloaded/src/erts_internal.erl
+++ b/erts/preloaded/src/erts_internal.erl
@@ -29,7 +29,7 @@
-module(erts_internal).
-export([await_port_send_result/3]).
-
+-export([binary_to_term/1, binary_to_term/2]).
-export([port_command/3, port_connect/2, port_close/1,
port_control/3, port_call/3, port_info/1, port_info/2]).
@@ -160,3 +160,13 @@ request_system_task(_Pid, _Prio, _Request) ->
check_process_code(_Module, _OptionList) ->
erlang:nif_error(undefined).
+-spec binary_to_term(Binary) -> term() when
+ Binary :: binary().
+binary_to_term(_Binary) ->
+ erlang:nif_error(undefined).
+
+-spec binary_to_term(Binary, Opts) -> term() when
+ Binary :: binary(),
+ Opts :: [safe].
+binary_to_term(_Binary, _Opts) ->
+ erlang:nif_error(undefined).
diff --git a/erts/preloaded/src/zlib.erl b/erts/preloaded/src/zlib.erl
index 3d85533b80..df7b2e6198 100644
--- a/erts/preloaded/src/zlib.erl
+++ b/erts/preloaded/src/zlib.erl
@@ -47,6 +47,7 @@
%% compresssion strategy
-define(Z_FILTERED, 1).
-define(Z_HUFFMAN_ONLY, 2).
+-define(Z_RLE, 3).
-define(Z_DEFAULT_STRATEGY, 0).
%% deflate compression method
@@ -125,7 +126,7 @@
-type zmethod() :: 'deflated'.
-type zwindowbits() :: -15..-9 | 9..47.
-type zmemlevel() :: 1..9.
--type zstrategy() :: 'default' | 'filtered' | 'huffman_only'.
+-type zstrategy() :: 'default' | 'filtered' | 'huffman_only' | 'rle'.
%%------------------------------------------------------------------------
@@ -486,6 +487,7 @@ arg_level(_) -> erlang:error(badarg).
arg_strategy(filtered) -> ?Z_FILTERED;
arg_strategy(huffman_only) -> ?Z_HUFFMAN_ONLY;
+arg_strategy(rle) -> ?Z_RLE;
arg_strategy(default) -> ?Z_DEFAULT_STRATEGY;
arg_strategy(_) -> erlang:error(badarg).
diff --git a/erts/test/erlc_SUITE.erl b/erts/test/erlc_SUITE.erl
index ed7a43c7e7..5002836954 100644
--- a/erts/test/erlc_SUITE.erl
+++ b/erts/test/erlc_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -334,7 +334,7 @@ make_dep_options(Config) ->
run(Config, Cmd0, Name, Options, Expect) ->
Cmd = Cmd0 ++ " " ++ Options ++ " " ++ Name,
- io:format("~s", [Cmd]),
+ io:format("~ts", [Cmd]),
Result = run_command(Config, Cmd),
verify_result(Result, Expect).
@@ -356,7 +356,7 @@ split([], Current, Lines) ->
split([], [], [lists:reverse(Current)|Lines]).
match_messages([Msg|Rest1], [Regexp|Rest2]) ->
- case re:run(Msg, Regexp, [{capture,none}]) of
+ case re:run(Msg, Regexp, [{capture,none}, unicode]) of
match ->
ok;
nomatch ->
@@ -398,7 +398,7 @@ run_command(Config, Cmd) ->
TmpDir = filename:join(?config(priv_dir, Config), "tmp"),
file:make_dir(TmpDir),
{RunFile, Run, Script} = run_command(TmpDir, os:type(), Cmd),
- ok = file:write_file(filename:join(TmpDir, RunFile), Script),
+ ok = file:write_file(filename:join(TmpDir, RunFile), unicode:characters_to_binary(Script)),
os:cmd(Run).
run_command(Dir, {win32, _}, Cmd) ->
diff --git a/erts/test/erlexec_SUITE.erl b/erts/test/erlexec_SUITE.erl
index 0dfe6c2e5f..f5ea8f160a 100644
--- a/erts/test/erlexec_SUITE.erl
+++ b/erts/test/erlexec_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2011. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -433,10 +433,10 @@ verify_not_args(Xs, Ys) ->
Xs).
emu_args(CmdLineArgs) ->
- io:format("CmdLineArgs = ~s~n", [CmdLineArgs]),
+ io:format("CmdLineArgs = ~ts~n", [CmdLineArgs]),
{ok,[[Erl]]} = init:get_argument(progname),
EmuCL = os:cmd(Erl ++ " -emu_args_exit " ++ CmdLineArgs),
- io:format("EmuCL = ~s", [EmuCL]),
+ io:format("EmuCL = ~ts", [EmuCL]),
split_emu_clt(string:tokens(EmuCL, [$ ,$\t,$\n,$\r])).
split_emu_clt(EmuCLT) ->
diff --git a/erts/test/z_SUITE.erl b/erts/test/z_SUITE.erl
index da72b18f05..056561d3db 100644
--- a/erts/test/z_SUITE.erl
+++ b/erts/test/z_SUITE.erl
@@ -116,7 +116,7 @@ find_cerl(false) ->
end;
find_cerl(DBTop) ->
case catch filelib:wildcard(filename:join([DBTop,
- "otp_src_R*",
+ "otp_src_*",
"bin",
"cerl"])) of
[Cerl | _ ] ->
@@ -242,7 +242,7 @@ dump_core(#core_search_conf{ cerl = Cerl }, Core) ->
_ ->
os:cmd(Cerl ++ " -dump " ++ Core)
end,
- ct:log("~s~n~n~s",[Core,Dump]).
+ ct:log("~ts~n~n~ts",[Core,Dump]).
format_core(Conf, {ignore, Core}) ->
diff --git a/erts/vsn.mk b/erts/vsn.mk
index 30aa870144..8e77a9a26e 100644
--- a/erts/vsn.mk
+++ b/erts/vsn.mk
@@ -18,7 +18,11 @@
#
VSN = 6.0
-SYSTEM_VSN = 17.0-rc0
+
+# OTP major version
+SYSTEM_VSN = 17
+# OTP correction package version
+SYSTEM_CP_VSN = 17.0-rc0
# Port number 4365 in 4.2
# Port number 4366 in 4.3
diff --git a/lib/Makefile b/lib/Makefile
index ec26a01dc6..5128241563 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -28,10 +28,10 @@ ERLANG_APPLICATIONS = tools test_server common_test runtime_tools \
inets xmerl edoc erl_docgen
# These are only build if -a is given to otp_build or make is used directly
-ALL_ERLANG_APPLICATIONS = snmp otp_mibs appmon erl_interface asn1 jinterface \
+ALL_ERLANG_APPLICATIONS = snmp otp_mibs erl_interface asn1 jinterface \
wx debugger reltool gs \
ic mnesia crypto orber os_mon parsetools syntax_tools \
- pman public_key ssl toolbar tv observer odbc diameter \
+ public_key ssl observer odbc diameter \
cosTransactions cosEvent cosTime cosNotification \
cosProperty cosFileTransfer cosEventDomain et megaco webtool \
eunit ssh typer percept eldap dialyzer hipe
diff --git a/lib/appmon/AUTHORS b/lib/appmon/AUTHORS
deleted file mode 100644
index b727dae36d..0000000000
--- a/lib/appmon/AUTHORS
+++ /dev/null
@@ -1,5 +0,0 @@
-Original Authors and Contributors:
-
-Peter Lundell
-Stefan Anbratt
-Gunilla Arendt
diff --git a/lib/appmon/BUGS_AND_FIXES b/lib/appmon/BUGS_AND_FIXES
deleted file mode 100644
index fdac7f34c5..0000000000
--- a/lib/appmon/BUGS_AND_FIXES
+++ /dev/null
@@ -1,5 +0,0 @@
-
-***) reverse the list of children for a process, to match the starting
-order.
-
-***)
diff --git a/lib/appmon/Makefile b/lib/appmon/Makefile
deleted file mode 100644
index 62033ab92e..0000000000
--- a/lib/appmon/Makefile
+++ /dev/null
@@ -1,33 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2009. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Macros
-# ----------------------------------------------------
-
-SUB_DIRECTORIES = src priv doc/src
-
-SPECIAL_TARGETS =
-
-# ----------------------------------------------------
-# Default Subdir Targets
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_subdir.mk
-
diff --git a/lib/appmon/doc/html/.gitignore b/lib/appmon/doc/html/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/appmon/doc/html/.gitignore
+++ /dev/null
diff --git a/lib/appmon/doc/man3/.gitignore b/lib/appmon/doc/man3/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/appmon/doc/man3/.gitignore
+++ /dev/null
diff --git a/lib/appmon/doc/pdf/.gitignore b/lib/appmon/doc/pdf/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/appmon/doc/pdf/.gitignore
+++ /dev/null
diff --git a/lib/appmon/doc/src/Makefile b/lib/appmon/doc/src/Makefile
deleted file mode 100644
index 7c93abe6d8..0000000000
--- a/lib/appmon/doc/src/Makefile
+++ /dev/null
@@ -1,120 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../../vsn.mk
-VSN=$(APPMON_VSN)
-APPLICATION=appmon
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
-
-# ----------------------------------------------------
-# Target Specs
-# ----------------------------------------------------
-XML_APPLICATION_FILES = ref_man.xml
-XML_REF3_FILES = appmon.xml
-
-XML_PART_FILES = \
- part.xml \
- part_notes.xml
-
-XML_CHAPTER_FILES = \
- appmon_chapter.xml \
- notes.xml
-
-BOOK_FILES = book.xml
-
-XML_FILES = $(BOOK_FILES) $(XML_APPLICATION_FILES) $(XML_REF3_FILES) \
- $(XML_PART_FILES) $(XML_CHAPTER_FILES)
-
-GIF_FILES = \
- app_win.gif \
- listbox_win.gif \
- main_win.gif \
- pinfo_win.gif \
- note.gif
-
-# ----------------------------------------------------
-
-HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
-
-INFO_FILE = ../../info
-
-MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
-
-HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
-
-TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-XML_FLAGS +=
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-$(HTMLDIR)/%.gif: %.gif
- $(INSTALL_DATA) $< $@
-
-docs: pdf html man
-
-$(TOP_PDF_FILE): $(XML_FILES)
-
-pdf: $(TOP_PDF_FILE)
-
-html: gifs $(HTML_REF_MAN_FILE)
-
-clean clean_docs:
- rm -rf $(HTMLDIR)/*
- rm -f $(MAN3DIR)/*
- rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
- rm -f errs core *~
- rm -f $(JD_HTML) $(JD_PACK)
-
-man: $(MAN3_FILES)
-
-gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
-
-debug opt:
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_docs_spec: docs
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DATA) $(TOP_PDF_FILE) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(HTMLDIR)/* \
- "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(INFO_FILE) "$(RELSYSDIR)"
- $(INSTALL_DIR) "$(RELEASE_PATH)/man/man3"
- $(INSTALL_DATA) $(MAN3DIR)/* "$(RELEASE_PATH)/man/man3"
-
-release_spec:
-
diff --git a/lib/appmon/doc/src/app_win.gif b/lib/appmon/doc/src/app_win.gif
deleted file mode 100644
index 06f21d04a9..0000000000
--- a/lib/appmon/doc/src/app_win.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/doc/src/app_win.ps b/lib/appmon/doc/src/app_win.ps
deleted file mode 100644
index 73d4cad278..0000000000
--- a/lib/appmon/doc/src/app_win.ps
+++ /dev/null
@@ -1,680 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./app_win.tmp.eps)
-%%CreationDate: (Tue Jun 12 17:59:02 2001)
-%%BoundingBox: 0 46 300 384
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 46 300 384
-userdict begin
-%%BeginData:
-DisplayImage
-0 46
-300.000000 338.000000
-12
-382 431
-1
-0
-0
-16
-ffffff
-000000
-e8e3dc
-708090
-b03060
-d9d9d9
-b3b3b3
-7f7f7f
-a3a3a3
-828282
-000000
-000000
-000000
-000000
-000000
-000000
-04ff04ff04ff04de05000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500041a050c04d1050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000408
-050c04050500040a0500040a050104030505040105050401050104040501040305030403
-050104020501044a05010400050104000501040005010411050104050504040205010404
-050104050501040005010409050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000407050004020500040205000402
-050004050500040a05000409050304020501040205010400050104020501040005010404
-050104020501040105010402050204010501044a05010403050104000501041105010403
-050104040500040805010408050104080500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004080500040205000402
-050004020500040505000403050204030500040905000401050004020501040205010400
-050104020501040005020402050204010501040305010401050204010501040105010404
-050004000502040005020401050104020501040105030401050104000501040105010400
-050104060503040105010400050104060501040005010400050104000501040005010400
-050104020503040105010400050504020500040605000400050104010501040005010400
-050104000503040005010409050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000407050004020500040205000402
-050004050500040205040402050004080501040105010401050104020501040005010402
-050104000502040205020401050104030501040105010400050004000501040105010404
-050104010501040105010400050104020501040005010401050104000502040005010400
-050204000501040405010401050104000502040005010404050104000502040005010400
-050104000502040005010400050104010501040005040400050104020500040205010400
-050004000500040005010400050104000502040005060400050104080500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004080504040205000402050004050500040105060401050004080501040105010401
-050504010505040105030400050304010501040305010401050104000500040005010408
-050104010501040105010401050104000501040505010400050104010501040005010401
-050104040501040105010400050104010501040405010401050104000501040005010400
-050104010501040005010401050104000502040205010402050004010500040105000401
-050004000501040005010401050104000502040105010400050104090500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004070500040605000402050004050500040105060401050004080505040105010405
-050104050501040005000400050004000501040105010403050104010501040105020408
-050104010501040105010401050104000501040205040400050104010501040005010401
-050104040501040105010400050104010501040405010401050104000501040005010400
-050104010501040005050400050104030501040205000400050004020500040105000400
-050104000501040105010400050104020501040005010408050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000408
-050004060500040205000405050004010506040105000407050104030501040005010405
-050104050501040005020400050104010501040305010401050104010502040805010401
-050104010501040205020402050104010501040005010401050104000501040105010404
-050104010501040005010401050104040501040105010400050104000501040005010401
-050104000501040405010403050104020500040005000401050104000500040105010400
-050104010501040005010402050104000501040905000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040705000406
-050004020500040505000402050404020500040705010403050104000501040505010405
-050104010500040105010402050104010501040205010402050104010501040405010401
-050104010501040205020402050104010501040005020400050104000502040005010404
-050104010501040005010401050104040501040005020400050104000501040005020400
-050104000501040105010400050104030501040005000400050004010501040005010402
-050104000501040005020400050104020501040005010408050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000408
-050804020500040505000403050204030500040705010403050104000501040505010405
-050104010500040105010403050304030501040205010401050104040501040105010401
-050104030501040305020400050304000501040105010400050104060503040105010401
-050104050501040005010400050104000501040005010400050104020503040105010404
-050104020500040805010401050104000501040005010402050104000501040905000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-05000400050004070500040a050004050500040a050004530500040a0501040405010442
-050404200500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004080500040a050004050500040a050004520501040a
-050104040501046905000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-05000400050004000500040005000400050004070500040a05000405050c04510501040b
-050104040501046805000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-0500040005000400050004000500040005000408050c04e5050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-050004000500040005000400050004000500040005000400050004000500040005000400
-0500040005000400050004000500040005000400050004000500040005000400050004ff
-04ff04ff041303ff03ff03fb00ff00ff00fa0900000105ff05790901000105ff05790901
-000105ff05790901000105ff05790901000105ff05790901000105040104050401000503
-010205120102050b01000506010005ff051801000502010005090102050c090100010504
-0100050f01000511010005020100050a010005ff0520010005020100050b0100050c0901
-000105040100050601020505010005030102050a01000502010005010100050001010502
-0104050201020503010205020100050001010503010205ff050301000502010005020102
-050501000502010005000101050509010001050401000508010005050100050201000502
-010005090100050201000501010105010100050301000506010005020100050201000501
-010105010100050101000502010005ff0502010005020100050101000502010005040100
-050201010501010005040901000105040103050501000505010005020100050201000509
-010005020100050101000502010005030100050601000502010005020100050101000502
-01000501010005ff05060104050101000502010005040100050201000502010005040901
-000105040100050801000505010005020104050901000502010005010100050201000503
-010005060100050201000502010005010100050201000502010205ff0503010005020100
-050101040504010005020100050201000504090100010504010005080100050501000502
-0100050d0100050201000501010005020100050301000506010005020100050201000501
-0100050201000505010005ff050201000502010005010100050801000502010005020100
-050409010001050401000508010005050100050201000502010005090100050201000501
-010105010100050301000506010005020100050201000501010005020100050101000502
-010005ff0502010005020100050101000502010005040100050201010501010005040901
-000105040100050801000505010005030102050b01020502010005000101050501010504
-01000503010205020100050201000502010205ff05030100050201000502010205050100
-0502010005000101050509010001052f010005ff053e0100050809010001052f010005ff
-053e0100050809010001052f010005ff053e010005080901000105ff05790901000105ff
-05790901000105ff05790901000109ff097b000009ff097c02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02730800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000020900450209004502090045024700000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000000080000000800
-000008000000080000000800000008000000080000000800000008000209004409000209
-004409000209004409000247080000000842010002090001054109010209000105410901
-020900010541090102470000084201000800020900010541090102090001054109010209
-000105410901024708000000084201000209000105410901020900010541090102090001
-054109010247000008420100080002090001054109010209000105410901020900010541
-090102470800000008120104080b0101081c010002090001051301020514010005140901
-02090001050e0104052d0901020900010512010005020100050401000503010205030102
-051509010247000008150100080c0100081d010008000209000105120100050201000513
-0100051409010209000105100100052f0901020900010512010005010100050c01000505
-010005150901024708000000081401000803010008000101080401000804010208160100
-020900010512010005060102050201000500010105030101050001000514090102090001
-051001000503010005000101050301020503010205030102051209010209000105120100
-050001000504010205050100050501000515090102470000081501000803010108010100
-080101040801010008020100081401000800020900010513010005040100050201000501
-010105010100050101000501010105140901020900010510010005030101050101000501
-010005020100050101000502010005010100050201000511090102090001051201010507
-010005050100050501000515090102470800000008140100080301000802010008030100
-080301000802010008150100020900010514010105020100050201000501010005020100
-050101000502010005140901020900010510010005030100050901000501010005050100
-050201000511090102090001051201000500010005060100050501000505010005150901
-024700000815010008030100080201000803010008030100080201000814010008000209
-000105160100050101040501010005020100050101000502010005140901020900010510
-010005030100050601030501010005050104051109010209000105120100050101000505
-010005050100050501000515090102470800000008140100080301000802010008030100
-080301000802010008150100020900010512010005020100050101000505010005020100
-050101000502010005140901020900010510010005030100050501000502010005010100
-050501000515090102090001051201000501010005050100050501000505010005150901
-024700000815010008030100080201000803010008030100080201000814010008000209
-000105120100050201000501010005020100050101000502010005010100050101010514
-090102090001051001000503010005050100050201000501010005020100050101000502
-010005110901020900010512010005020100050401000505010005050100051509010247
-080000000812010408010100080201000803010008040102081601000209000105130102
-050301020502010005020100050201010500010005140901020900010510010005030100
-050601030502010205030102051209010209000105120100050201000504010005050100
-050501000515090102470000084201000800020900010541090102090001054109010209
-000105410901024708000000084201000209000105410901020900010541090102090001
-054109010247000008420100080002090001054109010209000105410901020900010541
-090102470800000008420100020900010541090102090001054109010209000105410901
-024700000842010008000209000105410901020900010541090102090001054109010247
-080000000842010002090001054109010209000105410901020900010541090102470000
-084201000800020900010541090102090001054109010209000105410901024708000000
-084201000209000105410901020900010541090102090001054109010247000008000100
-080001000800010008000100080001000800010008000100080001000800010008000100
-080001000800010008000100080001000800010008000100080001000800010008000100
-080001000800010008000100080001000800010008000100080001000800010008000100
-080001000800010008000100080001000800010008000100080002090001094302090001
-094302090001094302470800010008000100080001000800010008000100080001000800
-010008000100080001000800010008000100080001000800010008000100080001000800
-010008000100080001000800010008000100080001000800010008000100080001000800
-010008000100080001000800010008000100080001000800010008000100080001000800
-01000800010002090000094402090000094402090000094402ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff022901ff017d05ff05ff05ff05ff05ff05ff
-05ff05ff05ff05ff05ff05ff05ff056d02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02d5014902ff023301000647010002ff023301000647010002ff02330100
-0647010002ff023301000647010002ff02330100060e0103060701010603010306020103
-060601030610010002ff02330100060d0101060101010604010306020101060101010600
-0101060101010604010106010101060f010002ff02330100060d01010601010106060101
-060201010601010106000101060101010604010106010101060f010002ff02330100060a
-010106000101060101010606010106020101060101010600010106010101060401010601
-010106010101060b010002ff023301000608010206010101060101010606010106020101
-0601010106000101060101010604010106010101060201020609010002ff023301000607
-010106030101060101010606010106020101060101010600010106010101060401010601
-0101060401010608010002ff023301000608010206010101060101010606010106020101
-0601010106000101060101010604010106010101060201020609010002ff02330100060a
-010106000101060101010601010106020101060201010601010106000101060101010601
-0101060001010601010106010101060b010002ff02330100060e01030602010106020101
-060301030602010306020101060101030610010002ff023301000647010002ff02330100
-0647010002ff023301000647010002ff023301000647010002ff023301000647010002ff
-023301000647010002ff023301220701012402ff0256070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff0258014902ff023301000647010002ff023301000647010002ff0233
-01000647010002ff023301000647010002ff02330100060e010306070101060301030603
-0101060701030610010002ff02330100060d010106010101060401030602010106010101
-060001030606010106010101060f010002ff02330100060d010106010101060601010602
-010106010101060201010606010106010101060f010002ff02330100060a010106000101
-0601010106060101060201010601010106020101060601010601010106010101060b0100
-02ff02330100060801020601010106010101060601010602010106010101060201010606
-010106010101060201020609010002ff0233010006070101060301010601010106060101
-0602010106010101060201010606010106010101060401010608010002ff023301000608
-010206010101060101010606010106020101060101010602010106060101060101010602
-01020609010002ff02330100060a01010600010106010101060101010602010106020101
-060101010602010106030101060001010601010106010101060b010002ff02330100060e
-01030602010106020101060301030603010106030101060101030610010002ff02330100
-0647010002ff023301000647010002ff023301000647010002ff023301000647010002ff
-023301000647010002ff023301000647010002ff023301220701012402ff0256070102ff
-027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff
-027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff
-027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff
-027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff
-027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff
-027b070102ff027b070102ff027b070102ff0258014902ff023301000647010002ff0233
-01000647010002ff023301000647010002ff023301000647010002ff0233010006470100
-02ff023301000647010002ff023301000600010006000102060001020601010106020101
-060101030601010106000101060101010600010106090103060101010601010106000101
-060001010604010002ff0233010006000101060101010601010106000101060201010600
-010106010101060001020600010106000102060001010607010106010101060001010601
-010106000102060001010603010002ff0233010006000101060101010601010106010101
-060001010605010106000101060101010600010106010101060701020603010106010101
-06000101060101010603010002ff02330100060001010601010106010101060101010600
-010106020104060001010601010106000101060101010609010206010101060101010600
-0101060101010603010002ff023301000600010106010101060101010602010206020101
-0601010106000101060101010600010106010101060a0102060001010601010106000101
-060101010603010002ff0233010006000101060101010601010106020102060201010601
-010106000102060001010600010206000101060701010601010106000101060001020600
-0102060001010603010002ff023301000600010106010101060101010603010106030102
-060001030600010106010101060001010609010306020101060001010600010106000101
-0604010002ff02330100060e0100060a010106040101061901010607010002ff02330100
-060d0101060a010106040101061901010607010002ff02330100060c0101060b01010604
-010106040106060d01010607010002ff023301000647010002ff023301000647010002ff
-023301000647010002ff023301220701012402ff0256070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b0701
-02ff0254074802ff0233074902ff023307010245070102ff023307010245070102ff0233
-07010245070102ff023307010245070102ff023307010245070102ff0233070102450701
-02ff023307010245070102ff023307010245070102ff023307010245070102ff02330701
-0245070102ff023307010245070102ff023307010245070102ff023307010245070102ff
-023307010245070102ff023307010245070102ff023307010245070102ff023307010245
-070102ff021e012d0212013b02ff02000100062b0100021201000639010002ff02000100
-062b0100021201000639010002ff02000100062b0100021201000639010002ff02000100
-062b0100021201000639010002ff02000100062b010002120100063201010604010002ff
-02000100062b010002120100063201010604010002ff0200010006000100060001020600
-010206010101060201010601010306010101060101010600010106000101060401000212
-010006010100060001020600010206010101060201010601010306010101060201010601
-01030601010106000101060101030603010002ff02000100060001010601010106010101
-060001010602010106000101060101010600010106010101060001020600010106030100
-021201000601010106010101060101010600010106020101060001010601010106000101
-0602010106000101060101010600010206000101060101010604010002ff020001000600
-010106010101060101010601010106000101060101020603010106010101060001010601
-010106030100021201000601010106010101060101010601010106000101060101010601
-0101060101010600010106010101060101010600010106010101060101010604010002ff
-020001000600010106010101060101010601010106000101060301020601010106010101
-060001010601010106030100021201000601010106010101060101010601010106000101
-060101050601010106000101060101050600010106010101060101010604010002ff0200
-010006000101060101010601010106020102060501020600010106010101060001010601
-010106030100021201000601010106010101060101010602010206020101060601020602
-01010604010106010101060101010604010002ff02000100060001010601010106010101
-060201020602010106010101060001010600010206000102060001010603010002120100
-060101010601010106010101060201020602010106010101060201020602010106010101
-060001010601010106010101060001000602010002ff0200010006000101060101010601
-010106030101060301030602010106000101060001010600010106040100021201000601
-010106010101060101010603010106030103060401000604010306010101060101010602
-01010603010002ff02000100060e0100061101010607010002120100060f010006280100
-02ff02000100060d0101061101010607010002120100060e01010628010002ff02000100
-060c0101061201010607010002120100060d01010629010002ff02000100062b01000212
-01000639010002ff02000100062b0100021201000639010002ff02000100062b01000212
-01000639010002ff02000114070101160212013b02ff0215070102ff027b070102ff027b
-070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b
-070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b070102ff027b
-070102ff025c074b02ff0230074c02ff023007010248070102ff023007010248070102ff
-023007010248070102ff023007010248070102ff023007010248070102ff023007010248
-070102ff023007010248070102ff023007010248070102ff023007010248070102ff0230
-07010248070102ff023007010248070102ff023007010248070102ff0230070102480701
-02ff023007010248070102ff023007010248070102ff023007010248070102ff02300701
-0248070102ff021001420212012d02f901000640010002120100062b010002f901000640
-010002120100062b010002f901000640010002120100062b010002f90100064001000212
-0100062b010002f901000640010002120100061401020613010002f90100064001000212
-0100061301010615010002f9010006020100060001020600010206010101060201010601
-010306020103060101010600010306020101060101030601010106000101060301000212
-010106000102060001020601010106020101060001030601010306010100060001020600
-01020603010002f901000602010106010101060101010600010106020101060001010601
-010106000101060101010600010606020101060001010601010106000104060301000212
-010206010101060101010600010106020101060101010601010106010101060001010601
-0101060101010602010002f9010006020101060101010601010106010101060001010601
-010206030101060101010600010206020101060001010601010106010101060001020605
-010002120102060101010601010106010101060001010602010106010102060301010601
-0101060101010602010002f9010006020101060101010601010106010101060001010603
-010206010105060001010603010106000101060101050600010106060100021201020601
-010106010101060101010600010106020101060301020601010106010101060101010602
-010002f90100060201010601010106010101060201020605010206000101060401010604
-010206020101060401010606010002120102060101010601010106020102060301010604
-01020600010106010101060101010602010002f901000602010106010101060101010602
-010206020101060101010600010106010101060001010604010206020101060101010600
-010106060100021201020601010106010101060201020603010106010101060101010600
-010106010101060101010602010002f90100060201010601010106010101060301010603
-010306020103060101010605010006040103060101010606010002120102060101010601
-01010603010106030101060201030601010106010101060101010602010002f901000610
-0100062e010002120100060d0100061c010002f90100060f0101062e010002120100060c
-0101061c010002f90100060e0101062f010002120100060b0101061d010002f901000640
-010002120100062b010002f901000640010002120100062b010002f90100064001000212
-0100062b010002f901420212012d02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff02ff
-02ff0236
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 46 300 384
-%%EOF
diff --git a/lib/appmon/doc/src/appmon.xml b/lib/appmon/doc/src/appmon.xml
deleted file mode 100644
index 2707ea4d9a..0000000000
--- a/lib/appmon/doc/src/appmon.xml
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE erlref SYSTEM "erlref.dtd">
-
-<erlref>
- <header>
- <copyright>
- <year>1996</year>
- <year>2013</year>
- <holder>Ericsson AB, All Rights Reserved</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- The Initial Developer of the Original Code is Ericsson AB.
- </legalnotice>
-
- <title>appmon</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <module>appmon</module>
- <modulesummary>A graphical node and application process tree viewer.</modulesummary>
- <description>
- <warning>
- <p>
- The Appmon application has been superseded by the Observer application.
- Appmon will be removed in R16.
- </p>
- </warning>
- <p>The application monitor Appmon is a graphical utility used to
- supervise applications executing either locally or on remote nodes.
- The process tree of an application can furthermore be monitored.</p>
- </description>
- <funcs>
- <func>
- <name>start()</name>
- <fsummary>Start Appmon.</fsummary>
- <desc>
- <p>Starts Appmon.</p>
- </desc>
- </func>
- <func>
- <name>stop()</name>
- <fsummary>Stop Appmon.</fsummary>
- <desc>
- <p>Stops Appmon.</p>
- </desc>
- </func>
- </funcs>
-
- <section>
- <title>See Also</title>
- <p>Appmon User's Guide</p>
- </section>
-</erlref>
-
diff --git a/lib/appmon/doc/src/appmon_chapter.xml b/lib/appmon/doc/src/appmon_chapter.xml
deleted file mode 100644
index 1b6054f622..0000000000
--- a/lib/appmon/doc/src/appmon_chapter.xml
+++ /dev/null
@@ -1,328 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>2000</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Appmon</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- <file>appmon_chapter.xml</file>
- </header>
-
- <section>
- <title>Introduction</title>
- <warning>
- <p>
- The Appmon application has been superseded by the Observer application.
- Appmon will be removed in R16.
- </p>
- </warning>
- <p>The application monitor Appmon is a graphical node and application viewer. The tool shows an overview of all applications on all known nodes, and it is possible to view the process tree for an application running on any of the nodes.</p>
- <note>
- <p>If the Appmon code is not available at a node, for example an
- embedded node, this node is ignored by Appmon and is not shown
- in the Appmon window.</p>
- </note>
- </section>
-
- <section>
- <title>Getting Started with Appmon</title>
- <p>Start Appmon by calling <c><![CDATA[appmon:start()]]></c>. It will start the <seealso marker="#main_win">main window</seealso> showing a load meter and the applications running at the current node. By clicking on one of the applications a window showing the process tree of the application will be opened, the <seealso marker="#app_win">application window</seealso>.</p>
- <p>The main window is equipped with a menubar from which it is possible to:</p>
- <list type="bulleted">
- <item>exit Appmon</item>
- <item>perform some operations on the node</item>
- <item>set how information should be displayed</item>
- <item>select which node to show</item>
- <item>open help (this document).</item>
- </list>
- <p>The application window shows the process tree for an application with each process displayed as a box. It is possible to view information about the processes, to send messages to them, and to trace and kill them.</p>
- </section>
-
- <section>
- <title>The Main Window</title>
- <marker id="main_win"></marker>
- <p>The main window shows a load meter and all applications running at the displayed node. Select which node to display in the window by choosing the node name from the Nodes menu. It is also possible to run Appmon in a many-window mode where a new instance of the main window is opened for each node to be displayed.</p>
- <image file="main_win.gif">
- <icaption>The Main Window.</icaption>
- </image>
- <p>The load meter shows load measured as processor time, or as the length of the ready queue.</p>
- <p>Every application running at the node is shown as a button. Clicking the button will open the application window showing the process tree for the application.</p>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Show List Box...</em></tag>
- <item>This will open the <seealso marker="#listbox_win">listbox window</seealso> which lists all nodes and applications. This window can be more easy to use than the normal, graphical user interface when the system consists of a large number of nodes and/or applications.</item>
- <tag><em>Close</em></tag>
- <item>Close the window. If no other instance of the main window exists, Appmon will be stopped.</item>
- <tag><em>Exit</em></tag>
- <item>Stop Appmon.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Actions Menu</title>
- <taglist>
- <tag><em>Reboot</em></tag>
- <item>Call <c><![CDATA[init:reboot()]]></c> at the currently displayed node. This will stop the node. If the <c><![CDATA[-heart]]></c> system flag was given, the heart program will try to reboot the system.</item>
- <tag><em>Restart</em></tag>
- <item>Call <c><![CDATA[init:restart()]]></c> at the currently displayed node. This will restart the node.</item>
- <tag><em>Stop</em></tag>
- <item>Call <c><![CDATA[init:stop()]]></c> at the currently displayed node. This will stop the node.</item>
- <tag><em>Ping</em></tag>
- <item>Call <c><![CDATA[net:ping(Node)]]></c> where <c><![CDATA[Node]]></c> is the currently displayed node. This can be useful when the connection to the node has been lost.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Options Menu</title>
- <taglist>
- <tag><em>One window/Many windows</em></tag>
- <item>Select one of these radio button to run Appmon in one-window or many-window mode. In many-windows mode, a new instance of the main window is opened for each node to be displayed. The default value is one-window mode.</item>
- <tag><em>Load: time/queue</em></tag>
- <item>Select one of these radio buttons to either calculate load as processor time or as the length of the ready queue, which is the number of processes ready to execute. By default, the load is calculated as processor time.</item>
- <tag><em>Load: progressive/linear</em></tag>
- <item>Select one of these radio buttons to show load either according to a progressive or a linear scale. By default, the load is shown according to a progressive scale. </item>
- </taglist>
- </section>
-
- <section>
- <title>The Nodes Menu</title>
- <p>The Nodes menu contains all currently and previously known nodes,
- where the Appmon code is available. Nodes where the Appmon code is
- not available, for example embedded nodes, are ignored by Appmon and
- are not shown.</p>
- <p>Selecting a node from the Nodes menu will cause that node to be displayed in either the same window, or in a new window, depending on if Appmon is run in one-window or many-windows mode. If the connection to the node has been lost, this will be shown in the window.</p>
- </section>
-
- <section>
- <title>The Help Menu</title>
- <taglist>
- <tag><em>Help</em></tag>
- <item>Selecting Help from the Help menu will cause the HTML version of the Appmon User's Guide (this document) to be displayed. Currently this function requires Netscape to be up and running.</item>
- </taglist>
- </section>
- </section>
-
- <section>
- <title>The Application Window</title>
- <marker id="app_win"></marker>
- <p>The application window shows the process tree for an application. The window title contains the application name and the node name. The window also contains a menubar and a toolbar.</p>
- <p>The application window can be opened from the main window by clicking on the button denoting the application, or from the listbox window by selecting the application and clicking on the <em>Load</em> button.
- </p>
- <image file="app_win.gif">
- <icaption>The Application Window.</icaption>
- </image>
- <p>The application can be shown either as a strict supervision tree, or as a process view with all linked processes. In supervision mode, the tree-gathering and -building algorithm assumes conformance to the OTP design principles.</p>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Close</em></tag>
- <item>Close the application window.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Options Menu</title>
- <taglist>
- <tag><em>Refresh</em></tag>
- <item>Refresh the application window.</item>
- <tag><em>Sup. view/ Proc. view</em></tag>
- <item>Select one of these radio buttons to show the application as a strict supervision tree, or as a process view with all linked processes. By default, the process view is used.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Toolbar</title>
- <p>The toolbar consists of four buttons: <em>Info</em>, <em>Send</em>, <em>Trace</em> and <em>Kill</em>. First select one of these buttons and then select to which process the action should apply by clicking on a process in the process tree. By default <em>Info</em> is selected which means that clicking on a process, without selecting <em>Send</em>, <em>Trace</em> or <em>Kill</em> first, will open the <seealso marker="#pinfo_win">process information window</seealso>.</p>
- <taglist>
- <tag><em>Info</em></tag>
- <item>Open the <seealso marker="#pinfo_win">process information window</seealso>, which displays the information about the process given by <c><![CDATA[process_info(Pid)]]></c>.</item>
- <tag><em>Send</em></tag>
- <item>Send a message to a process. A window is opened where the message can be specified. Click <em>Ok</em> to send the message or <em>Cancel</em> to cancel.</item>
- <tag><em>Trace</em></tag>
- <item>Switch on OTP tracing of a process. <c><![CDATA[sys:trace(Pid,true)]]></c> is called. Selecting <em>Trace</em> a second time for the same process will switch the tracing off instead.</item>
- <tag><em>Kill</em></tag>
- <item>Kill a process. <c><![CDATA[exit(Pid,kill)]]></c> is called.</item>
- </taglist>
- </section>
- </section>
-
- <section>
- <title>The Listbox Window</title>
- <marker id="listbox_win"></marker>
- <p>The listbox window lists all nodes and applications. This window can be more easy to use than the normal, graphical user interface when the system consists of a large number of nodes and/or applications.</p>
- <image file="listbox_win.gif">
- <icaption>The Listbox Window.</icaption>
- </image>
- <p>The window contains three buttons:</p>
- <taglist>
- <tag><em>Load</em></tag>
- <item>First selecting an application and then clicking the <em>Load</em> button will open the <seealso marker="#app_win">application window</seealso> for that application.</item>
- <tag><em>Clear</em></tag>
- <item>De-select any selected node or application name.</item>
- <tag><em>Close</em></tag>
- <item>Close the listbox window.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Process Information Window</title>
- <marker id="pinfo_win"></marker>
- <p>The process information window shows information about different processes as given by <c><![CDATA[process_info(Pid)]]></c>.</p>
- <image file="pinfo_win.gif">
- <icaption>The Process Information Window.</icaption>
- </image>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Close</em></tag>
- <item>Close the process information window.</item>
- </taglist>
- </section>
- </section>
-
- <section>
- <title>Using the Web Based version of Appmon</title>
-
- <section>
- <title>Introduction</title>
- <p>The web based version of Appmon is an alternative version of
- Appmon. The main difference between the web based version of
- Appmon and the original version of Appmon is that the web based
- version of Appmon can monitor nodes and applications on nodes where
- Appmon not is installed.</p>
- </section>
-
- <section>
- <title>Start the Web Based version of Appmon</title>
- <p>To start the web based user interface configure and start
- WebTool, see <em>WebTool User's Guide</em>. The web based
- version of Appmon is compatible with the browsers
- Netscape Navigator and Internet Explorer 4.0 and higher.</p>
- <p>When WebTool is started, start the Web based version of Appmon via
- WebTool. If WebTool succeeded to start the web based version of Appmon
- a link named WebAppmon will appear in the topmost frame. Click on the link and
- the main frame of the browser will show two frames.The left frame will
- show a combo box for node selection and a list of all applications on
- the currently selected node. </p>
- <p>In the left frame it is possible to:</p>
- <list type="bulleted">
- <item>Select which node to supervise.</item>
- <item>Select an application to view its process tree.</item>
- <item>Select an application to view its specification.</item>
- </list>
- <p>The right frame shows the selected information, either the application
- specification or the process tree and process information.</p>
- </section>
-
- <section>
- <title>Selecting a Different Node</title>
- <p>In the top of the left frame there is a combo box with all known
- nodes. The name of the node that is monitored is the node whose name
- is visible in the combo box. At startup the node on which the web
- based version of Appmon is running on will be monitored.</p>
- <p>To change node, select another node in the combo box, and
- the list of running applications will change to the applications
- that runs on the selected node.</p>
- </section>
-
- <section>
- <title>Viewing the Process Tree of an Application</title>
- <p>To view the process tree of an application click on the application
- name in the list of applications. The process tree of the selected
- application will then appear in the right frame.</p>
- <p>The processes in the process tree can have three different colors:</p>
- <taglist>
- <tag><em>Blue</em></tag>
- <item>The relation to the process above in the process hierarchy
- is a primary relation. That means that the process above is the
- only process that link to it or the process above is a supervisor. </item>
- <tag><em>Red</em></tag>
- <item>The relation to the process above in the process hierarchy is a secondary
- relation. This means that more than one process has a relation to it
- and the process above in the hierarchy is not a supervisor.</item>
- <tag><em>Black</em></tag>
- <item>The process isn't a regular process instead it's a Port. The name of
- the process will also begin with <em>Port:</em></item>
- </taglist>
- <p>If the process name begins with <em>Runs on another node:</em> The
- monitored application runs on more than one node and this process is
- the first process on a branch that runs on another node. </p>
- </section>
-
- <section>
- <title>Viewing the Application Specification</title>
- <p>After the application name in the list of applications there are a
- link named <em>Spec</em>, Click on this link and the application
- specification will appear in the right frame. The application
- specification is the data in the <em>.app</em> file of the selected
- application. </p>
- </section>
-
- <section>
- <title>Select Process View</title>
- <p>In the top of the page that shows the process tree, there are three
- radio buttons for selecting which processes that shall be included
- in the process tree. The default mode is that all processes
- that one process in the application tree has a relation to is
- included. It's possible to filter which of the processes
- in the process tree that will be included. To reduce the number
- of processes in the process tree select one of the radio buttons
- on the top of the page </p>
- <taglist>
- <tag><em>All processes</em></tag>
- <item>All processes that at least one process in the application
- tree has a link to.</item>
- <tag><em>Supervised processes</em></tag>
- <item>All processes that are supervised by one of the supervisors in
- the application</item>
- <tag><em>Supervisors only</em></tag>
- <item>Only the processes that actually are supervisors in the
- applications supervision tree is included</item>
- </taglist>
- </section>
-
- <section>
- <marker id="proc_info"></marker>
- <title>Process Information</title>
- <p>To see more information about a specific process click on the process
- name and more information will be loaded under the application tree.</p>
- <p>The Process information page shows information about a process as given
- by the <c><![CDATA[process_info(Pid)]]></c>, but formatted in a more human readable form.</p>
- </section>
-
- <section>
- <title>Trace a process</title>
- <p>If the link after the process name in the process tree is <em>start trace</em>
- the process is not traced. If the link is <em>stop trace</em> then the process
- id traced.</p>
- <p>To toggle the trace flag for a process click on the link <em>start trace</em> or
- <em>stop trace</em> after the process name in the process tree.</p>
- </section>
- </section>
-</chapter>
-
diff --git a/lib/appmon/doc/src/book.xml b/lib/appmon/doc/src/book.xml
deleted file mode 100644
index c9979c6050..0000000000
--- a/lib/appmon/doc/src/book.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE book SYSTEM "book.dtd">
-
-<book xmlns:xi="http://www.w3.org/2001/XInclude">
- <header titlestyle="normal">
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>appmon</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev>2.0</rev>
- </header>
- <insidecover>
- </insidecover>
- <pagetext>Appmon</pagetext>
- <preamble>
- </preamble>
- <parts lift="no">
- <xi:include href="part.xml"/>
- </parts>
- <applications>
- <xi:include href="ref_man.xml"/>
- </applications>
- <releasenotes>
- <xi:include href="notes.xml"/>
- </releasenotes>
- <listofterms></listofterms>
- <index></index>
-</book>
-
diff --git a/lib/appmon/doc/src/fascicules.xml b/lib/appmon/doc/src/fascicules.xml
deleted file mode 100644
index 37feca543f..0000000000
--- a/lib/appmon/doc/src/fascicules.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
-
-<fascicules>
- <fascicule file="part" href="part_frame.html" entry="no">
- User's Guide
- </fascicule>
- <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
- Reference Manual
- </fascicule>
- <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
- Release Notes
- </fascicule>
- <fascicule file="" href="../../../../doc/print.html" entry="no">
- Off-Print
- </fascicule>
-</fascicules>
-
diff --git a/lib/appmon/doc/src/listbox_win.gif b/lib/appmon/doc/src/listbox_win.gif
deleted file mode 100644
index 38258b7552..0000000000
--- a/lib/appmon/doc/src/listbox_win.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/doc/src/listbox_win.ps b/lib/appmon/doc/src/listbox_win.ps
deleted file mode 100644
index 0f1e2eeda0..0000000000
--- a/lib/appmon/doc/src/listbox_win.ps
+++ /dev/null
@@ -1,741 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./listbox_win.tmp.eps)
-%%CreationDate: (Tue Jun 12 18:01:07 2001)
-%%BoundingBox: 0 85 200 356
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 85 200 356
-userdict begin
-%%BeginData:
-DisplayImage
-0 85
-200.000000 271.000000
-12
-325 441
-1
-0
-0
-8
-ffffff
-000000
-708090
-b03060
-d9d9d9
-808080
-c3c3c3
-000000
-03ff03ff03ff036704000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003000400031a040c03cc0400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000308040c03050400030a0400030a04010343040103240401031904010300
-0401030f040103010401031e040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003070400030204000302
-04000302040003050400030a040003090403034204010324040103190401031204010321
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003080400030204000302040003020400030504000303
-040203030400030904000301040003010401030004010301040103000401030104000300
-040203000402030204030301040103000401030204010304040103000401030204030302
-040103000401030104030302040303060403030104010300040103020401030004010305
-040303010401030004010301040103000401030104010300040103010403030204030301
-04030300040103010403030104010300040103020403030a040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003070400030204000302040003020400030504000302040403020400030804010301
-040103000402030004010300040203000401030004010301040103010401030004010301
-040103000402030004010301040103040402030004010300040103010401030004010300
-040203000401030104010300040103010401030404010301040103000402030004010300
-040103000402030404010301040103000402030004010300040203000401030004010300
-040103000401030104010300040103010401030104010301040103000401030104010300
-040203000401030004010301040103080400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030804040302
-040003020400030504000301040603010400030804010301040103000401030104010300
-040103010401030004010301040103010401030004010301040103000401030104010308
-04010301040103000401030104010300040103010401030004010301040103000402030b
-040103000401030104010300040103010401030804010300040103010401030004010301
-040103000401030004010300040103080401030104010301040103000401030104010300
-04010301040103000402030c040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003070400030604000302
-040003050400030104060301040003080405030004010301040103000401030104010300
-040103010401030104010300040103010401030004010301040103080401030104010300
-040103010401030004010301040103000405030204020306040403000401030104010300
-040103010401030504040300040103010401030004010301040103000401030004010300
-040103050404030104010301040103000401030104010300040103010401030204020309
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003080400030604000302040003050400030104060301
-040003070401030304030301040103000401030104010300040103010401030104010300
-040103010401030004010301040103080401030104010300040103010401030004010301
-040103000401030704020304040103010401030004010301040103000401030104010304
-040103010401030004010301040103000401030104010300040103000401030004010304
-040103010401030104010301040103000401030104010300040103010401030304020309
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070400030604000302040003050400030204040302
-040003070401030304040300040103000402030004010300040103010401030104010300
-040103010401030004010301040103010401030404010301040103000401030104010300
-040103000402030004010301040103000401030104010304040103010401030004010301
-040103000401030004020304040103010401030004020300040103000402030004010300
-040103000401030004010301040103000401030104010301040103000402030004010301
-040103000401030104010300040103010401030804000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000308
-040803020400030504000303040203030400030704010303040303000401030104010300
-040103010401030104010301040103010403030104010301040103010401030404010301
-040103010403030204010300040103010403030204030306040203000403030104010301
-040103000401030504020300040303000401030104010300040103010401030004010301
-04030302040203000401030104010300040103010403030104010301040103010403030a
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070400030a040003050400030a0400030f04010304
-0401036c040103040401033d040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003080400030a04000305
-0400030a0400030f040103040401036c040103040401033e040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003070400030a04000305040c030f040103040401036c040103040401033d04000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000308040c03e00400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003000400030004000300040003ff03ff03a1
-02ff02ff028904ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff046b0512
-04ff043105110000047e05b0040105010606050006060001047e05af0000040105010605
-0000050006060001047e050104ac00010401050106050000050106050001047e050104ac
-00010401050106040001050106050001047e0501043301000430010004260100041d0001
-04010501060400010400050106040001047e050104040100040401000403010204020100
-0415010004040100040001000405010004060100040b010004030102040b0100040b0102
-0405010004120100041c000104010501060300010401050106040001047e050104040100
-040b010004020100041501000403010004020100040c010004120100040b0100040d0100
-04190100041c000104010501060300010402050106030001047e05010401010104000100
-040201020405010004020100040001010403010204020100040001010402010404010100
-0400010204020102040301010400010004010100040001010403010204050100040a0100
-04050102040501000403010204020100040201000402010204050100041b000104010501
-060200010403050106030001047e05010400010004010101040401000405010004020101
-040101000401010004020100040101010401010004030100040301000400010004000100
-04040100040201000401010104010101040101000404010004050100040a010004040100
-0402010004040100040501000402010004020100040101000402010004040100041b0001
-04010501060200010404050106020001047e050104000100040201000404010004050100
-040201000402010004010100040201000401010004070100040301000400010004000100
-040401000402010004020100040101000408010004050100040a01000408010004040100
-040501000402010004020100040101000402010004040100041b00010401050106010001
-0405050106020001047e0501040001000402010004040100040501000402010004020100
-040101040401010004070100040301000400010204040100040201000402010004010100
-0408010004050100040a0100040501030404010004050100040301000400010004020104
-04040100041b000104010501060100010406050106010001047e05010400010004020100
-040401000405010004020100040201000401010004050100040701000403010004080100
-0402010004020100040101000408010004050100040a0100040401000402010004040100
-0405010004030100040001000402010004080100041b0001040105010600000104070501
-06010001047e050104000100040101010404010004050100040201010401010004010100
-040201000401010004070100040401000401010004040100040201000401010104010100
-0408010004050100040b0100040301000402010004040100040501000404010004030100
-0402010004030100041c000104010501060000010408050106000001047e050104010101
-040001000404010004050100040201000400010104030102040201000408010104030101
-040501000403010104000100040101000408010004050100040b01000404010304040100
-04050100040401000404010204040100041c0001040105010001050b06000001047e0501
-0465010004260100041d0001040105010000050d0001047e050104ac000104010501060e
-0001047e050104ac0001040105010010047e050104ac000104010501000d05000001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104160101040001000402010004020100040201020402
-010004000101040201000400010104750001040105010001040a05010001047e05010416
-010004000100040001000401010004020100040101000402010004010101040101000401
-01010401010004740001040105010001040a05010001047e050104160100040001000400
-010004020100040101000405010004010100040201000401010004020100047400010401
-05010001040a05010001047e050104160100040001000400010004020100040101000402
-01030401010004020100040101000402010004740001040105010001040a05010001047e
-050104160100040001000400010004030100040001000401010004020100040101000402
-0100040101000402010004740001040105010001040a05010001047e0501041601000400
-010004000100040301010402010004020100040101010401010004010101040101000474
-0001040105010001040a05010001047e0501041601000400010004000100040401000403
-01030401010004000101040201000400010104750001040105010001040a05010001047e
-050104200100040901000405010004780001040105010001040a05010001047e0501041d
-010004000100040a01000405010004780001040105010001040a05010001047e0501041e
-0100040b01000405010004780001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e05010416010004220102046e00010401
-05010001040a05010001047e05010416010004240100046e0001040105010001040a0501
-0001047e0501041601000401010004030102040201000400010104020100040001010403
-010204050100046e0001040105010001040a05010001047e050104160100040001000403
-01000402010004010101040101000401010104010100040101000402010004040100046e
-0001040105010001040a05010001047e0501041601010404010004020100040101000405
-010004020100040101000402010004040100046e0001040105010001040a05010001047e
-050104160101040401040401010004050100040201000401010404040100046e00010401
-05010001040a05010001047e050104160100040001000403010004050100040501000402
-01000401010004080100046e0001040105010001040a05010001047e0501041601000401
-01000402010004020100040101000405010004020100040101000402010004040100046e
-0001040105010001040a05010001047e0501041601000402010004020102040201000405
-0100040201000402010204050100046e0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e0501042c0102047c0001040105010001040a05010001047e
-0501042e0100047c0001040105010001040a05010001047e050104170102040301020403
-010204050100047c0001040105010001040a05010001047e050104160100040201000401
-010004020100040101000402010004040100047c0001040105010001040a05010001047e
-050104160100040901000401010004080100047c0001040105010001040a05010001047e
-050104170102040301030402010204050100047c0001040105010001040a05010001047e
-0501041a010004010100040201000405010004040100047c0001040105010001040a0501
-0001047e050104160100040201000401010004020100040101000402010004040100047c
-0001040105010001040a05010001047e050104170102040301030402010204050100047c
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e0501043301000430010004260100041d0001040105010001
-040a05010001047e050104040100040f0100041501000404010004000100040501000406
-0100040b010004030102040b0100040b01020405010004120100041c0001040105010001
-040a05010001047e050104040100040f0100041501000403010004020100040c01000412
-0100040b0100040d010004190100041c0001040105010001040a05010001047e05010401
-010104000100040201020403010104000100040101000400010104030102040201000400
-010104020104040101000400010204020102040301010400010004010100040001010403
-010204050100040a01000405010204050100040301020402010004020100040201020405
-0100041b0001040105010001040a05010001047e05010400010004010101040101000402
-010004010100040101010401010104010100040101000402010004010101040101000403
-010004030100040001000400010004040100040201000401010104010101040101000404
-010004050100040a01000404010004020100040401000405010004020100040201000401
-01000402010004040100041b0001040105010001040a05010001047e0501040001000402
-010004010100040201000401010004020100040101000402010004010100040201000401
-010004070100040301000400010004000100040401000402010004020100040101000408
-010004050100040a01000408010004040100040501000402010004020100040101000402
-010004040100041b0001040105010001040a05010001047e050104000100040201000401
-010004020100040101000402010004010100040201000401010404010100040701000403
-010004000102040401000402010004020100040101000408010004050100040a01000405
-0103040401000405010004030100040001000402010404040100041b0001040105010001
-040a05010001047e05010400010004020100040101000402010004010100040201000401
-010004020100040101000405010004070100040301000408010004020100040201000401
-01000408010004050100040a010004040100040201000404010004050100040301000400
-01000402010004080100041b0001040105010001040a05010001047e0501040001000401
-010104010100040201000401010004010101040101010401010004010100040201000401
-010004070100040401000401010004040100040201000401010104010100040801000405
-0100040b0100040301000402010004040100040501000404010004030100040201000403
-0100041c0001040105010001040a05010001047e05010401010104000100040201020403
-010104000100040101000400010104030102040201000408010104030101040501000403
-010104000100040101000408010004050100040b01000404010304040100040501000404
-01000404010204040100041c0001040105010001040a05010001047e0501041201000451
-010004260100041d0001040105010001040a05010001047e0501040e0100040201000498
-0001040105010001040a05010001047e0501040f010204990001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e05010416
-010004220102046e0001040105010001040a05010001047e05010416010004240100046e
-0001040105010001040a05010001047e0501041601000401010004030102040201000400
-010104020100040001010403010204050100046e0001040105010001040a05010001047e
-050104160100040001000403010004020100040101010401010004010101040101000401
-01000402010004040100046e0001040105010001040a05010001047e0501041601010404
-010004020100040101000405010004020100040101000402010004040100046e00010401
-05010001040a05010001047e050104160101040401040401010004050100040201000401
-010404040100046e0001040105010001040a05010001047e050104160100040001000403
-01000405010004050100040201000401010004080100046e0001040105010001040a0501
-0001047e0501041601000401010004020100040201000401010004050100040201000401
-01000402010004040100046e0001040105010001040a05010001047e0501041601000402
-0100040201020402010004050100040201000402010204050100046e0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001047e050104ac00010401
-05010001040a05010001047e050104ac0001040105010001040a05010001047e050104ac
-0001040105010001040a05010001047e050104ac0001040105010001040a05010001047e
-050104ac0001040105010001040a05010001047e050104ac0001040105010001040a0501
-0001047e050104ac0001040105010001040a05010001047e050104ac0001040105010001
-040a05010001047e050104ac0001040105010001040a05010001040900630410050104ac
-0001040105010001040a050100010409006205000410050104ac0001040105010001040a
-0501000104090001045f05010410050104ac0001040105010001040a0501000104090001
-045f05010410050104ac0001040105010001040a0501000104090001045f050104100501
-04ac0001040105010001040a0501000104090001045f05010410050104ac000104010501
-0001040a0501000104090001045f05010410050104ac0001040105010001040a05010001
-04090001045f05010410050104ac0001040105010001040a0501000104090001045f0501
-0410050104ac0001040105010001040a0501000104090001042101000417010004230501
-0410050104ac0001040105010001040a0501000104090001042101000417010004230501
-0410050104ac0001040105010001040a0501000104090001042101000406010204030102
-0403010104000100042305010410050104ac0001040105010001040a0501000104090001
-042101000405010004020100040101000402010004010100040101010423050104100501
-04ac0001040105010001040a050100010409000104210100040501000402010004050100
-0401010004020100042305010410050104ac0001040105010001040a0501000104090001
-042101000405010004020100040201030401010004020100042305010410050104ac0001
-040105010001040a05010001040900010421010004050100040201000401010004020100
-0401010004020100042305010410050104ac0001040105010001040a0501000104090001
-042101000405010004020100040101000402010004010100040101010423050104100501
-04ac0001040105010001040a050100010409000104210104040201020403010304020101
-04000100042305010410050104ac0001040105010001040a0501000104090001045f0501
-0410050104ac0001040105010001040a0501000104090001045f05010410050104ac0001
-040105010001040a0501000104090001045f05010410050104ac0001040105010001040a
-0501000104090001045f05010410050104ac0001040105010001040a0501000104090001
-045f05010410050104ac0001040105010001040a0501000104090001045f050104100501
-04ac0001040105010001040a0501000104090001045f05010410050104ac000104010501
-0001040a0501000104090001045f05010410050104ac0001040105010001040a05010001
-04090001045f05010410050104ac0001040105010001040a0501000104090001045f0501
-0410050104ac0001040105010001040a050100010409000105610410050104ac00010401
-05010001040a050100010409000005620410050104ac0001040105010001040a05010001
-047e050104ac0001040105010001040a05010001047e050104ac0001040105010001040a
-05010001047e050104ac0001040105010001040a05010001047e050104ac000104010501
-0001040a05010001047e050104ac0001040105010001040a05010001047e050104ac0001
-040105010001040a05010001047e050104ac0001040105010001040a05010001047e0501
-04ac0001040105010001040a05010001047e050104ac0001040105010001040a05010001
-047e050104ac0001040105010001040a05010001040900630410050104ac000104010501
-0001040a050100010409006205000410050104ac0001040105010001040a050100010409
-0001045f05010410050104ac0001040105010001040a0501000104090001045f05010410
-050104ac0001040105010001040a0501000104090001045f05010410050104ac00010401
-05010001040a0501000104090001045f05010410050104ac0001040105010001040a0501
-000104090001045f05010410050104ac0001040105010001040a0501000104090001045f
-05010410050104ac0001040105010001040a0501000104090001045f05010410050104ac
-0001040105010001040a0501000104090001041e010204030102043605010410050104ac
-0001040105010001040a0501000104090001041d01000402010004040100043605010410
-050104ac0001040105010001040a0501000104090001041d010004020100040401000403
-0102040301020402010004000101042105010410050104ac0001040105010001040a0501
-000104090001041d01000408010004020100040201000401010004020100040101010401
-0100042005010410050104ac0001040105010001040a0501000104090001041d01000408
-010004020100040201000405010004010100042405010410050104ac0001040105010001
-040a0501000104090001041d010004080100040201040402010304010100042405010410
-050104ac0001040105010001040a0501000104090001041d010004020100040401000402
-0100040501000402010004010100042405010410050104ac0001040105010001040a0501
-000104090001041d01000402010004040100040201000402010004010100040201000401
-0100042405010410050104ac0001040105010001040a0501000104090001041e01020405
-0100040301020403010304010100042405010410050104ac0001040105010001040a0501
-000104090001045f05010410050104ac0001040105010001040a0501000104090001045f
-05010410050104ac0001040105010001040a0501000104090001045f05010410050104ac
-0001040105010001040a0501000104090001045f05010410050104ac0001040105010001
-040a0501000104090001045f05010410050104ac0001040105010001040a050100010409
-0001045f05010410050104ac0001040105010001040a0501000104090001045f05010410
-050104ac0001040105010001040a0501000104090001045f05010410050104ac00010401
-05010001040a0501000104090001045f05010410050104ac0001040105010001040a0501
-000104090001045f05010410050104ac0001040105010001040a05010001040900010561
-0410050104ac0001040105010001040a050100010409000005620410050104ac00010401
-05010001040a05010001047e050104ac0001040105010001050c0001047e050104ac0001
-040105010000050d0001047e050104ac000104010501060e0001047e050104ac00010401
-05010010047e050104ac0001040105010600000c05000001047e050104ac000104010501
-060000010408050106000001047e050104ac000104010501060100010407050106000001
-047e050104ac000104010501060100010406050106010001047e050104ac000104010501
-060200010405050106010001047e050104ac000104010501060200010404050106020001
-040900630410050104ac0001040105010603000104030501060200010409006205000410
-050104ac00010401050106030001040205010603000104090001045f05010410050104ac
-00010401050106040001040105010603000104090001045f05010410050104ac00010401
-050106040001040005010604000104090001045f05010410050104ac0001040105010605
-000005020604000104090001045f05010410050104ac0001040105010605000005010605
-000104090001045f05010410050100ae04010501060605010605000104090001045f0501
-0410050000af04010501060605000606000104090001045f050104c30501001004090001
-041e0102040301020436050104c30500001104090001041d010004020100040401000436
-0501040e05b804180001041d010004020100040401000403010204030102040301020421
-0501040e05b7000004180001041d01000408010004020100040201000401010004020100
-040101000402010004200501040e0501060d00000600009406000001060c000104180001
-041d010004080100040201000402010004010100040501000402010004200501040e0501
-060b0001050006000093050006000003060a000104180001041d01000408010004020100
-04020100040201020402010404200501040e050106090002050106000001049005010600
-00050608000104180001041d010004020100040401000402010004020100040501000401
-010004240501040e05010607000304000501060000010490050106000001040100030606
-000104180001041d01000402010004040100040201000402010004010100040201000401
-01000402010004200501040e050106050003040205010600000104900501060000010403
-00030604000104180001041e01020405010004030102040301020403010204210501040e
-05010603000304040501060000010490050106000001040500030602000104180001045f
-0501040e0501060100030406050106000001049005010600000104070003060000010418
-0001045f0501040e05050408050106000001049005010600000104080503000104180001
-045f0501040e050106010503040605010600000104900501060000010407050306000001
-04180001045f0501040e0501060305030404050106000001049005010600000104050503
-0602000104180001045f0501040e05010605050304020501060000010490050106000001
-040305030604000104180001045f0501040e050106070503040005010600000104900501
-06000001040105030606000104180001045f0501040e0501060905040600000104900501
-0600000105030608000104180001045f0501040e0501060b050206000001059206000001
-0501060a000104180001045f0501040e0501060d0500060000000593060000000500060c
-000104180001045f0501040e050100b6041800010561040e050000b704180000056204ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04bb
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 85 200 356
-%%EOF
diff --git a/lib/appmon/doc/src/main_win.gif b/lib/appmon/doc/src/main_win.gif
deleted file mode 100644
index 36d742e91e..0000000000
--- a/lib/appmon/doc/src/main_win.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/doc/src/main_win.ps b/lib/appmon/doc/src/main_win.ps
deleted file mode 100644
index abb12d733b..0000000000
--- a/lib/appmon/doc/src/main_win.ps
+++ /dev/null
@@ -1,691 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./main_win.tmp.eps)
-%%CreationDate: (Tue Jun 12 17:57:00 2001)
-%%BoundingBox: 0 26 377 164
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 26 377 164
-userdict begin
-%%BeginData:
-DisplayImage
-0 26
-377.000000 138.000000
-12
-520 191
-1
-0
-0
-16
-ffffff
-000000
-708090
-b03060
-d9d9d9
-808080
-00ff00
-666666
-999999
-ececc5
-000000
-000000
-000000
-000000
-000000
-000000
-03ff03ff03ff03ff03ff0305040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400031b040c03e4040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000307040c03050400030a0400030a040103030405030104050301
-040103040401030304030303040103020401030b0403031e0401032c0401030004010300
-040103000401031104010305040403020401030404010305040103000401030904000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003080400030204000302
-04000302040003050400030a040003090403030204010302040103000401030204010300
-04010304040103020401030104010302040203010401030a040103010401034c04010303
-040103000401031104010303040103040400030804010308040103080400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003070400030204000302
-040003020400030504000303040203030400030904000301040003020401030204010300
-040103020401030004020302040203010401030304010301040203010401030104010305
-040103030401030004010302040103010403030104010300040303020401030004010301
-040303010401030104010301040103050403030104010300040103060401030004010300
-040103000401030004010300040103020403030104010300040503020400030604000300
-040103010401030004010300040103000403030004010309040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030804000302040003020400030204000305
-040003020404030204000308040103010401030104010302040103000401030204010300
-040203020402030104010303040103010401030004000300040103010401030504010303
-040103000401030204010300040103010401030004060302040103000401030004010301
-040103000401030104010301040103040401030104010300040203000401030404010300
-040203000401030004010300040203000401030004010301040103000404030004010302
-040003020401030004000300040003000401030004010300040203000406030004010308
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000307
-040403020400030204000305040003010406030104000308040103010401030104050301
-040503010403030004030301040103030401030104010300040003000401030904010303
-040103010401030004010301040103010401030004020302040103000401030104010300
-040103010401030104010300040103000401030504010301040103000401030104010304
-040103010401030004010300040103000401030104010300040103010401030004020302
-040103020400030104000301040003010400030004010300040103010401030004020301
-040103000401030904000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003080400030604000302040003050400030104060301040003080405030104010305
-040103050401030004000300040003000401030104010303040103010401030104020309
-040103030401030104010300040103010405030004010303040103000401030104010300
-040503010401030004010300040103050401030104010300040103010401030404010301
-040103000401030004010300040103010401030004050300040103030401030204000300
-040003020400030104000300040103000401030104010300040103020401030004010308
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000307
-040003060400030204000305040003010406030104000307040103030401030004010305
-040103050401030004020300040103010401030304010301040103010402030904010303
-040103020402030204010304040103040402030204010300040103050401030004010300
-040103050401030104010300040103010401030404010301040103000401030004010300
-040103010401030004010304040103030401030204000300040003010401030004000301
-040103000401030104010300040103020401030004010309040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030804000306040003020400030504000302
-040403020400030704010303040103000401030504010305040103010400030104010302
-040103010401030204010302040103010401030604010301040103030402030204010301
-040103000401030404020302040103000401030104010302040103010401030604010301
-040103000401030104010304040103000402030004010300040103000402030004010300
-040103010401030004010303040103000400030004000301040103000401030204010300
-040103000402030004010302040103000401030804000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030704080302040003050400030304020303
-040003070401030304010300040103050401030504010301040003010401030304030303
-040103020401030104010307040303050400030404030301040103050400030304010301
-040303030401030104010307040303010401030104010305040103000401030004010300
-040103000401030004010302040303010401030404010302040003080401030104010300
-040103000401030204010300040103090400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000300040003080400030a040003050400030a040003be0404032004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003000400030004000300040003070400030a
-040003050400030a040003e5040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003080400030a04000305040c03e404000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000300040003000400030004000307040c03f8040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003ff03ff03ff03ff032802ff02ff02ff02ff
-020f00ff00ff00ff00ff000e0500000104ff04ff04030501000104ff04ff040305010001
-04ff04ff04030501000104ff04ff04030501000104ff04ff040305010001040401040404
-01000403010204130100040c01000406010004200102040b010004060100041f01000402
-0100040c010004ff043601000402010004090102040c0501000104040100040f01000413
-0100040c01000427010004020100040a01000427010104010100040c010004ff04360100
-04020100040b0100040c0501000104040100040601020405010004030102040b01000400
-010004030102040201040402010204030102040201000400010104030102040a01000402
-01000401010004000101040201040402010204030102040201000400010104030102040a
-010104010100040201020403010104000100040201020403010204ff0429010004020100
-040201020405010004020100040001010405050100010404010004080100040501000402
-010004020100040a01000400010004020100040201000403010004060100040201000402
-010004010101040101000401010004020100040901000402010004010101040101000403
-010004060100040201000402010004010101040101000401010004020100040901000400
-010004000100040101000402010004010100040101010401010004020100040101000402
-010004ff0428010004020100040101000402010004040100040201010401010004040501
-00010404010304050100040501000402010004020100040a010004000100040201000407
-0100040601000402010004020100040101000402010004010100040d0100040201000401
-01000402010004030100040601000402010004020100040101000402010004010100040d
-010004000100040001000401010004020100040101000402010004010100040201000401
-010004ff042c010404010100040201000404010004020100040201000404050100010404
-010004080100040501000402010404090100040201000401010004070100040601000402
-010004020100040101000402010004020102040a01000402010004010100040201000403
-0100040601000402010004020100040101000402010004020102040a0100040101010401
-0100040201000401010004020100040101040402010204ff042901000402010004010104
-04040100040201000402010004040501000104040100040801000405010004020100040d
-010404010100040701000406010004020100040201000401010004020100040501000409
-010004020100040101000402010004030100040601000402010004020100040101000402
-010004050100040901000401010104010100040201000401010004020100040101000409
-010004ff0428010004020100040101000408010004020100040201000404050100010404
-010004080100040501000402010004020100040901000402010004010100040201000403
-010004060100040201000402010004010100040201000401010004020100040901000402
-010004010101040101000403010004060100040201000402010004010100040201000401
-010004020100040901000402010004010100040201000401010004010101040101000402
-0100040101000402010004ff042801000402010004010100040201000404010004020101
-0401010004040501000104040100040801000405010004030102040a0100040201000402
-0102040501010404010004030102040201000402010004020102040b0102040201000400
-0101040501010404010004030102040201000402010004020102040a0100040201000402
-01020403010104000100040201020403010204ff04290100040201000402010204050100
-04020100040001010405050100010468010004ff048f01000408050100010468010004ff
-048f01000408050100010468010004ff048f010004080501000104ff04ff040305010001
-04ff04ff04030501000104ff04ff04030501000105ff05ff0505000005ff05ff050604ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04cf01ff01ff
-010704ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff
-04ff044c01150400010104010100041a017204ff045d0100081201010400010104000101
-041a017204ff045d01000812010404010100041a017204ff045d01000812010104000101
-04010100041a017204ff045d0100081201010400010104010100041a017204ff045d0114
-04050100041a011909010100090101000901010009010111090101050904010209010104
-09010105090101000901011704ff045d0100081201000421011909010103090101000901
-0111090101030901010409000108090101080901011704ff045d01000812010004210116
-090101000901010009010100090101000901010009010102090301010901010009050102
-090001060900010009010101090101000901010009010100090301000901011704ff045d
-010008120100042101150901010009020100090101000901010009020100090101000901
-010109010100090401000901010209000102090101000900010009000100090101000901
-010009020100090601000901011704ff045d010008120100042101150901010109010100
-090101000901010009010101090101000901010109010100090201020901010209000101
-090001010900010109000100090101000901010109010100090201010901010009010117
-04ff045d0114042101150901010109010100090101000901010009010101090101000905
-010009010103090101020900010009000102090001010900010009010100090101010901
-010009010102090101000901011704ff045d010008120100042101150901010109010100
-090101000901010009010101090101000901010409010103090101020900010009000101
-090101000900010109010100090101010901010009010102090101000901011704ff045d
-010008120100042101150901010009020100090101000901010009020100090101000901
-010109010100090101030901010009000100090001010901010009010102090101000901
-01000902010009010102090101000901011704ff045d0100081201000421011609010100
-090101000901010009010100090101000901010209030101090101040901010209000108
-09010101090101000901010009010102090101000901011704ff045d0100081201000421
-013d0904012f04ff045d01140421017204ff045d0100081201000421017204ff045d0100
-081201000421017204ff045d0100081201000421017204ff045d01000812010004210172
-04ff045d01140421017204ff045d01000812010004ff04f201000812010004ff04f20100
-0812010004ff04f201000812010004ff04f2011404ff04f201000812010004ff04f20100
-0812010004ff04f201000812010004ff04f201000812010004ff04f201140444010004ff
-04ac0100081201000444010004ff04ac0100081201000444010004ff04ac010008120100
-0444010004ff04ac0100081201000444010004ff04ac01140444010004ff04ac01000812
-01000444010004ff04ac0100081201000444010004ff04ac0100081201000444010004ff
-04ac0100081201000444010004ff04ac01140444010004ff04ac01000812010004440100
-04ff04ac0100081201000444010004ff04ac0100081201000444010004ff04ac01000812
-01000444010004ff04ac01140444010004ff04ac0100081201000444010004ff04ac0100
-081201000444010004ff04ac0100081201000444010004ff04ac01000812010004440100
-04ff04ac0114044401a004ff040c01000812010004440100044e0100044e010004ff040c
-01000812010004440100044e0100044e010004ff040c01000812010004440100044e0100
-044e010004ff040c01000812010004440100044e0100044e010004ff040c011404440100
-044e0100044e010004ff040c01000812010004440100044e0100044e010004ff040c0100
-0812010004440100044e0100044e010004ff040c01000812010004440100044e0100044e
-010004ff040c01000812010004440100044e0100044e010004ff040c011404440100044e
-0100044e010004ff040c01000812010004440100044e0100044e010004ff040c01000812
-010004440100044e0100044e010004ff040c01000812010004440100044e0100044e0100
-04ff040c01000812010004440100044e0100044e010004ff040c011404440100044e0100
-044e010004ff040c01000812010004440100044e0100044e010004ff040c010008120100
-04440100044e0100044e010004ff040c01000812010004440100044e0100044e010004ff
-040c01000812010004210045040900450409004504ea0114042000450701040700450701
-04070045070104e901000812010004200001044307010407000104430701040700010443
-070104e901000812010004200001044307010407000104430701040700010443070104e9
-01000812010004200001044307010407000104430701040700010443070104e901000812
-010004200001044307010407000104430701040700010443070104e9011404200001040f
-0101041e01010410070104070001042a010104160701040700010443070104e901000612
-0101041f0001040f0101041e01010410070104070001042a010104160701040700010443
-070104e90100061201010403010204180001040f01010401010104010103040101010400
-010304000101040201030401010104100701040700010416010304020103040201030401
-01010416070104070001040d010004000102040001020401010104020101040101030401
-0101040001010401010104000101040f070104e901000612010104020101040001010417
-0001040f0101040001010401010104010101040001070400010104000101040101010400
-010104100701040700010415010104010101040001010401010104000101040101010400
-01010416070104070001040d010104010101040101010400010104020101040001010401
-010104000102040001010400010204000101040e070104e9010006120101040201010400
-010104170001040f01030402010104010101040001020401010104010101040001010401
-010104000101041007010407000104150102040701010400010204030101041607010407
-0001040d0101040101010401010104010101040001010405010104000101040101010400
-010104010101040e070104e901170401010204180001040f010304020105040001010402
-010104010101040001050400010104100701040700010417010204020104040201020401
-01010416070104070001040d010104010101040101010401010104000101040201040400
-0101040101010400010104010101040e070104e901010403010204010101040201030400
-01020402010004190001040f010104000101040101010404010104020101040101010400
-010104040101041007010407000104180102040001010401010104030102040001010416
-070104070001040d01010401010104010101040201020402010104010101040001010401
-01010400010104010101040e070104e90101040201010400010104000102040001010400
-010104210001040f01010401010104000101040101010400010104020101040101010400
-010104010101040001010410070104070001041501010401010104000101040101010400
-010104010101040001010416070104070001040d01010401010104010101040201020402
-01010401010104000102040001010400010204000101040e070104e90101040201010400
-010104000102040001010400010104210001040f01010402010104000103040101010402
-010104010101040101030401010104100701040700010416010304020102040001010400
-0103040101010416070104070001040d0101040101010401010104030101040301020400
-0103040001010401010104000101040f070104e901030401010204010102040101030421
-000104430701040700010443070104070001041b0100040a0101040401010412070104ea
-01020402010004030100040301000423000104430701040700010443070104070001041a
-0101040a0101040401010412070104ff041f000104430701040700010443070104070001
-04190101040b0101040401010412070104ff041f00010443070104070001044307010407
-00010443070104ff041f0001044307010407000104430701040700010443070104ff041f
-0000074604070000074604070000074604ff04200746040807460408074604ff04ff04ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff042c01ff
-01ff010704ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff
-04ff04ff0447
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 26 377 164
-%%EOF
diff --git a/lib/appmon/doc/src/note.gif b/lib/appmon/doc/src/note.gif
deleted file mode 100644
index 6fffe30419..0000000000
--- a/lib/appmon/doc/src/note.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/doc/src/notes.xml b/lib/appmon/doc/src/notes.xml
deleted file mode 100644
index ac17c555f7..0000000000
--- a/lib/appmon/doc/src/notes.xml
+++ /dev/null
@@ -1,300 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Appmon Release Notes</title>
- <prepared></prepared>
- <docno>nil</docno>
- <date>nil</date>
- <rev>nil</rev>
- <file>notes.xml</file>
- </header>
- <p>This document describes the changes made to the Appmon application.</p>
-
-<section><title>Appmon 2.1.14.2</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Misc build updates</p>
- <p>
- Own Id: OTP-10784</p>
- </item>
- <item>
- <p>
- The backend module appmon_info.erl is moved from appmon
- application to runtime_tools. This allows appmon to be
- run from a remote erlang node towards a target node which
- does not have appmon (and its dependencies) installed, as
- long as runtime_tools is installed there.</p>
- <p>
- Own Id: OTP-10786</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.14.1</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The GS applications is now deprecated and will be
- removed in the R16 release. The following GS-based
- applications have been superseded by the Observer
- application and will removed in R16: Appmon, Pman,
- Tv.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-9907</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.14</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Eliminate use of deprecated regexp module</p>
- <p>
- Own Id: OTP-9810</p>
- </item>
- <item>
- <p>
- Miscellaneous documentation build updates</p>
- <p>
- Own Id: OTP-9813</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.13</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- An obsolete compiler directive for native code generation
- was removed from a source file.</p>
- <p>
- Own Id: OTP-8839</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.12</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Warnings due to new autoimported BIFs removed</p>
- <p>
- Own Id: OTP-8674 Aux Id: OTP-8579 </p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.11</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The documentation is now possible to build in an open
- source environment after a number of bugs are fixed and
- some features are added in the documentation build
- process. </p>
- <p>- The arity calculation is updated.</p>
- <p>- The module prefix used in the function names for
- bif's are removed in the generated links so the links
- will look like
- "http://www.erlang.org/doc/man/erlang.html#append_element-2"
- instead of
- "http://www.erlang.org/doc/man/erlang.html#erlang:append_element-2".</p>
- <p>- Enhanced the menu positioning in the html
- documentation when a new page is loaded.</p>
- <p>- A number of corrections in the generation of man
- pages (thanks to Sergei Golovan)</p>
- <p>- The legal notice is taken from the xml book file so
- OTP's build process can be used for non OTP
- applications.</p>
- <p>
- Own Id: OTP-8343</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Appmon 2.1.10.2</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- The documentation is now built with open source tools
- (xsltproc and fop) that exists on most platforms. One
- visible change is that the frames are removed.</p>
- <p>
- Own Id: OTP-8201</p>
- </item>
- </list>
- </section>
-
-</section>
-
- <section>
- <title>Appmon 2.1.10.1</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>
- Updated the application with new tags for automatic updates
- of copyright notices.
- </p>
- <p>Own Id: OTP-7851</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.9</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Fixed dialyzer warning in <c><![CDATA[appmon_info]]></c>.</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.8</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Removed some dead code from the <c><![CDATA[appmon_info]]></c> and
- <c><![CDATA[process_info]]></c> modules. Also rewritten large parts
- of <c><![CDATA[process_info]]></c> to make it easier to read and more
- efficient.</p>
- <p>Own Id: OTP-6534</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.7</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Appmon now handles a process name containing the
- character '@' correctly. (Thanks to Mikael Magnusson).</p>
- <p>Own Id: OTP-6308</p>
- </item>
- <item>
- <p>The "Send" button in the application window was broken,
- it always failed (silently).</p>
- <p>Own Id: OTP-6333</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.6</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Internal change only (using a private digraph instead of
- a public one).</p>
- <p>Own Id: OTP-5983</p>
- </item>
- <item>
- <p>Notification windows are now centered over the parent
- window (if possible).</p>
- <p>Own Id: OTP-6010 Aux Id: OTP-5987</p>
- </item>
- <item>
- <p>Removed some dead code from <c><![CDATA[appmon_info]]></c>,
- discovered by Dialyzer.</p>
- <p>Own Id: OTP-6040</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.5</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Eliminated 5 discrepancies found by Dialyzer in the
- Appmon application.</p>
- <p>Own Id: OTP-5633</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Appmon 2.1.4</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>The graphic applications now search for HTML
- documentation in the correct place.</p>
- <p>Own Id: OTP-5381</p>
- </item>
- </list>
- </section>
- </section>
-</chapter>
-
diff --git a/lib/appmon/doc/src/part.xml b/lib/appmon/doc/src/part.xml
deleted file mode 100644
index c9766d39ca..0000000000
--- a/lib/appmon/doc/src/part.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>2000</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Appmon User's Guide</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <description>
- <p>The Application Monitor, <em>Appmon</em>, is a graphical utility used
- to supervise applications executing either locally or on remote nodes.
- The process tree of an application can furthermore be monitored.</p>
- </description>
- <xi:include href="appmon_chapter.xml"/>
-</part>
-
diff --git a/lib/appmon/doc/src/part_notes.xml b/lib/appmon/doc/src/part_notes.xml
deleted file mode 100644
index 8b1b8fe39e..0000000000
--- a/lib/appmon/doc/src/part_notes.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Appmon Release Notes</title>
- <prepared>Ingela Anderton Andin</prepared>
- <docno></docno>
- <date>2004-09-07</date>
- <rev></rev>
- <file>part_notes.sgml</file>
- </header>
- <description>
- <p>The Application Monitor, <em>Appmon</em>, is a graphical utility
- used to supervise applications executing either locally or on
- remote nodes. The process tree of an application can furthermore
- be monitored.</p>
- </description>
- <include file="notes"></include>
-</part>
-
diff --git a/lib/appmon/doc/src/pinfo_win.gif b/lib/appmon/doc/src/pinfo_win.gif
deleted file mode 100644
index fda0900436..0000000000
--- a/lib/appmon/doc/src/pinfo_win.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/doc/src/pinfo_win.ps b/lib/appmon/doc/src/pinfo_win.ps
deleted file mode 100644
index d47d7d47a9..0000000000
--- a/lib/appmon/doc/src/pinfo_win.ps
+++ /dev/null
@@ -1,1353 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./pinfo_win.tmp.eps)
-%%CreationDate: (Tue Jun 12 18:01:56 2001)
-%%BoundingBox: 0 73 377 347
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 73 377 347
-userdict begin
-%%BeginData:
-DisplayImage
-0 73
-377.000000 274.000000
-12
-580 421
-1
-0
-0
-8
-ffffff
-000000
-708090
-b03060
-d9d9d9
-c3c3c3
-828282
-000000
-03ff03ff03ff03ff03ff035e040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400031a040c03c50400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000308040c03050400030a0400030a0401030304050301
-0405030104010304040103030403030304010302040103090405032d040103090402031e
-040103010401031704000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000307040003020400030204000302040003050400030a0400030904030302
-040103020401030004010302040103000401030404010302040103010401030204020301
-04010309040103020401032c04010308040103200401031a040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000308040003020400030204000302
-040003050400030304020303040003090400030104000302040103020401030004010302
-040103000402030204020301040103030401030104020301040103010401030504010302
-040303000401030004030302040303020403030204030302040303060401030004010300
-040103010403030104030301040103000402030004020300040203020403030104030300
-0401030104030301040103000401030a0400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070400030204000302040003020400030504000302
-040403020400030804010301040103010401030204010300040103020401030004020302
-040203010401030304010301040103000400030004010301040103050401030204080301
-040103000401030104010300040103010401030004010301040103000401030104010305
-040103000402030004010301040103010401030104010300040603010401030104010300
-040103010401030104010301040103000401030104010300040203000401030804000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030804040302
-040003020400030504000301040603010400030804010301040103010405030104050301
-040303000403030104010303040103010401030004000300040103090405030004020301
-040103010401030004010304040103010401030004020303040203080401030004010301
-040103010401030104010301040103000402030104010301040103010401030404010301
-040103010401030004010301040103000401030104010309040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000307040003060400030204000305
-040003010406030104000308040503010401030504010305040103000400030004000300
-040103010401030304010301040103010402030904010304040103020401030104010300
-040103040405030204020303040203060401030004010301040103010401030104010301
-040103000401030204010301040103010401030104040301040103010401030004010301
-040103000401030104010308040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000308040003060400030204000305040003010406030104000307
-040103030401030004010305040103050401030004020300040103010401030304010301
-040103010402030904010304040103020401030104010300040103040401030704020303
-040203050401030004010301040103010401030104010301040103000401030204010301
-040103010401030004010301040103010401030104010300040103010401030004010301
-040103090400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003070400030604000302040003050400030204040302040003070401030304010300
-040103050401030504010301040003010401030204010301040103020401030204010301
-040103050401030404010302040103010401030004010301040103000401030104010300
-040103010401030004010301040103050401030004010301040103010401030104010301
-040103000401030204010301040103010401030004010301040103010401030004020300
-040103010401030004010301040103080400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003080408030204000305040003030402030304000307
-040103030401030004010305040103050401030104000301040103030403030304010302
-040103010401030504010304040103030403030204030302040303020403030204030306
-040103000401030104010301040103020403030104010302040103010401030104010301
-040203000401030104010300040103010403030104010301040103090400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003070400030a04000305
-0400030a040003c504000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003080400030a040003050400030a040003c6040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000300040003000400030004000300040003070400030a04000305040c03c5
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000308
-040c03d90400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003ff03ff03ff03ff039f02ff02ff02ff02ff028700ff00ff00ff00ff008606000001
-04ff04ff043f0601000104ff04ff043f0601000104ff04ff043f0601000104ff04ff043f
-0601000104ff04ff043f0601000104040104040401000403010204ff04ff042806010001
-04040100040f010004ff04ff0428060100010404010004060102040501000403010204ff
-04ff042106010001040401000408010004050100040201000402010004ff04ff04200601
-0001040401030405010004050100040201000402010004ff04ff04200601000104040100
-04080100040501000402010404ff04ff0420060100010404010004080100040501000402
-010004ff04ff042406010001040401000408010004050100040201000402010004ff04ff
-0420060100010404010004080100040501000403010204ff04ff04210601000104ff04ff
-043f0601000104ff04ff043f0601000104ff04ff043f0601000104ff04ff043f06010001
-04ff04ff043f0601000104ff04ff043f0601000106ff06ff0641000006ff06ff064204ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff0484061204ff04ff04300611
-0000040106ff06ff062c040106010506060005060001040106ff06ff062b000004010601
-0505000006000506000104010601040a0101045f0101047801010404010104ff04370001
-0401060105050000060105050001040106010409010004600100047c01000405010004ff
-043600010401060105040001060105050001040106010409010004060100040c01000404
-010004060100040a01020418010204030102040b0100042701020405010004020100040f
-0100040c01000404010004180104040301000405010004ff043600010401060105040001
-04000601050400010401060104090100041a010004140100041a010004050100040b0100
-04290100040901000423010004180100040701000405010004ff04360001040106010503
-000104010601050400010401060104090100040401020402010004000101040301020402
-0104040201020403010204050100040a0102040301020405010004050100040b01000403
-01000400010104020100040001010403010204030102040c010004030102040201000400
-0101040a0102040201000400010104030102040201040408010004000101040901000407
-01000405010004ff04360001040106010503000104020601050300010401060104090100
-040601000402010104010100040401000404010004060100040201000402010004040100
-040901000402010004010100040201000404010004050100040b01000403010104010100
-040101010401010004010100040201000401010004020100040b01000405010004020101
-04010100040b010004020101040101000404010004040100040a01010401010004080103
-040401000405010004ff0436000104010601050200010403060105030001040106010407
-010104070100040201000402010004040100040401000406010004060100040401000409
-010004090100040401000405010004090101040401000402010004010100040501000402
-010004010100040f0100040501000402010004020100040b010004020100040201000404
-010004040100040a010004020100040c0100040401010404010104ff0434000104010601
-050200010404060105020001040106010409010004060100040201000402010004040100
-0404010004060100040301030404010004090100040601030404010004050100040b0100
-040301000402010004010100040501000402010004010100040f01000405010004020100
-04020100040b010004020100040201000404010004040100040a010004020100040c0100
-040301000405010004ff0436000104010601050100010405060105020001040106010409
-010004060100040201000402010004040100040401000406010004020100040201000404
-01000409010004050100040201000404010004050100040b010004030100040201000401
-0100040501000402010004010100040f0100040501000402010004020100040b01000402
-0100040201000404010004040100040a0100040201000408010004020100040301000405
-010004ff0436000104010601050100010406060105010001040106010409010004060100
-040201000402010004040100040401000406010004020100040201000404010004090100
-040201000401010004020100040401000405010004040101040401000403010104010100
-0401010004050100040201000401010004020100040b0100040501000402010104010100
-040301010405010004020100040201000404010004040100040a01010401010004030101
-040201000402010004030100040501000405010104ff042e000104010601050000010407
-060105010001040106010409010004060100040201000402010004040100040501010404
-01000403010304040100040a010204030103040401000405010004040101040401000403
-010004000101040201000406010204030102040c01000405010004020100040001010404
-010104050100040201000402010004040100040501010408010004000101040401010403
-010204040100040501000405010104ff042e000104010601050000010408060105000001
-0401060104090100043301050420010004040100040301000419010504190100041d0105
-0401010004080100040b0100040501000406010004ff042e0001040106010001060b0500
-000104010601040a0101045601010406010104010100043701010426010004060101040a
-0101040401010405010104ff042f0001040106010000060d000104010601047001000460
-010004ff0454000104010601050e000104010601040a01010463010104ff04b500010401
-0601050e000104010601040901000467010004ff04b4000104010601050e000104010601
-04090100040c0100040c01000429010004040100040601000412010004ff04b400010401
-0601050e00010401060104090100040c0100040c0100042f0100041a010004ff04b40001
-04010601050e000104010601040901000404010204020104040201020402010404010100
-040201000402010204090100040201000402010204030102040201040402010204020100
-0400010104030101040001000403010004ff04b4000104010601050e0001040106010409
-010004030100040201000403010004030100040201000403010004030100040201000401
-010004020100040801000402010004010100040201000404010004040100040601000402
-01010401010004010100040101010403010004ff04b4000104010601050e000104010601
-0407010104040100040701000407010004030100040301000402010004010100040c0100
-040001000400010004050100040401000404010004060100040201000402010004010100
-040201000404010104ff04b2000104010601050e00010401060104090100040401020404
-010004040103040301000403010004020100040201020409010004000100040001000402
-0103040401000404010004060100040201000402010004010100040201000403010004ff
-04b4000104010601050e0001040106010409010004070100040301000403010004020100
-040301000403010004020100040501000408010004000100040001000401010004020100
-040401000404010004060100040201000402010004010100040201000403010004ff04b4
-000104010601050e00010401060104090100040301000402010004030100040301000402
-010004030100040301000401010104010100040201000403010104020100040001000400
-010004010100040201000404010004040100040601000402010004020100040101000401
-0101040301000405010104ff04ac000104010601050e0001040106010409010004040102
-040501010402010304040101040201010400010004020102040401010403010004000100
-040301030404010004050101040401000402010004020100040201010400010004030100
-0405010104ff04ac000104010601050e0001040106010409010004300100043001000403
-01000406010004ff04ac000104010601050e000104010601040a0101042c0101042d0100
-04020100040101010405010104ff04ad000104010601050e000104010601046a010204ff
-04ba000104010601050e000104010601040a01010486010104ff0492000104010601050e
-00010401060104090100048a010004ff0491000104010601050e00010401060104090100
-04660102041901010404010004ff0491000104010601050e000104010601040901000468
-010004180100040101000403010004ff0491000104010601050e00010401060104090100
-040301010400010004030102040301020403010204030102040301010400010004020102
-040a010104000100040101000402010004020102040201000402010004020102040c0100
-040301020402010004000101040a0100040101000403010004ff0491000104010601050e
-000104010601040901000403010004000100040001000401010004020100040101000402
-010004010100040201000401010004020100040101000401010104010100040201000408
-010004010101040101000402010004010100040201000401010004020100040101000402
-0100040b01000402010004020100040101010401010004090100040101000403010004ff
-0491000104010601050e0001040106010407010104040100040001000400010004010100
-040201000401010004050100040901000401010004020100040101000402010004080100
-040201000401010004020100040101000402010004010100040201000401010004020100
-040b01000402010004020100040101000402010004090100040101000404010104ff048f
-000104010601050e00010401060104090100040301000400010004000100040101040402
-010204030102040301030401010004020100040101040408010004020100040101000402
-010004010104040101000402010004010104040b01000402010404010100040201000409
-0100040101000403010004ff0491000104010601050e0001040106010409010004030100
-040001000400010004010100040901000405010004010100040201000401010004020100
-04010100040c010004020100040101000402010004010100040501000402010004010100
-040f010004020100040501000402010004090100040101000403010004ff049100010401
-0601050e0001040106010409010004030100040001000400010004010100040201000401
-010004020100040101000402010004010100040201000401010004010101040101000402
-010004080100040101010401010004010101040101000402010004010100040101010401
-010004020100040b01000402010004020100040101000402010004030101040301000401
-0100040301000405010104ff0489000104010601050e0001040106010409010004030100
-040001000400010004020102040301020403010204030103040201010400010004020102
-040a010104000100040201010400010004020102040301010400010004020102040c0100
-0403010204020100040201000403010104040101040401000405010104ff048900010401
-0601050e00010401060104090100042a01000407010504050100041c010504190100040b
-01000406010004ff0489000104010601050e000104010601040a01010424010004020100
-04130100043a0101040a01010405010104ff048a000104010601050e0001040106010432
-01020414010004ff04dc000104010601050e000104010601040a0101044e010104ff04ca
-000104010601050e0001040106010409010004430103040101030404010004ff04c90001
-04010601050e0001040106010409010004430100040701000404010004ff04c900010401
-0601050e0001040106010409010004430100040701000404010004ff04c9000104010601
-050e00010401060104090100040301010400010004030102040301020403010204030102
-04030101040001000402010204030102040a0100040701000404010004ff04c900010401
-0601050e0001040106010409010004030100040001000400010004010100040201000401
-010004020100040101000402010004010100040201000401010004010101040101000402
-0100040101000402010004090100040701000404010004ff04c9000104010601050e0001
-040106010407010104040100040001000400010004010100040201000401010004050100
-040901000401010004020100040101000402010004010100040d01000407010004050101
-04ff04c70001040106010010040106010409010004030100040001000400010004010104
-04020102040301020403010304010100040201000401010404020102040a010004070100
-0404010004ff04c9000104010601000d0600000104010601040901000403010004000100
-040001000401010004090100040501000401010004020100040101000402010004010100
-0409010004090100040701000404010004ff04c90001040106010001040a060100010401
-060104090100040301000400010004000100040101000402010004010100040201000401
-010004020100040101000402010004010100040101010401010004020100040101000402
-0100040301010403010004070100040401000405010104ff04c10001040106010001040a
-060100010401060104090100040301000400010004000100040201020403010204030102
-040301030402010104000100040201020403010204040101040301000407010004040100
-0405010104ff04c10001040106010001040a060100010401060104090100042a01000412
-01000403010304010103040401000406010004ff04c10001040106010001040a06010001
-04010601040a0101042401000402010004100101041101010405010104ff04c200010401
-06010001040a06010001040106010432010204ff04f20001040106010001040a06010001
-04010601040a01010478010104ff04a00001040106010001040a06010001040106010409
-0100042e01030405010004310100040601030404010004ff049f0001040106010001040a
-060100010401060104090100040401020405010004090100041401000407010004040101
-040b01000405010104030102040b010104020100040801000404010004ff049f00010401
-06010001040a060100010401060104090100040601000410010004140100040601000404
-010004010100040901010404010004010100040101000402010004090100040101000402
-0100040701000404010004ff049f0001040106010001040a060100010401060104090100
-04060100040301020402010004000101040201000401010004030102040a010004050100
-040501000401010004080100040001000404010004010100040501000409010004010100
-04030100040601000404010004ff049f0001040106010001040a06010001040106010409
-010004060100040501000402010104010100040101000400010004030100040201000409
-0100040401000406010004010100040a0100040401000401010004050100040901000401
-010004040100040501000404010004ff049f0001040106010001040a0601000104010601
-04070101040701000405010004020100040201000401010104040100040d010004030100
-0407010004010100040a0100040401000401010004030101040a01000401010004050100
-040401000405010104ff049d0001040106010001040a0601000104010601040901000406
-01000405010004020100040201000401010104050102040a010004040100040601000401
-0100040a0100040401000401010004050100040901000401010004040100040501000404
-010004ff049f0001040106010001040a0601000104010601040901000406010004050100
-040201000402010004010100040001000407010004090100040501000405010004010100
-040a01000404010004010100040501000409010004010100040301000406010004040100
-04ff049f0001040106010001040a06010001040106010409010004060100040501000402
-010004020100040101000401010004020100040201000403010104030100040601000404
-010004010100040301010404010004040100040101000401010004020100040301010403
-0100040101000402010004070100040401000405010104ff04970001040106010001040a
-060100010401060104090100040601000405010004020100040201000401010004020100
-040201020404010104030100040701000404010104040101040201040403010104030102
-04040101040401010402010004080100040401000405010104ff04970001040106010001
-040a06010001040106010409010004290100040301030405010004310100040601030404
-01000406010004ff04970001040106010001040a0601000104010601040a010104250101
-045001010405010104ff04980001040106010001040a060100010401060104ff04ff0428
-0001040106010001040a0601000104010601040a01010458010104ff0419010104a40001
-040106010001040a06010001040106010409010004510103040301000406010004040100
-04450100040a01030475010004310100040601030404010004a30001040106010001040a
-0601000104010601040901000407010004040100040b010004060100042d010004060100
-040601000403010204270100041b0100040a01000477010004040101040b010004050101
-04040100040c010104020100040801000404010004a30001040106010001040a06010001
-040106010409010004070100041101000435010004060100040501000403010004000100
-0400010004260100041a0100040b01000476010004040100040101000409010104040100
-0401010004020101040b01000401010004020100040701000404010004a3000104010601
-0001040a0601000104010601040901000404010104000100040201020403010204020104
-040201020403010204020100040001010403010204020100040001010402010004020100
-040901000406010004040100040401000400010004040102040201000400010104030102
-0403010204030102040201040402010204020100040001010403010204030100040c0100
-040401010400010004020100040201000402010204020100040201000401010004000101
-040901010400010004020100040201000402010204020100040001010402010004000101
-040a010204020100040201000401010004000101040a0100040501000401010004080100
-0400010004040100040101000401010004000100040b0100040101000403010004060100
-0404010004a30001040106010001040a0601000104010601040901000403010004010101
-040401000402010004020100040301000406010004020100040201000401010104010100
-0401010004020100040101010401010004010100040201000409010004060100040a0100
-040001000403010004020100040101010401010004010100040201000401010004020100
-040101000402010004030100040301000402010004010101040101000401010004020100
-041001000404010004000100040001000401010004020100040101000402010004010100
-040201000401010104010100040801000400010004000100040101000402010004010100
-040201000401010104010100040101010401010004080100040201000401010004020100
-0401010104010100040801000406010004010100040a0100040401000401010004030100
-040b01000401010004040100040501000404010004a30001040106010001040a06010001
-040106010407010104040100040201000404010004020100040701000406010004020100
-040201000401010004020100040501000401010004060100040101000409010004040101
-040c01020406010004010100040201000401010004050100040201000401010004070100
-040301000402010004010100040501000414010004040100040001000400010004020100
-040101000401010004050100040201000401010004020100040801000400010004000100
-040201000401010004050100040101000402010004010100040201000408010004050100
-040201000401010004020100040701000407010004010100040a01000404010004010100
-04030100040b01000401010004050100040401000405010104a10001040106010001040a
-060100010401060104090100040301000402010004040100040201000407010004060100
-040201000402010004010100040201000402010304010100040601000401010004090100
-04060100040c010004000100040201030401010004020100040101000405010404020102
-040401000403010004020100040101000406010204110100040401000400010004000100
-040201000401010004020102040201000402010004010100040201000408010004000100
-040001000402010004010100040201030401010004020100040101000402010004090102
-04020100040201000401010004020100040801000406010004010100040a010004040100
-0401010004030100040b01000401010004040100040501000404010004a3000104010601
-0001040a0601000104010601040901000403010004020100040401000402010004070100
-040601000402010004020100040101000402010004010100040201000401010004070100
-040001000409010004060100040c01000400010004010100040201000401010004020100
-040101000405010004090100040301000403010004020100040101000409010004100100
-040401000400010004000100040301000400010004050100040101000402010004010100
-040201000408010004000100040001000403010004000100040101000402010004010100
-040201000401010004020100040c01000401010004020100040101000402010004090100
-0405010004010100040a0100040401000401010004030100040b01000401010004030100
-040601000404010004a30001040106010001040a06010001040106010409010004030100
-040101010404010004020100040201000403010004060100040201000402010004010100
-0402010004010100040201000401010004070101040401010403010004060100040a0100
-040001000400010004010100040201000401010004020100040101000402010004010100
-040201000401010004020100040301000403010004020100040101000405010004020100
-040a01010403010004040100040001000400010004030101040201000402010004010100
-040101010401010104010100040301010402010004000100040001000403010104020100
-040201000401010104010100040101010401010004080100040201000401010004010101
-040101010401010004030101040401000404010004010100040301010404010004040100
-040101000403010004050101040301000401010004020100040701000404010004050101
-049b0001040106010001040a060100010401060104090100040401010400010004040100
-040301020405010104040100040301020402010004020100040201030401010004080100
-040401010403010004060100040b01020403010304010100040201000402010204030102
-0403010204050101040201020402010004060102040b0101040301000404010004000100
-040001000404010004030102040301010400010004010100040001010404010104020100
-0400010004000100040401000403010304010100040001010402010004000101040a0102
-040301010400010004010100040001010404010104050100040401010404010104020104
-0403010104020104040301010404010104020100040801000404010004050101049b0001
-040106010001040a06010001040106010409010004450100040501000403010304030100
-040c0100044c010004030103040b01000410010004080100040c01000409010004050100
-04040105040f0100040801000406010004310100040601030404010004060100049b0001
-040106010001040a0601000104010601040a0101044001000400010004040101040d0101
-0456010104110100040001000411010004060101040a010004000100040a010004050100
-041a0100040601010449010104050101049c0001040106010001040a0601000104010601
-044e0100048301000412010004140100040b010004050100041a010004f9000104010601
-0001040a0601000104010601046501010474010104ff04490001040106010001040a0601
-000104010601046401000406010004040100045a0100040b010004ff044b000104010601
-0001040a060100010401060104640100040601000403010204050100040c010004040100
-04060100040a0102041801020403010204050100040b010004220100040c010004040100
-040d01000404010004fe0001040106010001040a06010001040106010464010004050100
-0403010004000100040001000418010004140100041a01000405010004040100040c0100
-043601000413010004fe0001040106010001040a06010001040106010464010004040100
-040401000400010004040102040201000400010104030102040201040402010204030102
-04050100040a010204030102040501000405010004030100040d01000404010104000100
-040201020402010004000101040a01020402010004000101040301020402010404090102
-0402010404fc0001040106010001040a060100010401060104640100040a010004000100
-040601000402010104010100040401000404010004060100040201000402010004040100
-040901000402010004010100040201000404010004050100041201000403010004010101
-04010100040201000401010104010100040b010004020101040101000404010004040100
-040d01000404010004fe0001040106010001040a060100010401060104620101040c0102
-040501000402010004020100040401000404010004060100040601000404010004090100
-040901000404010004050100041001010404010004020100040101000402010004010100
-04020100040b010004020100040201000404010004040100040d01000404010004fe0001
-040106010001040a060100010401060104640100040c0100040001000404010004020100
-040201000404010004040100040601000403010304040100040901000406010304040100
-04050100041201000403010004020100040101040401010004020100040b010004020100
-040201000404010004040100040d01000404010004fe0001040106010001040a06010001
-0401060104640100040c0100040001000404010004020100040201000404010004040100
-040601000402010004020100040401000409010004050100040201000404010004050100
-041201000403010004020100040101000405010004020100040b01000402010004020100
-0404010004040100040d01000404010004fe0001040106010001040a0601000104010601
-04640100040a010004000100040001000404010004020100040201000404010004040100
-040601000402010004020100040401000409010004020100040101000402010004040100
-04050100040b010104040100040301000401010104010100040201000401010004020100
-040301010405010004020100040201000404010004040100040d01000404010004050101
-04f60001040106010001040a060100010401060104640100040b01020405010004020100
-040201000404010004050101040401000403010304040100040a01020403010304040100
-04050100040b010104040100040401010400010004020102040201000402010004030101
-0405010004020100040201000404010004050101040b0100040501010403010104f60001
-040106010001040a060100010401060104640100040c0100043301050427010004040100
-0407010004120100041d01050412010004f60001040106010001040a0601000104010601
-04650101046b0101040601010401010004020100041001010435010104f7000104010601
-0001040a060100010401060104e1010204ff04430001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104fd010304ff04260001
-040106010001040a060100010401060104fd010004ff04290001040106010001040a0601
-00010401060104fd010004ff04290001040106010001040a060100010401060104fd0100
-0405010104000100040201020402010004000101040a0102040301020402010004000101
-040201000402010004020102040201000400010104e10001040106010001040a06010001
-0401060104fd010004040100040101010401010004020100040101010401010004080100
-040201000401010004020100040101010401010004010100040201000401010004020100
-040101010401010004e00001040106010001040a060100010401060104fd010004040100
-040201000401010004020100040101000402010004080100040501000402010004010100
-040501000402010004010100040201000401010004e40001040106010001040a06010001
-0401060104fd010004040100040201000401010404010100040201000409010204020104
-040101000406010004000100040201040401010004e40001040106010001040a06010001
-0401060104fd01000404010004020100040101000405010004020100040c010004010100
-040501000406010004000100040201000405010004e40001040106010001040a06010001
-0401060104fd010004040100040101010401010004020100040101000402010004080100
-040201000401010004020100040101000407010004030100040201000401010004070101
-04da0001040106010001040a060100010401060104fd0100040501010400010004020102
-040201000402010004090102040301020402010004070100040401020402010004070101
-04da0001040106010001040a060100010401060104fd010304050100040e0105042e0100
-04da0001040106010001040a060100010401060104ff04030100040201000441010104db
-0001040106010001040a060100010401060104ff0404010204ff04200001040106010001
-040a060100010401060104ff04ff04280001040106010001040a060100010401060104ff
-040701000431010004ec0001040106010001040a060100010401060104ff040601000404
-0101040b01000405010104030102040b01010402010004eb0001040106010001040a0601
-00010401060104ff04050100040401000401010004090101040401000401010004010100
-0402010004090100040101000402010004ea0001040106010001040a0601000104010601
-04ff04040100040501000401010004080100040001000404010004010100040501000409
-0100040101000403010004e90001040106010001040a060100010401060104ff04030100
-0406010004010100040a0100040401000401010004050100040901000401010004040100
-04e80001040106010001040a060100010401060104ff040201000407010004010100040a
-0100040401000401010004030101040a0100040101000405010004e70001040106010001
-040a060100010401060104ff040301000406010004010100040a01000404010004010100
-0405010004090100040101000404010004e80001040106010001040a0601000104010601
-04ff040401000405010004010100040a0100040401000401010004050100040901000401
-01000403010004e90001040106010001040a060100010401060104ff0405010004040100
-040101000403010104040100040401000401010004010100040201000403010104030100
-04010100040201000406010104e10001040106010001040a060100010401060104ff0406
-010004040101040401010402010404030101040301020404010104040101040201000407
-010104e10001040106010001040a060100010401060104ff040701000431010004090100
-04e10001040106010001040a060100010401060104ff0443010104e20001040106010001
-040a060100010401060104ff04ff04280001040106010001040a060100010401060104ff
-04ff04280001040106010001040a060100010401060104ff040701000431010004ec0001
-040106010001040a060100010401060104ff0406010004040101040b0100040501010403
-0102040b01010402010004eb0001040106010001040a060100010401060104ff04050100
-040401000401010004090101040401000401010004010100040201000409010004010100
-0402010004ea0001040106010001040a060100010401060104ff04040100040501000401
-0100040801000400010004040100040101000405010004090100040101000403010004e9
-0001040106010001040a060100010401060104ff040301000406010004010100040a0100
-04040100040101000405010004090100040101000404010004e80001040106010001040a
-060100010401060104ff040201000407010004010100040a010004040100040101000403
-0101040a0100040101000405010004e70001040106010001040a060100010401060104ff
-040301000406010004010100040a01000404010004010100040501000409010004010100
-0404010004e80001040106010001040a060100010401060104ff04040100040501000401
-0100040a010004040100040101000405010004090100040101000403010004e900010401
-06010001040a060100010401060104ff0405010004040100040101000403010104040100
-040401000401010004010100040201000403010104030100040101000402010004060101
-04e10001040106010001040a060100010401060104ff0406010004040101040401010402
-010404030101040301020404010104040101040201000407010104e10001040106010001
-040a060100010401060104ff04070100043101000409010004e10001040106010001040a
-060100010401060104ff0443010104e20001040106010001040a060100010401060104ff
-04ff04280001040106010001040a060100010401060104ff040601010463010104b90001
-040106010001040a060100010401060104ff040501000467010004b80001040106010001
-040a060100010401060104ff0405010004040102041801020443010004b8000104010601
-0001040a060100010401060104ff0405010004060100041a01000443010004b800010401
-06010001040a060100010401060104ff0405010004060100040301020403010204030102
-040501000409010104000100040201000402010004020102040301020402010004000101
-04020100040201000402010204020100040001010404010004b80001040106010001040a
-060100010401060104ff0405010004060100040201000402010004010100040201000401
-010004020100040401000409010004000100040001000401010004020100040101000402
-010004010100040201000401010104010100040101000402010004010100040201000401
-0101040101000403010004b80001040106010001040a060100010401060104ff04030101
-040701000402010004020100040101000409010004040100040901000400010004000100
-040201000401010004010100040501000402010004010100040501000402010004010100
-04020100040101000408010104b60001040106010001040a060100010401060104ff0405
-010004060100040201000402010004010100040601030404010004090100040001000400
-010004020100040101000402010204020104040101000406010004000100040201040401
-01000407010004b80001040106010001040a060100010401060104ff0405010004060100
-040201000402010004010100040501000402010004040100040901000400010004000100
-040301000400010004050100040101000405010004060100040001000402010004050100
-0407010004b80001040106010001040a060100010401060104ff04050100040601000402
-010004020100040101000402010004010100040201000404010004040101040201000400
-010004000100040301010402010004020100040101000402010004010100040701000403
-01000402010004010100040701000405010104b00001040106010001040a060100010401
-060104ff0405010004060100040301020403010204030103040401000404010104020100
-040001000400010004040100040301020403010204020100040701000404010204020100
-040701000405010104b00001040106010001040a060100010401060104ff040501000429
-0100040c0100042e01000406010004b00001040106010001040a060100010401060104ff
-0406010104250101040a010004000100042d01010405010104b10001040106010001040a
-060100010401060104ff043c010004ea0001040106010001040a060100010401060104ff
-04ff04280001040106010001040a060100010401060104ff04ff04280001040106010001
-040a060100010401060104ff04ff04280001040106010001040a060100010401060104ff
-04ff04280001040106010001040a060100010401060104ff040301010400010004020100
-040201000402010204030102040201000400010104020100040201000402010204020100
-0400010104ef0001040106010001040a060100010401060104ff04030100040001000400
-010004010100040201000401010004020100040101000402010004010101040101000401
-0100040201000401010004020100040101010401010004ee0001040106010001040a0601
-00010401060104ff04030100040001000400010004020100040101000401010004050100
-0402010004010100040501000402010004010100040201000401010004f2000104010601
-0001040a060100010401060104ff04030100040001000400010004020100040101000402
-010204020104040101000406010004000100040201040401010004f20001040106010001
-040a060100010401060104ff040301000400010004000100040301000400010004050100
-04010100040501000406010004000100040201000405010004f20001040106010001040a
-060100010401060104ff0403010004000100040001000403010104020100040201000401
-01000402010004010100040701000403010004020100040101000407010104e800010401
-06010001040a060100010401060104ff0403010004000100040001000404010004030102
-04030102040201000407010004040102040201000407010104e80001040106010001040a
-060100010401060104ff040d0100042f010004e80001040106010001040a060100010401
-060104ff040a010004000100042e010104e90001040106010001040a0601000104010601
-04ff040b010004ff041b0001040106010001040a060100010401060104ff04ff04280001
-040106010001040a060100010401060104ff040401030401010304ff0419000104010601
-0001040a060100010401060104ff040401000407010004ff04190001040106010001040a
-060100010401060104ff040401000407010004ff04190001040106010001040a06010001
-0401060104ff040401000407010004ff04190001040106010001040a0601000104010601
-04ff040401000407010004ff04190001040106010001040a060100010401060104ff0404
-01000407010004ff04190001040106010001040a060100010401060104ff040401000407
-010004ff04190001040106010001040a060100010401060104ff040401000407010004ff
-04190001040106010001040a060100010401060104ff04040100040701000404010104ff
-04120001040106010001040a060100010401060104ff04040100040701000404010104ff
-04120001040106010001040a060100010401060104ff04040103040101030405010004ff
-04120001040106010001040a060100010401060104ff0412010104ff0413000104010601
-0001040a060100010401060104ff04ff04280001040106010001040a0601000104010601
-04ff0418010104040101040b010104f80001040106010001040a060100010401060104ff
-0404010304010103040201030404010004050100040301030404010004f7000104010601
-0001040a060100010401060104ff04040100040701000405010004040100040501000406
-01000404010004f70001040106010001040a060100010401060104ff0404010004070100
-040501000404010004050100040601000404010004f70001040106010001040a06010001
-0401060104ff0404010004070100040501000404010004050100040601000404010004f7
-0001040106010001040a060100010401060104ff04040100040701000405010004040100
-04050100040601000404010004f70001040106010001040a060100010401060104ff0404
-010004070100040501000405010104040101040401000405010104f50001040106010001
-040a060100010401060104ff040401000407010004050100040401000405010004060100
-0404010004f70001040106010001040a060100010401060104ff04040100040701000405
-01000404010004050100040601000404010004f70001040106010001040a060100010401
-060104ff0404010004070100040501000404010004050100040601000404010004050101
-04ef0001040106010001040a060100010401060104ff0404010004070100040501000404
-01000405010004060100040401000405010104ef0001040106010001040a060100010401
-060104ff0404010304010103040201030404010004050100040301030404010004060100
-04ef0001040106010001040a060100010401060104ff0418010104040101040b01010405
-010104f00001040106010001040a060100010401060104ff04ff04280001040106010001
-040a0601000104010601040a0101046a010104ff04ae0001040106010001040a06010001
-0401060104090100046e010004ff04ad0001040106010001040a06010001040106010409
-0100040501000430010004040100040d0101040901020412010004ff04ad000104010601
-0001040a0601000104010601040901000405010004360100040c0100040d010004120100
-04ff04ad0001040106010001040a06010001040106010409010004030104040101000400
-0101040301020402010004000101040a010204020100040201000402010204020104040a
-0100040401020405010004030102040301020404010004ff04ad0001040106010001040a
-060100010401060104090100040501000403010104010100040101000402010004010101
-04010100040801000402010004010100040201000404010004040100040a010404010100
-0402010004040100040201000402010004010100040201000403010004ff04ad00010401
-06010001040a060100010401060104070101040601000403010004090100040101000402
-0100040801000402010004020100040001000405010004040100040c0100040701000404
-01000402010004050100040201000404010104ff04ab0001040106010001040a06010001
-040106010409010004050100040301000406010304010100040201000408010404030100
-0406010004040100040c0100040401030404010004030102040201040403010004ff04ad
-0001040106010001040a0601000104010601040901000405010004030100040501000402
-010004010100040201000408010004060100040001000405010004040100040c01000403
-0100040201000404010004060100040101000407010004ff04ad0001040106010001040a
-060100010401060104090100040501000403010004050100040201000401010104010100
-040801000402010004010100040201000404010004040100040501010404010004030100
-040201000404010004020100040201000401010004020100040301000405010104ff04a5
-0001040106010001040a0601000104010601040901000406010104010100040601030401
-010004000101040a01020402010004020100040401000405010104030101040401000404
-0103040401000403010204030102040401000405010104ff04a50001040106010001040a
-060100010401060104090100041801000404010504200100042701000406010004ff04a5
-0001040106010001040a0601000104010601040a01010416010004290101042601010405
-010104ff04a60001040106010001040a06010001040106010423010004ff04ff04030001
-040106010001040a0601000104010601040a010104be010104ff045a0001040106010001
-040a06010001040106010409010004c2010004ff04590001040106010001040a06010001
-0401060104090100042d0100041701000402010204410100041701000402010204120100
-04ff04590001040106010001040a060100010401060104090100042d0100041701000404
-01000441010004170100040401000412010004ff04590001040106010001040a06010001
-040106010409010004040102040201000400010104020100040001010403010204020100
-040001010409010004000101040301020402010004000101040301010400010004040100
-040301020402010004000101040a01020402010004000101040201000400010104030102
-040201000400010104090100040001010403010204020100040001010403010104000100
-040401000403010204020100040001010404010004ff04590001040106010001040a0601
-000104010601040901000403010004020100040101010401010004010101040101000401
-010004020100040101010401010004080101040101000401010004020100040101010401
-010004010100040101010404010004020100040201000401010104010100040801000402
-010004010101040101000401010104010100040101000402010004010101040101000408
-010104010100040101000402010004010101040101000401010004010101040401000402
-01000402010004010101040101000403010004ff04590001040106010001040a06010001
-040106010407010104040100040201000401010004050100040501000402010004010100
-040c01000402010004050100040101000402010004010100040201000404010004020100
-0402010004010100040c0100040201000401010004050100040501000402010004010100
-040c01000402010004050100040101000402010004010100040201000404010004020100
-04020100040101000408010104ff04570001040106010001040a06010001040106010409
-0100040301040401010004050100040501000402010004010100040c0100040201000402
-010304010100040201000401010004020100040401000402010404010100040c01040401
-010004050100040501000402010004010100040c01000402010004020103040101000402
-010004010100040201000404010004020104040101000407010004ff0459000104010601
-0001040a0601000104010601040901000403010004050100040501000405010004020100
-04010100040c010004020100040101000402010004010100040201000401010004020100
-040401000402010004050100040c01000405010004050100040501000402010004010100
-040c01000402010004010100040201000401010004020100040101000402010004040100
-04020100040501000407010004ff04590001040106010001040a06010001040106010409
-010004030100040201000401010004050100040501000402010004010100040c01000402
-010004010100040201000401010004020100040101000401010104040100040201000402
-010004010100040701010402010004020100040101000405010004050100040201000401
-0100040c0100040201000401010004020100040101000402010004010100040101010404
-0100040201000402010004010100040701000405010104ff04510001040106010001040a
-0601000104010601040901000404010204020100040501000406010204020100040c0100
-040201000402010304010100040201000402010104000100040401000403010204020100
-040701010403010204020100040501000406010204020100040c01000402010004020103
-040101000402010004020101040001000404010004030102040201000407010004050101
-04ff04510001040106010001040a06010001040106010409010004250105043501000424
-0105043401000406010004ff04510001040106010001040a0601000104010601040a0101
-045d0101045e01010405010104ff04520001040106010001040a060100010401060104ff
-04ff04280001040106010001040a0601000104010601040a0101046a010104ff04ae0001
-040106010001040a060100010401060104090100046e010004ff04ad0001040106010001
-040a060100010401060104090100041401000413010004040100043501020404010004ff
-04ad0001040106010001040a060100010401060104090100042f01000437010004040100
-04ff04ad0001040106010001040a06010001040106010409010004030100040001010402
-010004000101040301020403010204020100040001010403010204020104040101000402
-010004080100040001010403010204020100040001010402010104000100040301020405
-01000404010004ff04ad0001040106010001040a06010001040106010409010004030101
-040101000401010104010100040401000402010004020100040101010401010004040100
-040401000403010004020100040801010401010004010100040201000401010104010100
-0401010004000100040001000401010004020100040401000404010004ff04ad00010401
-06010001040a060100010401060104070101040401000402010004010100040801000402
-010004020100040101000408010004040100040401000401010004080100040201000401
-0100040201000401010004050100040001000400010004050100040401000405010104ff
-04ab0001040106010001040a060100010401060104090100040301000402010004010100
-040801000402010004020100040101000408010004040100040401000401010004080100
-040201000401010004020100040101000405010004000100040001000402010304040100
-0404010004ff04ad0001040106010001040a060100010401060104090100040301000402
-010004010100040801000402010004020100040101000408010004040100040501000400
-010004080100040201000401010004020100040101000405010004000100040001000401
-010004020100040401000404010004ff04ad0001040106010001040a0601000104010601
-040901000403010104010100040101000408010004020100040201000401010004080100
-040401000405010104040101040201000402010004010100040201000401010004050100
-0400010004000100040101000402010004040100040401000405010104ff04a500010401
-06010001040a060100010401060104090100040301000400010104020100040801000403
-010204020100040801000405010104040100040401010402010004020100040201020402
-01000405010004000100040001000402010304040100040401000405010104ff04a50001
-040106010001040a060100010401060104090100040301000432010004050100042e0100
-0406010004ff04a50001040106010001040a0601000104010601040a010104010100042f
-01000400010004040101042d01010405010104ff04a60001040106010001040a06010001
-04010601040e01000430010004ff04e60001040106010001040a0601000104010601040a
-0101049b010104ff047d0001040106010001040a06010001040106010409010004620100
-043101000408010004ff047c0001040106010001040a060100010401060104090100042e
-0102041401000419010004040101040b01000405010104040101040b0101040201000407
-010004ff047c0001040106010001040a0601000104010601040901000430010004140100
-041801000404010004010100040901010404010004010100040201000401010004090100
-04010100040201000406010004ff047c0001040106010001040a06010001040106010409
-010004040101040001000401010004000101040301020402010004020100040101000400
-0101040c010004030102040301020403010104000100040201020402010004000101040a
-010004050100040101000408010004000100040401000401010004020100040101000409
-010004010100040301000405010004ff047c0001040106010001040a0601000104010601
-040901000403010004010101040101010401010004010100040201000401010004020100
-0401010104010100040b0100040201000402010004010100040201000401010004010101
-04010100040201000401010104010100040801000406010004010100040a010004040100
-0401010004020100040101000409010004010100040401000404010004ff047c00010401
-06010001040a060100010401060104070101040401000402010004010100040501000402
-010004010100040201000401010004020100040b01000402010004020100040501000401
-010004020100040101000402010004010100040b01000407010004010100040a01000404
-01000401010004020100040101000409010004010100040501000404010104ff047a0001
-040106010001040a06010001040106010409010004030100040201000401010004050100
-0402010004010100040201000401010004020100040b0100040201040402010304010100
-040201000401010404010100040c01000406010004010100040a01000404010004010100
-04020100040101000409010004010100040401000404010004ff047c0001040106010001
-040a06010001040106010409010004030100040201000401010004050100040201000401
-0100040201000401010004020100040b0100040201000405010004020100040101000402
-01000401010004050100040d01000405010004010100040a010004040100040101000402
-0100040101000409010004010100040301000405010004ff047c0001040106010001040a
-060100010401060104090100040301000401010104010100040501000402010004010100
-040101010401010104010100040b01000402010004020100040101000402010004010100
-040101010401010004020100040101000407010104040100040401000401010004030101
-040401000404010004010100040201000401010004030101040301000401010004020100
-040601000405010104ff04740001040106010001040a0601000104010601040901000404
-010104000100040101000406010204030101040001000401010004000101040c01000403
-010204030103040201010400010004020102040201000407010104050100040401010404
-0101040201040403010104040101040401010404010104020100040701000405010104ff
-04740001040106010001040a060100010401060104090100040701000416010004040105
-042e01000406010004310100040801000406010004ff04740001040106010001040a0601
-000104010601040a010104010100040201000416010004370101044201010405010104ff
-04750001040106010001040a0601000104010601040f01020417010004ff04fc00010401
-06010001040a0601000104010601040a0101045c010104ff04bc0001040106010001040a
-0601000104010601040901000460010004ff04bb0001040106010001040a060100010401
-06010409010004030100042b01000418010204030102040301020404010004ff04bb0001
-040106010001040a06010001040106010409010004030100044401000402010004010100
-0402010004010100040201000403010004ff04bb0001040106010001040a060100010401
-060104090100040301000400010104030102040301020402010004000101040a01020403
-01020402010404020102040d010004050100040501000403010004ff04bb000104010601
-0001040a0601000104010601040901000403010104010100040101000402010004010100
-040201000401010104010100040801000402010004040100040601000401010004020100
-040c010004050100040501000403010004ff04bb0001040106010001040a060100010401
-060104070101040401000402010004010100040201000405010004010100040201000408
-010004080100040501000402010004020100040b010004040101040401010405010104ff
-04b90001040106010001040a060100010401060104090100040301000402010004010104
-04020103040101000402010004090102040501000404010004030104040a010004070100
-040501000403010004ff04bb0001040106010001040a0601000104010601040901000403
-0100040201000401010004050100040201000401010004020100040c0100040401000403
-010004040100040d010004080100040501000403010004ff04bb0001040106010001040a
-060100010401060104090100040301000402010004010100040201000401010004020100
-040101010401010004080100040201000404010004020100040501000402010004030101
-0402010004050100040201000401010004020100040301000405010104ff04b300010401
-06010001040a060100010401060104090100040301000402010004020102040301030401
-010004000101040a01020405010004020104040201020404010104020104040201020403
-0102040401000405010104ff04b30001040106010001040a060100010401060104090100
-041801000404010504200100041901000406010004ff04b30001040106010001040a0601
-000104010601040a01010416010004290101041801010405010104ff04b4000104010601
-0001040a06010001040106010423010004ff04ff04030001040106010001040a06010001
-04010601040a0101045c010104ff04bc0001040106010001040a06010001040106010409
-01000460010004ff04bb0001040106010001040a060100010401060104090100040c0100
-041101000416010004190100040401020404010004ff04bb0001040106010001040a0601
-00010401060104090100040c0100041101000430010104030100040201000403010004ff
-04bb0001040106010001040a060100010401060104090100040401020402010404020102
-040301020402010004010100040a01020403010204020104040201020409010004000100
-040701000403010004ff04bb0001040106010001040a0601000104010601040901000403
-01000402010004030100040301000402010004010100040201000401010004000100040a
-01000402010004040100040601000401010004020100040a0100040701000403010004ff
-04bb0001040106010001040a060100010401060104070101040401000407010004070100
-0401010004050101040b010004080100040501000402010004020100040a010004060100
-0405010104ff04b90001040106010001040a060100010401060104090100040401020404
-0100040401030401010004050101040c0102040501000404010004030104040a01000405
-01000405010004ff04bb0001040106010001040a06010001040106010409010004070100
-040301000403010004020100040101000405010004000100040e01000404010004030100
-04040100040e0100040401000406010004ff04bb0001040106010001040a060100010401
-060104090100040301000402010004030100040301000402010004010100040201000401
-010004010100040901000402010004040100040201000405010004020100040301010404
-010004030100040701000405010104ff04b30001040106010001040a0601000104010601
-040901000404010204050101040201030402010204020100040201000409010204050100
-0402010404020102040401010402010404010104040301000405010104ff04b300010401
-06010001040a0601000104010601040901000425010504200100041201000406010004ff
-04b30001040106010001040a0601000104010601040a0101044801010411010104050101
-04ff04b40001040106010001040a060100010401060104ff04ff04280001040106010001
-040a0601000104010601040a0101045c010104ff04bc0001040106010001040a06010001
-04010601040901000460010004ff04bb0001040106010001040a06010001040106010409
-0100041501000411010004060100041f0102040401010404010004ff04bb000104010601
-0001040a0601000104010601040901000415010004110100042601000402010004020100
-040101000403010004ff04bb0001040106010001040a0601000104010601040901000403
-010004000101040301020403010104000100040101000402010004020102040201040402
-010204030102040201000400010104030102040d010004020100040101000403010004ff
-04bb0001040106010001040a060100010401060104090100040301010401010004010100
-040201000401010004010101040101000402010004010100040201000403010004060100
-040201000402010004010101040101000401010004020100040c01000402010004010100
-0403010004ff04bb0001040106010001040a060100010401060104070101040401000405
-010004020100040101000402010004010100040201000401010004070100040601000402
-010004020100040101000402010004010100040e010104030100040101000404010104ff
-04b90001040106010001040a060100010401060104090100040301000405010404010100
-040201000401010004020100040101000407010004060100040201000402010004010100
-0402010004020102040d010004020100040101000403010004ff04bb0001040106010001
-040a06010001040106010409010004030100040501000405010004020100040101000402
-01000401010004070100040601000402010004020100040101000402010004050100040c
-010004020100040101000403010004ff04bb0001040106010001040a0601000104010601
-040901000403010004050100040201000401010004010101040101000401010104010100
-040201000403010004060100040201000402010004010100040201000401010004020100
-0403010104020100040201000402010004010100040301000405010104ff04b300010401
-06010001040a060100010401060104090100040301000406010204030101040001000402
-010104000100040201020405010104040100040301020402010004020100040201020404
-01010403010204040101040401000405010104ff04b30001040106010001040a06010001
-0401060104090100044c0100041201000406010004ff04b30001040106010001040a0601
-000104010601040a010104480101041101010405010104ff04b40001040106010001040a
-060100010401060104ff04ff04280001040106010001040a0601000104010601040a0101
-04890101049401010404010104f10001040106010001040a060100010401060104090100
-048a010004980100040501000403010304e80001040106010001040a0601000104010601
-040901000418010004300102040301020412010004060100041901000406010104090102
-040301020436010104030100041901020402010404010104040201020402010404030100
-040501000406010004e80001040106010001040a06010001040106010409010004180100
-0432010004050100041201000421010004050100040d0100040501000435010004050100
-041801000402010004010100040501000405010004020100040101000407010004050100
-0406010004e80001040106010001040a0601000104010601040901000404010104000100
-040201020402010004000101040201000400010104030102040301010400010004020102
-040a01020403010204050100040501000403010204030102040201040402010204030102
-0402010004000101040b0100040501000403010004020100040401000405010004030102
-040201000402010004020102040301020402010004000101040a01020404010004030104
-040201020402010004000101040901000405010004050100040901000401010004070100
-040501000406010004e80001040106010001040a06010001040106010409010004030100
-040101010401010004020100040101010401010004010101040101000401010004020100
-040101000401010104010100040201000408010004020100040101000402010004040100
-040501000402010004020100040101000402010004030100040601000402010004020100
-0401010104010100040a0100040301040401010004020100040401000405010004020100
-040201000401010004020100040101000402010004010100040201000401010104010100
-040801000402010004010104040301000403010004020100040101010401010004080100
-0405010304020103040601000401010304040100040501000406010004e8000104010601
-0001040a0601000104010601040701010404010004020100040501000401010004050100
-040201000405010004010100040201000401010004020100040801000405010004020100
-040401000405010004020100040201000401010004070100040601000402010004020100
-040101000402010004080101040601000403010004020100040401000405010004020100
-040501000400010004000100040101000402010004010100040201000401010004020100
-040c01000403010004050100040301000402010004010100040c01030406010004050100
-040301010406010004040101040401010404010004e80001040106010001040a06010001
-040106010409010004030100040201000402010304010100040501000402010004020103
-040101000402010004010104040801000405010004020100040401000405010004020104
-04010100040701000406010004020100040201000401010004020100040a010004050100
-040301000402010004040100040501000403010204020100040001000400010004010104
-0401010404010100040201000409010304030100040501000403010404010100040c0100
-040201000405010004050100040501000405010004030100040501000406010004e80001
-040106010001040a06010001040106010409010004030100040201000401010004020100
-0401010004050100040201000401010004020100040101000402010004010100040c0100
-040501000402010004040100040501000402010004050100040701000406010004020100
-040201000401010004020100040a01000405010004030100040201000404010004050100
-040601000401010004000100040001000401010004050100040501000402010004080100
-0402010004030100040501000403010004050100040c0100040201000401010004020100
-040101000402010004050100040101000402010004030100040501000406010004e80001
-040106010001040a06010001040106010409010004030100040101010401010004020100
-040101000405010104010100040101000402010004010100040101010401010004020100
-040801000402010004010100040201000404010004050100040201000402010004010100
-040201000403010004060100040201000402010004010100040201000403010104040100
-040501000403010004010101040401000405010004020100040201000401010004000100
-040001000401010004020100040101000402010004010101040101000408010004020100
-040301000405010004030100040201000401010004070101040201000402010004010100
-040201000401010004020100040101000402010004010100040201000403010004050100
-0406010004e80001040106010001040a0601000104010601040901000404010104000100
-0402010304010100040501000400010104030103040201010400010004020102040a0102
-040301020405010004050100040301020403010204050101040401000403010204020100
-040201000403010104040100040501000404010104000100040401000405010004030102
-040301000400010004030102040301020402010004000101040a01030403010004060101
-040201020402010004070101040301020403010204030102040301020403010204040100
-040501000406010004e80001040106010001040a06010001040106010409010004070100
-0421010004070105044a010004040100043b010004040105042701000427010004050100
-0403010304e80001040106010001040a0601000104010601040a01010401010004020100
-041d01000402010004560101040601010439010004300101042601010404010104f10001
-040106010001040a0601000104010601040f0102041f0102049c010004ff045400010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001040a060100010401
-060104ff04ff04280001040106010001040a060100010401060104ff04ff042800010401
-06010001040a060100010401060104ff04ff04280001040106010001060c000104010601
-04ff04ff04280001040106010000060d00010401060104ff04ff0428000104010601050e
-00010401060104ff04ff042800010401060100100401060104ff04ff0428000104010601
-0500000c060000010401060104ff04ff0428000104010601050000010408060105000001
-0401060104ff04ff04280001040106010501000104070601050000010401060104ff04ff
-04280001040106010501000104060601050100010401060104ff04ff0428000104010601
-0502000104050601050100010401060104ff04ff04280001040106010502000104040601
-050200010401060104ff04ff042800010401060105030001040306010502000104010601
-04ff04ff04280001040106010503000104020601050300010401060104ff04ff04280001
-040106010504000104010601050300010401060104ff04ff042800010401060105040001
-04000601050400010401060104ff04ff0428000104010601050500000602050400010401
-060104ff04ff0428000104010601050500000601050500010401060100ff00ff002a0401
-060105060601050500010401060000ff00ff002b04010601050606000506000104ff04ff
-04300601001004ff04ff04300600001104ff04ff04ff04ff04ff04ff04ff04ff04ff04ff
-04ff04ff04ff0498010204ff04ff044001000401010004ff04ff043f0100040201000402
-010204020100040001010403010204ff04ff042a01000402010004010100040201000401
-010104010100040101000402010004ff04ff042901000402010004010100040201000401
-010004020100040101000402010004ff04ff042901000402010004010100040201000401
-0100040201000401010404ff04ff04290100040201000401010004020100040101000402
-01000401010004ff04ff042d010004010100040201000402010004010100040201000401
-01000402010004ff04ff042901020404010204020100040201000402010204ff04ff04ff
-04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04ff04c1
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 73 377 347
-%%EOF
diff --git a/lib/appmon/doc/src/ref_man.xml b/lib/appmon/doc/src/ref_man.xml
deleted file mode 100644
index b54df2ee9b..0000000000
--- a/lib/appmon/doc/src/ref_man.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE application SYSTEM "application.dtd">
-
-<application xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Appmon Reference Manual</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <description>
- <p>The Application Monitor, <em>Appmon</em>, is a graphical utility used
- to supervise applications executing either locally or on remote nodes.
- The process tree of an application can furthermore be monitored.</p>
- </description>
- <xi:include href="appmon.xml"/>
-</application>
-
diff --git a/lib/appmon/doc/src/warning.gif b/lib/appmon/doc/src/warning.gif
deleted file mode 100644
index 96af52360e..0000000000
--- a/lib/appmon/doc/src/warning.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/ebin/.gitignore b/lib/appmon/ebin/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/appmon/ebin/.gitignore
+++ /dev/null
diff --git a/lib/appmon/info b/lib/appmon/info
deleted file mode 100644
index c33a50d106..0000000000
--- a/lib/appmon/info
+++ /dev/null
@@ -1,5 +0,0 @@
-group: tools
-short: A utility used to supervise Applications executing on several
-short: Erlang nodes
-
-
diff --git a/lib/appmon/priv/Makefile b/lib/appmon/priv/Makefile
deleted file mode 100644
index 356fe9b842..0000000000
--- a/lib/appmon/priv/Makefile
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-include ../vsn.mk
-VSN = $(APPMON_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/appmon-$(VSN)
-
-#
-# Macros
-#
-HELP_FILES = \
- appmon_help.txt
-
-TOOLBAR_FILES = \
- appmon.tool \
- appmon.gif \
- start_info.html \
- main_frame.html \
- info_frames.html \
- blank.html
-
-#
-# Rules
-#
-
-debug opt:
-
-docs:
-
-clean:
-
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/priv"
- $(INSTALL_DATA) $(HELP_FILES) $(TOOLBAR_FILES) "$(RELSYSDIR)/priv"
-
-release_docs_spec:
-
-FORCE:
diff --git a/lib/appmon/priv/appmon.gif b/lib/appmon/priv/appmon.gif
deleted file mode 100644
index 583fcb8311..0000000000
--- a/lib/appmon/priv/appmon.gif
+++ /dev/null
Binary files differ
diff --git a/lib/appmon/priv/appmon.tool b/lib/appmon/priv/appmon.tool
deleted file mode 100644
index 93a469c6a4..0000000000
--- a/lib/appmon/priv/appmon.tool
+++ /dev/null
@@ -1,24 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{version,"1.2"}.
-[{config_func,{appmon_web,configData,[]}},
-{tool,"Appmon"},
- {start,{appmon,start,[]}},
- {icon,"appmon.gif"},
- {message,"Application Monitor"},
- {html,"../doc/html/index.html"}].
diff --git a/lib/appmon/priv/appmon_help.txt b/lib/appmon/priv/appmon_help.txt
deleted file mode 100644
index f1685be4d8..0000000000
--- a/lib/appmon/priv/appmon_help.txt
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
- Help for the application monitor system
- ---------------------------------------
-
-
-
-
-
- The monitor system has two types of windows, the node window
- which opens when appmon:start() is evaluated, and the
- application window which opens when an application in the node
- window is clicked on.
-
- All nodes that are known to appmon is shown in the node
- window, normally this is all Erlang nodes visible with the
- nodes() command.
-
-
-The Node window
----------------
-
- The node window monitors nodes. At the top there is a menubar
- and below that, each known node is shown separated with a thin
- line from the others. A node is represented by its name as
- root of its application tree. The node name pictures the
- application controller on that node. The name itself is a menu
- where operations on the node can be performed (rebooting it
- for instance). To the far left is a load meter (like those on
- a tape deck) which measures the current load at the
- node. Below the node name (the application controller) is a
- tree with applications, clicking on these applications starts
- the application monitor.
-
-
- The top window menubar
- ----------------------
-
- File:Quit - Stop the monitor.
-
- Options:
- Load: time - Load is calculated (roughly) as processor time.
- Load: queue - Load is calculated as the length of the ready
- queue.
- Load: prog - A progressive scale is used for load values.
- Load: linear - A linear scale is used for load values.
-
- Help - Prints this message.
-
-
- The application controller menu
- -------------------------------
- Reboot - Reboot the node
- Restart - Restart the node
- Stop - Stop the node
-
-
- The load meter
- --------------
-
- Load can be measured as processor time / elapsed time or as
- the length of the runtime queue, depending on the setting in
- the Options menu.
-
-
-The Application window
-----------------------
-
- The application window monitors an application. It will
- automaticly update the window every other second or so if
- there are any changes in the process tree. At the top there is
- a menubar followed by a toolbar and then the application
- tree. Application trees come in two flavours: supervision
- view, where a strict supervision tree is shown, and process
- view, where all linked processes in the application is shown.
-
-
- The application window menubar
- ------------------------------
-
- File:Quit - Quit the application window.
-
- Options:Refresh - Update process information and refresh
- screen.
-
- Options:Sup. view
- - Show strict supervision tree only.
-
- Options:Proc. view
- - Show all linked processes.
-
- Help - Prints this message.
-
-
- The application window toolbar
- ------------------------------
-
- The application toolbar controls the actions of the mouse
- pointer. Clicking on a process in the application window have
- different meaning depending on which tool is selected. The
- procedure is to first press a button (T for trace for example)
- and then click on the process that should be traced.
-
- Info - Process information is printed in the shell. This mode
- is default and automaticly returned to after a mouse click.
-
- Send - Send a message to the clicked process. A window will
- pop up where the message can be written (and you can also
- change the destination pid). Double clicking on this button
- pops up a window where pid and message can be filled in.
-
- Trace - Toggle trace on/off on the process. Note that not all
- processes respond to the sys:trace call.
-
- Kill - Send a non-trappable exit signal to the process.
-
-
-Technical Detail
-----------------
-
- Files and distribution
- ----------------------
-
- Appmon is a distributed program but all graphics is handled on
- one node (the one it is started on) so GS need only to be
- loaded on that single node. All real monitoring is done in a
- single module (appmon_info) being run on each node which acts
- as an information centre. The various windows (node and
- application) then subscribe for information.
-
- In summary: only the appmon_info module must be accessible by
- the clients, the rest of the appmon files are only needed at
- the server.
-
- Trouble shooting
- ----------------
-
- Q. Why doesn't all my nodes show up in the node window?
-
- A 1. Are the nodes visible with the nodes() command in the
- shell? If not you must do net:ping(NodeName) to add nodes to
- the Erlang distribution.
-
- A 2. Is the appmin_info module loadable at the missing
- node(s)?
-
- Q. Why doesn't the application window show my application
- supervision structure?
-
- A. Does your application have a real application master? It is
- absolutely necessary that your top process behaves as a
- supervisor should (a program is not supervised just because it
- is started with application:start).
diff --git a/lib/appmon/priv/blank.html b/lib/appmon/priv/blank.html
deleted file mode 100644
index 44e86908a0..0000000000
--- a/lib/appmon/priv/blank.html
+++ /dev/null
@@ -1,6 +0,0 @@
-<HTML>
-<HEAD></HEAD>
-<BODY BGCOLOR="#FFFFFF">
-&nbsp;
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/lib/appmon/priv/info_frames.html b/lib/appmon/priv/info_frames.html
deleted file mode 100644
index 9320364883..0000000000
--- a/lib/appmon/priv/info_frames.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>WebAppmon </TITLE>
-</HEAD>
-<FRAMESET ROWS="85%,15%" BORDER="0">
-<FRAME NAME="main" SRC="./start_info.html">
-<FRAME NAME="proc_data" SRC="./blank.html">
-</FRAMESET>
-</HTML> \ No newline at end of file
diff --git a/lib/appmon/priv/main_frame.html b/lib/appmon/priv/main_frame.html
deleted file mode 100644
index 57e540a2c1..0000000000
--- a/lib/appmon/priv/main_frame.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<HTML>
-<HEAD>
-<TITLE>WebAppmon </TITLE>
-</HEAD>
-<FRAMESET COLS="15%,85%" >
- <FRAME NAME="left" SRC="../../erl/appmon_web/node_info">
- <FRAME NAME="base_frames" SRC="./info_frames.html">
-</FRAMESET>
-</HTML> \ No newline at end of file
diff --git a/lib/appmon/priv/start_info.html b/lib/appmon/priv/start_info.html
deleted file mode 100644
index 580319beb1..0000000000
--- a/lib/appmon/priv/start_info.html
+++ /dev/null
@@ -1,31 +0,0 @@
-<HTML>
-<HEAD>
-</HEAD>
-<BODY BGCOLOR="#FFFFFF">
-<TABLE WIDTH=100% HEIGHT=100%>
-<TR VALIGN="middle">
-<TD ALIGN="center">
-
-<TABLE WIDTH="60%">
-<TR>
-<TD ALIGN="center">
-<FONT SIZE=6>Welcome to the Web based User Interface to Appmon
-</FONT></TD>
-</TR>
-
-<TR>
-<TD><BR><BR><BR><BR>
-</TD>
-</TR>
-
-<TR>
-<TD ALIGN="center">&nbsp;
-</TD>
-</TR>
-</TABLE>
-
-</TD>
-</TR>
-</TABLE>
-</BODY>
-</HTML> \ No newline at end of file
diff --git a/lib/appmon/src/Makefile b/lib/appmon/src/Makefile
deleted file mode 100644
index c1620bc37a..0000000000
--- a/lib/appmon/src/Makefile
+++ /dev/null
@@ -1,103 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2013. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../vsn.mk
-VSN=$(APPMON_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/appmon-$(VSN)
-
-# ----------------------------------------------------
-# Target Specs
-# ----------------------------------------------------
-
-MODULES= \
- appmon \
- appmon_a \
- appmon_dg \
- appmon_place \
- appmon_txt \
- appmon_lb \
- process_info \
- appmon_web
-
-# appmon_info \ Moved to runtime tools where it belongs
-
-
-HRL_FILES= appmon_dg.hrl
-
-ERL_FILES= $(MODULES:%=%.erl)
-
-TARGET_FILES= $(MODULES:%=../ebin/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
-
-APP_FILE= appmon.app
-APPUP_FILE= appmon.appup
-
-APP_SRC= $(APP_FILE).src
-APPUP_SRC= $(APPUP_FILE).src
-
-APP_TARGET= ../ebin/$(APP_FILE)
-APPUP_TARGET= ../ebin/$(APPUP_FILE)
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-
-debug opt: $(TARGET_FILES)
-
-clean:
- rm -f $(TARGET_FILES)
- rm -f core
-
-docs:
-
-# ----------------------------------------------------
-# Special Build Targets
-# ----------------------------------------------------
-
-$(APP_TARGET): $(APP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src"
- $(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
-
-release_docs_spec:
-
diff --git a/lib/appmon/src/appmon.app.src b/lib/appmon/src/appmon.app.src
deleted file mode 100644
index aa6a08772e..0000000000
--- a/lib/appmon/src/appmon.app.src
+++ /dev/null
@@ -1,24 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{application, appmon,
- [{description, "DEVTOOLS CXC 138 16"},
- {vsn, "%VSN%"},
- {modules, [appmon, appmon_a, appmon_dg, %% appmon_info, moved to runtime tools
- appmon_lb, appmon_place, appmon_txt,process_info,appmon_web]},
- {registered,[appmon, appmon_info, appmon_txt,webappmon_server,proc_info]},
- {applications, [kernel, stdlib]}]}.
diff --git a/lib/appmon/src/appmon.appup.src b/lib/appmon/src/appmon.appup.src
deleted file mode 100644
index 0d918b6081..0000000000
--- a/lib/appmon/src/appmon.appup.src
+++ /dev/null
@@ -1,18 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{"%VSN%",[],[]}.
diff --git a/lib/appmon/src/appmon.erl b/lib/appmon/src/appmon.erl
deleted file mode 100644
index ba98a24400..0000000000
--- a/lib/appmon/src/appmon.erl
+++ /dev/null
@@ -1,1081 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(appmon).
--behaviour(gen_server).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
-
-%%%---------------------------------------------------------------------
-%%% Appmon main module.
-%%% Creates the main window and receives load and application
-%%% information from all connected nodes.
-%%%---------------------------------------------------------------------
-
-%% External exports
--export([start/0, stop/0]).
-
-%% gen_server callbacks
--export([init/1, handle_cast/2, handle_info/2, terminate/2]).
--export([handle_call/3, code_change/3]). % not used
-
-%% Canvas button data
--record(canvasbutton, {text, ul, ll, rect, x, y, w, h}).
-
-%% Options - all the fields are GS radio buttons
--record(options, {single, many, time, queue, prog, linear}).
-
-%% Main window data
--record(win, {name, % atom() Monitored node
- window, % gsobj()
- wwindow, % int() Window width
- hwindow, % int() Window height
- options, % #options{}
- canvas, % gsobj()
- wcanvas, % int() Canvas width
- hcanvas, % int() Canvas height
- l1, l2, % gsobj() Canvas lines
- leds, % [gsobj()] Load meter
- nodelabel, % {gsobj(),gsobj()}
- appobjs=[], % [gsobj()] Buttons etc.
- nodemenu}). % gsobj() Node menu
-
-%% Node data
--record(mnode, {name, % atom() Node name
- status, % alive | dead
- pid, % pid()
- apps, % [{Pid,App,Descr}]
- load}). % {Old, New}
-
-%% Internal state data
--record(state, {gs, % pid()
- wins=[], % [#win()] GUIs
- window_mode, % single | many
- load_mode1, % time | queue
- load_mode2, % prog | linear
- lbpid, % pid()
- mnodes=[]}). % [#mnode{}]
-
-%%%---------------------------------------------------------------------
-%%% External exports
-%%%---------------------------------------------------------------------
-
-start() ->
- gen_server:start({local, appmon}, ?MODULE, [], []).
-
-stop() ->
- gen_server:cast(appmon, stop).
-
-
-%%%---------------------------------------------------------------------
-%%% gen_server callbacks
-%%%---------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Func: init/1
-%% Returns: {ok, State} |
-%% {ok, State, Timeout} |
-%% ignore |
-%% {stop, Reason}
-%%----------------------------------------------------------------------
-init([]) ->
- process_flag(trap_exit, true),
-
- %% Subscribe to {nodeup,Node} and {nodedown,Node} messages
- net_kernel:monitor_nodes(true),
-
- LbPid = appmon_lb:start(self ()),
-
- %% Check which remote nodes have appmon code available (OTP-4887)
- NodesOk = lists:filter(fun(Node) -> check_node(Node) end, nodes()),
- Nodes = [node()|NodesOk],
-
- %% Start monitoring the existing nodes
- MNodes = mk_mnodes(Nodes, LbPid),
-
- %% Draw the main window
- GS = gs:start([{kernel,true}]),
- GUI = draw_win(GS, node()),
-
- %% Update the Nodes menu with all known nodes
- lists:foreach(fun(Node) ->
- display_addnode(GUI, Node)
- end,
- Nodes),
-
- %% Mark the default options as selected in the Options menu
- display_setopt(GUI, single),
- display_setopt(GUI, time),
- display_setopt(GUI, prog),
-
- {ok, #state{gs=GS, wins=[GUI],
- window_mode=single, load_mode1=time, load_mode2=prog,
- lbpid=LbPid, mnodes=MNodes}}.
-
-check_node(Node) ->
- case rpc:call(Node, code, which, [appmon]) of
- File when is_list(File) ->
- true;
- _ -> % non_existing (| cover_compiled)
- false
- end.
-
-%%----------------------------------------------------------------------
-%% Func: handle_call/3
-%% Returns: {reply, Reply, State} |
-%% {reply, Reply, State, Timeout} |
-%% {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, Reply, State} | (terminate/2 is called)
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-handle_call(norequest, _From, State) ->
- {reply, null, State}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_cast/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-handle_cast(stop, State) ->
- {stop, normal, State}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_info/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-%% Load information from a node
-handle_info({delivery, _Serv, load, Node, Load}, State) ->
-
- %% Update node information
- MNode = get_mnode(Node, State#state.mnodes),
- MNode1 = MNode#mnode{load=Load},
- MNodes = replace_mnode(Node, MNode1, State#state.mnodes),
-
- %% If Node is currently displayed, update graphics
- case get_win(Node, State#state.wins) of
- {ok, GUI} ->
- display_load(GUI, Load);
- false ->
- ignore
- end,
-
- {noreply, State#state{mnodes=MNodes}};
-
-%% Application information from a node
-handle_info({delivery, _Serv, app_ctrl, Node, Apps}, State) ->
-
- %% Update node information
- MNode = get_mnode(Node, State#state.mnodes),
- MNode1 = MNode#mnode{apps=Apps},
- MNodes = replace_mnode(Node, MNode1, State#state.mnodes),
-
- %% If Node is currently displayed, update graphics
- Wins = case get_win(Node, State#state.wins) of
- {ok, GUI} ->
- draw_clear(GUI),
- GUI1 = draw_apps(GUI, Apps),
- replace_win(Node, GUI1, State#state.wins);
- false ->
- State#state.wins
- end,
-
- appmon_lb:add_apps (State#state.lbpid, Apps, Node),
- {noreply, State#state{wins=Wins, mnodes=MNodes}};
-
-handle_info({nodeup, Node}, State) ->
-
- %% First, make sure appmon code is available at remode node,
- %% or the node should be ignored (OTP-3591)
- case check_node(Node) of
- true ->
-
- %% If this is a previously unknown node, update window's
- %% 'Nodes' menu
- case get_mnode(Node, State#state.mnodes) of
- false ->
- display_addnode(State#state.wins, Node);
- _OldMnode ->
- ignore
- end,
-
- %% Update node information (=> state is automatically
- %% changed to 'alive')
- MNode = mk_mnode(Node, State#state.lbpid),
- MNodes = replace_mnode(Node, MNode, State#state.mnodes),
-
- %% If Node is currently displayed, update graphics
- case get_win(Node, State#state.wins) of
- {ok, GUI} ->
- display_nodeup(GUI, Node);
- false ->
- ignore
- end,
-
- appmon_lb:update_status(State#state.lbpid, Node, alive),
- {noreply, State#state{mnodes=MNodes}};
-
- false ->
- {noreply, State}
- end;
-
-handle_info({nodedown, Node}, State) ->
-
- %% If this is a previously unknown node, ignore the message.
- %% (The situation occurs when failing to connect to another node).
- %% Otherwise, update the node information.
- case get_mnode(Node, State#state.mnodes) of
- false ->
- {noreply, State};
- MNode ->
- MNode1 = MNode#mnode{status=dead},
- MNodes = replace_mnode(Node, MNode1, State#state.mnodes),
-
- %% If Node is currently displayed, update graphics
- Wins = case get_win(Node, State#state.wins) of
- {ok, GUI} ->
- display_nodedown(GUI),
- GUI1 = draw_clear(GUI),
- replace_win(Node, GUI1, State#state.wins);
- false ->
- State#state.wins
- end,
-
- appmon_lb:remove_node(State#state.lbpid, Node),
- {noreply, State#state{wins=Wins, mnodes=MNodes}}
- end;
-
-%% Application 'button' events
-handle_info({gs, _Obj, buttonpress, Data, _Arg}, State) ->
- {canvasbutton, CBtn, _App} = Data,
- press(CBtn),
- {noreply, State};
-handle_info({gs, _Obj, buttonrelease, Data, [_,X,Y|_]}, State) ->
- {canvasbutton, CBtn, {application, App, Node}} = Data,
- release(CBtn),
-
- %% Check that mouse button was released over the button!
- L = CBtn#canvasbutton.x, R = L + CBtn#canvasbutton.w,
- T = CBtn#canvasbutton.y, B = T + CBtn#canvasbutton.h,
- if
- X>L, X<R, Y>T, Y<B ->
- MNode = get_mnode(Node, State#state.mnodes),
- {value, {Pid, _App, _Descr}} =
- lists:keysearch(App, 2, MNode#mnode.apps),
- appmon_a:start(Node, App, Pid);
- true ->
- ignore
- end,
- {noreply, State};
-
-handle_info({gs, _Button, click, Data, _Arg}, State) ->
- ThisNode = node(),
- case Data of
-
- %% File menu item
- listbox ->
- appmon_lb:open_win(State#state.lbpid,
- parse_nodes(State#state.mnodes)),
- {noreply, State};
- {close, WinObj} ->
- {ok, GUI} = get_win2(WinObj, State#state.wins),
- gs:destroy(WinObj),
-
- %% Terminate if this was the only open window
- case remove_win(GUI#win.name, State#state.wins) of
- [] ->
- {stop, normal, State};
- Wins ->
- {noreply, State#state{wins=Wins}}
- end;
- exit ->
- {stop, normal, State};
-
- %% Actions menu item
- {action, Action, WinObj} ->
- {ok, GUI} = get_win2(WinObj, State#state.wins),
- Node = GUI#win.name,
-
- if
- Node==ThisNode ->
- case Action of
- ping ->
- %% Ignore - makes no sense to ping yourself
- ignore;
- _ -> % reboot | restart | stop
- apply(init, Action, [])
- end;
-
- Node/=ThisNode ->
- case Action of
- ping ->
- net_adm:ping(Node);
- _ -> % reboot | restart | stop
- rpc:cast(Node, init, Action, [])
- end
- end,
- {noreply, State};
-
- %% Options menu item
- {window_mode, Mode} ->
-
- %% Update windows so they all show the same options
- lists:foreach(fun(GUI) ->
- display_setopt(GUI, Mode)
- end,
- State#state.wins),
- {noreply, State#state{window_mode=Mode}};
-
- {option, Tag, Option} ->
-
- %% Update windows so they all show the same options
- lists:foreach(fun(GUI) ->
- display_setopt(GUI, Tag)
- end,
- State#state.wins),
-
- %% Update all appmon_info processes about which kind of
- %% load data is desired
- lists:foreach(fun(MNode) ->
- appmon_info:load(MNode#mnode.pid,
- MNode#mnode.name,
- true,
- Option)
- end,
- State#state.mnodes),
-
- if
- Tag==time; Tag==queue ->
- {noreply, State#state{load_mode1=Tag}};
- Tag==prog; Tag==linear ->
- {noreply, State#state{load_mode2=Tag}}
- end;
-
- %% Nodes menu item
- {node, Node, WinObj} ->
-
- %% Check first if this window is already displayed
- case get_win(Node, State#state.wins) of
- {ok, GUI} ->
-
- %% Node is already displayed, raise its window
- gs:config(GUI#win.window, raise),
-
- {noreply, State};
-
- %% Node is not displayed
- false ->
-
- %% Redraw existing window or create a new window
- %% depending on window mode
- case State#state.window_mode of
-
- single ->
- {ok, GUI} =
- get_win2(WinObj, State#state.wins),
-
- %% Clear window and correct the node name
- draw_clear(GUI),
- GUI1 = draw_nodename(GUI, Node),
-
- %% Update window with the correct node name
- %% and the applications running at the node
- MNode = get_mnode(Node, State#state.mnodes),
- GUI2 = case MNode#mnode.status of
- dead ->
- display_nodedown(GUI1),
- GUI1;
- alive ->
- display_nodeup(GUI1, Node),
- draw_apps(GUI1,
- MNode#mnode.apps)
- end,
- Wins = replace_win(GUI#win.name, GUI2,
- State#state.wins),
-
- {noreply, State#state{wins=Wins}};
-
- many ->
- GUI = draw_win(State#state.gs, Node),
-
- %% Update Nodes menu with all known nodes -
- %% use MNodes to get them in the right order
- lists:foreach(fun(MNode) ->
- Name =
- MNode#mnode.name,
- display_addnode(GUI,
- Name)
- end,
- State#state.mnodes),
-
- %% Mark selected options in the Options menu
- display_setopt(GUI, many),
- display_setopt(GUI, State#state.load_mode1),
- display_setopt(GUI, State#state.load_mode2),
-
- %% Add the applications running at the node
- MNode = get_mnode(Node, State#state.mnodes),
-
- GUI1 = case MNode#mnode.status of
- dead ->
- display_nodedown(GUI),
- GUI;
- alive ->
- display_nodeup(GUI, Node),
- draw_apps(GUI,
- MNode#mnode.apps)
- end,
- Wins = [GUI1|State#state.wins],
-
- {noreply, State#state{wins=Wins}}
- end
- end;
-
- %% Help menu = Help button
- help ->
- HelpFile = filename:join([code:lib_dir(appmon),
- "doc", "html", "part_frame.html"]),
- case State#state.wins of
- [Win] ->
- tool_utils:open_help(Win#win.window, HelpFile);
- _ ->
- tool_utils:open_help(State#state.gs, HelpFile)
- end,
- {noreply, State};
-
- _Other ->
- {noreply, State}
- end;
-handle_info({gs, WinObj, configure, _, [WWindow, HWindow|_]}, State) ->
- {ok, GUI} = get_win2(WinObj, State#state.wins),
- GUI1 = draw_resize(GUI, WWindow, HWindow),
- display_scrollbar(GUI1),
- Wins = replace_win(GUI#win.name, GUI1, State#state.wins),
- {noreply, State#state{wins=Wins}};
-handle_info({gs, WinObj, destroy, _, _}, State) -> % OTP-1179
- {ok, GUI} = get_win2(WinObj, State#state.wins),
-
- %% Terminate if this was the only open window
- case remove_win(GUI#win.name, State#state.wins) of
- [] ->
- {stop, normal, State};
- Wins ->
- {noreply, State#state{wins=Wins}}
- end;
-
-handle_info(stop, State) ->
- {stop, normal, State};
-handle_info({'EXIT', Pid, Reason}, State) ->
- case Reason of
- shutdown ->
- %% Appmon is being asked to shut down, eg during reboot
- {stop, Reason, State};
- _ ->
- case State#state.gs of
-
- %% GS exited, kill appmon
- {0, Pid} ->
- {stop, normal, State};
-
- _ ->
- {noreply, State}
- end
- end;
-handle_info(_Info, State) ->
- {noreply, State}.
-
-%%----------------------------------------------------------------------
-%% Func: terminate/2
-%% Purpose: Shutdown the server
-%% Returns: any (ignored by gen_server)
-%%----------------------------------------------------------------------
-terminate(_Reason, State) ->
- bcast(State#state.mnodes, {kill}),
- appmon_lb:stop(State#state.lbpid),
- ok.
-
-%%----------------------------------------------------------------------
-%% Func: code_change/3
-%% Purpose: Convert process state when code is changed
-%% Returns: {ok, NewState}
-%%----------------------------------------------------------------------
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-
-%%%---------------------------------------------------------------------
-%%% Internal functions
-%%%---------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% MNode manipulating functions
-%%----------------------------------------------------------------------
-
-%% mk_mnodes(Nodes, LbPid) -> MNodes
-%% Nodes -> [atom()]
-%% LbPid -> pid()
-%% MNodes -> [#mnode{}]
-mk_mnodes([Node|Nodes], LbPid) ->
- [mk_mnode(Node, LbPid) | mk_mnodes(Nodes, LbPid)];
-mk_mnodes([], _LbPid) ->
- [].
-
-mk_mnode(Node, LbPid) ->
-
- %% Create an appmon process at the node
- {ok, Pid} = appmon_info:start_link(Node, self(), []),
-
- appmon_lb:add_node(LbPid, Node),
- appmon_info:load(Pid, Node, true, [{timeout,1000}]),
- appmon_info:app_ctrl(Pid, Node, true, []),
-
- #mnode{name=Node, status=alive, pid=Pid}.
-
-%% get_mnode(Node, MNodes) -> MNode | false
-%% Node -> atom()
-%% MNodes -> [#mnode{}]
-%% MNode -> #mnode{}
-get_mnode(Node, MNodes) ->
- case lists:keysearch(Node, #mnode.name, MNodes) of
- {value, MNode} ->
- MNode;
- false ->
- false
- end.
-
-%% replace_mnode(Node, MNode, MNodes1) -> Mnodes2
-%% Node -> atom()
-%% MNode -> #mnode{}
-%% MNodes1 -> MNodes2 -> [#mnode{}]
-%% Replaces, or adds if previously not included, the mnode with name
-%% Node in MNodes1 with MNode.
-replace_mnode(Node, MNode, [#mnode{name=Node} | MNodes]) ->
- [MNode | MNodes];
-replace_mnode(Node, MNode, [MNode2 | MNodes]) ->
- [MNode2 | replace_mnode(Node, MNode, MNodes)];
-replace_mnode(_Node, MNode, []) ->
- [MNode].
-
-
-%%----------------------------------------------------------------------
-%% GUI list manipulating functions
-%%----------------------------------------------------------------------
-
-%% get_win(Node, Wins) -> Win
-%% Node -> atom()
-%% Wins -> [#win{}]
-%% Win -> #win{}
-get_win(Node, Wins) ->
- case lists:keysearch(Node, #win.name, Wins) of
- {value, Win} ->
- {ok, Win};
- false ->
- false
- end.
-
-%% get_win2(WinObj, Wins) -> Win
-%% Window -> gsobj()
-%% Wins -> [#win{}]
-%% Win -> #win{}
-get_win2(WinObj, Wins) ->
- case lists:keysearch(WinObj, #win.window, Wins) of
- {value, Win} ->
- {ok, Win};
- false ->
- false
- end.
-
-%% replace_win(Node, Win, Wins) -> Wins2
-%% Node -> atom()
-%% Win -> #win{}
-%% Wins -> Wins2 -> [#win{}]
-replace_win(Node, Win, Wins) ->
- lists:keyreplace(Node, #win.name, Wins, Win).
-
-%% remove_win(Node, Wins) -> Wins2
-%% Node -> atom()
-%% Wins -> Wins2 -> [#win{}]
-remove_win(Node, Wins) ->
- lists:keydelete(Node, #win.name, Wins).
-
-
-
-
-%%----------------------------------------------------------------------
-%% GUI manipulating functions
-%%----------------------------------------------------------------------
--define(PAD, 10). % Pad between objects
--define(PAD2, 4*?PAD). % Pad betw. node lbl and app
-
--define(hMENUBAR, 25). % Note: Hardwired in Tcl/Tk
-
--define(xNODELBL, 60). % Node label
--define(yNODELBL, 35).
--define(hNODELBL, 20).
-
--define(xMETER, 5). % Meter
--define(yMETER, ?yNODELBL).
--define(wMETER, 20).
--define(hMETER, ?hNODELBL + ?PAD + ?PAD2 + ?hBTN).
--define(LEDCOUNT, 16).
-
--define(xBTN, ?xNODELBL). % Application buttons
--define(yBTN, ?yNODELBL + ?hNODELBL + ?PAD + ?PAD2).
--define(wBTN, 70). % min width
--define(hBTN, 20).
-
--define(wCANVAS, 470 + ?wMETER + 3*?PAD). % Canvas
--define(hCANVAS, ?yNODELBL + ?hNODELBL + ?PAD + ?PAD2 + ?hBTN + 2*?PAD).
-
--define(wWIN, ?wCANVAS). % Window
--define(hWIN, ?hMENUBAR + ?hCANVAS).
-
-%%--Main window---------------------------------------------------------
-
-draw_win(GS, Node) ->
-
- %% Main window
- NodeStr = atom_to_list(Node),
- Win = gs:create(window, GS, [{title,
- "APPMON: Overview on " ++ NodeStr},
- {width, ?wWIN}, {height, ?hWIN},
- {configure, true}]),
- Canvas = gs:create(canvas, Win, [{x, 0}, {y, ?hMENUBAR},
- {width, ?wCANVAS},
- {height, ?hCANVAS}]),
- L1 = gs:create(line, Canvas, [{coords,
- [{0,?yNODELBL-?PAD},
- {?wCANVAS,?yNODELBL-?PAD}]}]),
- L2 = gs:create(line, Canvas, [{coords,
- [{0,?hCANVAS-?PAD},
- {?wCANVAS,?hCANVAS-?PAD}]}]),
-
- %% Standard buttons
- MenuBar = gs:create(menubar, Win, [{height, ?hMENUBAR}]),
-
- FileMenuBtn = gs:create(menubutton, MenuBar,
- [{label, {text,"File"}}]),
- FileMenu = gs:create(menu, FileMenuBtn, []),
- gs:create(menuitem, FileMenu, [{label, {text,"Show List Box..."}},
- {data, listbox}]),
- gs:create(menuitem, FileMenu, [{label, {text, "Close"}},
- {data, {close, Win}}]),
- gs:create(menuitem, FileMenu, [{itemtype, separator}]),
- gs:create(menuitem, FileMenu, [{label, {text, "Exit"}},
- {data, exit}]),
-
- ActionMenuBtn = gs:create(menubutton, MenuBar,
- [{label,{text,"Actions"}}]),
- ActionMenu = gs:create(menu, ActionMenuBtn, []),
- gs:create(menuitem, ActionMenu, [{label, {text,"Reboot"}},
- {data, {action, reboot, Win}}]),
- gs:create(menuitem, ActionMenu, [{label, {text,"Restart"}},
- {data, {action, restart, Win}}]),
- gs:create(menuitem, ActionMenu, [{label, {text,"Stop"}},
- {data, {action, stop, Win}}]),
- gs:create(menuitem, ActionMenu, [{label, {text,"Ping"}},
- {data, {action, ping, Win}}]),
-
- OptMenuBtn = gs:create(menubutton, MenuBar,
- [{label, {text,"Options"}}]),
- OptMenu = gs:create(menu, OptMenuBtn, []),
- G0 = now(), % Group identity unique per window!
- SMI = gs:create(menuitem, OptMenu, [{label, {text,"One window"}},
- {itemtype, radio}, {group, G0},
- {data, {window_mode, single}}]),
- MMI = gs:create(menuitem, OptMenu, [{label, {text,"Many windows"}},
- {itemtype, radio}, {group, G0},
- {data, {window_mode, many}}]),
- gs:create(menuitem, OptMenu, [{itemtype, separator}]),
- G1 = now(),
- TMI = gs:create(menuitem, OptMenu, [{label, {text,"Load: time"}},
- {itemtype, radio}, {group, G1},
- {data,
- {option, time,
- [{load_method,time}]}}]),
- QMI = gs:create(menuitem, OptMenu, [{label, {text,"Load: queue"}},
- {itemtype, radio}, {group, G1},
- {data,
- {option, queue,
- [{load_method,queue}]}}]),
- G2 = now(),
- PMI = gs:create(menuitem, OptMenu,
- [{label, {text,"Load: progressive"}},
- {itemtype, radio}, {group, G2},
- {data, {option, prog, [{load_scale,prog}]}}]),
- LMI = gs:create(menuitem, OptMenu, [{label, {text,"Load: linear"}},
- {itemtype, radio}, {group, G2},
- {data,
- {option, linear,
- [{load_scale,linear}]}}]),
-
- NodeMenuBtn = gs:create(menubutton, MenuBar,
- [{label, {text,"Nodes"}}]),
- NodeMenu = gs:create(menu, NodeMenuBtn, []),
-
- HelpMenuBtn = gs:create(menubutton, MenuBar,
- [{label, {text,"Help"}}, {side, right}]),
- HelpMenu = gs:create(menu, HelpMenuBtn, []),
- gs:create(menuitem, HelpMenu, [{label, {text,"Help"}},
- {data, help}]),
-
- %% Meter
- HLed = trunc((?hMETER)/(?LEDCOUNT)),
- Leds = draw_leds(?LEDCOUNT, Canvas, ?yMETER, HLed, []),
- leds_down(Leds, ?LEDCOUNT, 0),
- gs:create(text, Canvas, [{coords,
- [{?xMETER, ?yMETER+HLed*?LEDCOUNT}]},
- {anchor, nw},
- {font, {screen,8}},
- {text, "Load"}]),
- gs:create(text, Canvas, [{coords, [{?xMETER+?wMETER, ?yMETER}]},
- {anchor, nw},
- {font, {screen,8}},
- {text, "Hi"}]),
- gs:create(text, Canvas, [{coords, [{?xMETER+?wMETER,
- ?yMETER+HLed*?LEDCOUNT}]},
- {anchor, w},
- {font, {screen,8}},
- {text, "Lo"}]),
-
- %% Node label
- WNodeLbl = 8*length(NodeStr)+10,
- NLRect = gs:create(rectangle, Canvas,
- [{coords, [{?xNODELBL,?yNODELBL},
- {?xNODELBL+WNodeLbl,
- ?yNODELBL+?hNODELBL}]},
- {fill, black}]),
- Xc = ?xNODELBL + round(WNodeLbl/2),
- Yc = ?yNODELBL + round(?hNODELBL/2),
- NLText = gs:create(text, Canvas, [{text, NodeStr},
- {fg, {250,235,215}},
- {coords, [{Xc,Yc}]},
- {anchor, c}]),
- NodeLbl = {NLRect, NLText},
-
- gs:config(Win, {map, true}),
- #win{name=Node,
- window=Win, wwindow=?wWIN, hwindow=?hCANVAS,
- options=#options{single=SMI, many=MMI,
- time=TMI, queue=QMI, prog=PMI, linear=LMI},
- canvas=Canvas, wcanvas=?wCANVAS, hcanvas=?hCANVAS,
- l1=L1, l2=L2, leds=Leds, nodelabel=NodeLbl, nodemenu=NodeMenu}.
-
-draw_leds(N, Canvas, Y, HLed, Leds) when N>0 ->
- Led = gs:create(rectangle, Canvas,
- [{coords,
- [{?xMETER,Y}, {?xMETER+?wMETER,Y+HLed}]}]),
- draw_leds(N-1, Canvas, Y+HLed, HLed, [Led | Leds]);
-draw_leds(0, _Canvas, _Y, _HLed, Leds) ->
- Leds.
-
-%%--Draw functions------------------------------------------------------
-%% Functions that modify the GUI and its data (win{})
-
-%% Display the node name in the window title
-%% (The name in the node label is changed by display_nodeup|nodedown)
-%% Used when a changing the node to display
-draw_nodename(GUI, Node) ->
- NodeStr = atom_to_list(Node),
- gs:config(GUI#win.window,
- {title, "APPMON: Overview on " ++ NodeStr}),
- GUI#win{name=Node}.
-
-%% Resize the canvas (when the window has been resized)
-draw_resize(GUI, W, H) ->
- Hc = H - ?hMENUBAR,
- gs:config(GUI#win.canvas, [{width, W}, {height, Hc}]),
- Yline1 = ?yNODELBL-?PAD,
- Yline2 = ?hCANVAS-?PAD,
- gs:config(GUI#win.l1, [{coords, [{0,Yline1},{W,Yline1}]}]),
- gs:config(GUI#win.l2, [{coords, [{0,Yline2},{W,Yline2}]}]),
- GUI#win{wwindow=W, hwindow=Hc}.
-
-%% Clear the GUI from applications and connecting lines
-draw_clear(GUI) ->
- draw_clear2(GUI#win.appobjs),
- gs:config(GUI#win.canvas, [{hscroll, false}]),
- GUI#win{appobjs=[]}.
-draw_clear2([CBtn | AppObjs]) when is_record(CBtn, canvasbutton) ->
- gs:destroy(CBtn#canvasbutton.text),
- gs:destroy(CBtn#canvasbutton.ul),
- gs:destroy(CBtn#canvasbutton.ll),
- gs:destroy(CBtn#canvasbutton.rect),
- draw_clear2(AppObjs);
-draw_clear2([GSObj | AppObjs]) ->
- gs:destroy(GSObj),
- draw_clear2(AppObjs);
-draw_clear2([]) ->
- ignore.
-
-%% Display the applications, which are a list of tuples: {Pid,App,Descr}
-%% Display them in the reversed order to get them chronologically
-%% from left to right.
-draw_apps(GUI, Apps) ->
- {AppObjs, WCanvas} = draw_apps(GUI, lists:reverse(Apps), ?xNODELBL,
- undefined, 0, []),
- NewGUI = GUI#win{wcanvas=WCanvas, appobjs=AppObjs},
- display_scrollbar(NewGUI),
- NewGUI.
-
-draw_apps(GUI, [App | Apps], X, Lx0, N, GSObjs) ->
-
- %% Some necessary data
- {_Pid, AppName, _Descr} = App,
- Text = atom_to_list(AppName),
- Width = erlang:max(8*length(Text)+10, ?wBTN),
-
- %% Connect the application to the node label with a line
- %% Lx0 = leftmost X coordinate (above previous application button)
- %% Lx = X coordinate, Ly1, Ly2 = top and bottom Y coordinates
- Lx = X + trunc(Width/2),
- Line = case N of
- %% First (leftmost application) - draw a vertical line
- %% between the node label and application button
- 0 ->
- Ly1 = ?yNODELBL + ?hNODELBL +?PAD,
- Ly2 = Ly1 + ?PAD2,
- gs:create(line, GUI#win.canvas,
- [{coords, [{Lx, Ly1}, {Lx, Ly2}]}]);
- %% Nth application, N>1 - draw a horizontal line from
- %% line connecting to the previous application button,
- %% to above this application button, then vertically down
- %% to the application button
- _ ->
- Ly1 = ?yNODELBL + ?hNODELBL + ?PAD + ?PAD2/2,
- Ly2 = Ly1 + ?PAD2/2,
- gs:create(line, GUI#win.canvas,
- [{coords, [{Lx0, Ly1}, {Lx, Ly1},
- {Lx, Ly2}]}])
- end,
-
- %% The application is represented using a 'canvasbutton'
- Data = {application, AppName, GUI#win.name},
- AppBtn = canvasbutton(GUI#win.canvas, Text, X, ?yBTN, Width, ?hBTN,
- Data),
-
- draw_apps(GUI, Apps, X+Width+?PAD, Lx, N+1, [AppBtn, Line|GSObjs]);
-draw_apps(_GUI, [], X, _N, _Lx0, GSObjs) ->
- {GSObjs, X}.
-
-%%--Display functions---------------------------------------------------
-%% Functions that modify the GUI but not its data
-
-%% Add a new node to the Nodes menu
-%% Used when a new node has connected
-display_addnode([GUI|GUIs], Node) ->
- display_addnode(GUI, Node),
- display_addnode(GUIs, Node);
-display_addnode([], _Node) ->
- ignore;
-display_addnode(GUI, Node) ->
- Txt = "Show " ++ atom_to_list(Node),
- gs:create(menuitem, GUI#win.nodemenu,
- [{label, {text,Txt}},
- {data, {node, Node, GUI#win.window}}]).
-
-%% Show that a node has come back up
-display_nodeup(GUI, Node) ->
- {Rect, Text} = GUI#win.nodelabel,
-
- %% Check coordinates for the rectangle and compute the new width
- [{L, T}, {_R, B}] = gs:read(Rect, coords),
- NodeStr = atom_to_list(Node),
- W = 8*length(NodeStr)+10,
-
- gs:config(Rect, [{coords, [{L, T}, {L+W, B}]}, {fill, black}]),
- gs:config(Text, [{text, NodeStr}, {fg, {250,235,215}},
- {coords,
- [{L+round(W/2), T+round((?hNODELBL)/2)}]}]).
-
-%% Show that a node has gone down
-display_nodedown(GUI) ->
- {Rect, Text} = GUI#win.nodelabel,
-
- [{L, T}, {_R, B}] = gs:read(Rect, coords),
- gs:config(Rect, [{coords, [{L, T}, {L+114, B}]}, {fill, gray}]),
- gs:config(Text, [{text, "No connection"}, {fg, black},
- {coords, [{L+57, T+round((?hNODELBL)/2)}]}]).
-
-%% Add/remove scrollbars as necessary
-display_scrollbar(GUI) ->
-
- WWindow = GUI#win.wwindow,
- HWindow = GUI#win.hwindow,
- WCanvas = GUI#win.wcanvas,
- HCanvas = GUI#win.hcanvas,
- if
- WCanvas>WWindow ->
- gs:config(GUI#win.canvas,
- [{hscroll, bottom},
- {scrollregion,{0,0,WCanvas,HCanvas}}]);
- true ->
- gs:config(GUI#win.canvas, [{hscroll, false}])
- end,
- if
- HCanvas>HWindow ->
- gs:config(GUI#win.canvas,
- [{vscroll, left},
- {scrollregion,{0,0,WCanvas,HCanvas}}]);
-
- true ->
- gs:config(GUI#win.canvas, [{vscroll, false}])
- end.
-
-%% Select option radio buttons
-display_setopt(GUI, Option) ->
- gs:config(radiobutton(GUI, Option), {select,true}).
-
-radiobutton(GUI, single) -> (GUI#win.options)#options.single;
-radiobutton(GUI, many) -> (GUI#win.options)#options.many;
-radiobutton(GUI, time) -> (GUI#win.options)#options.time;
-radiobutton(GUI, queue) -> (GUI#win.options)#options.queue;
-radiobutton(GUI, prog) -> (GUI#win.options)#options.prog;
-radiobutton(GUI, linear) -> (GUI#win.options)#options.linear.
-
-%% Display load
-%% Used when load information is received from the displayed node
--define(highloadfg, {255,99,71}).
--define(midloadfg, yellow).
--define(lowloadfg, green).
--define(highloadbg, {140,157,178}).
--define(midloadbg, ?highloadbg).
--define(lowloadbg, ?highloadbg).
-
-display_load(GUI, {Old, New}) ->
- if
- Old == New ->
- true;
- Old > New ->
- leds_down(GUI#win.leds, Old, New);
- true ->
- leds_up(GUI#win.leds, Old, New)
- end.
-
-leds_down(_Leds, Old, New) when Old == New ->
- done;
-leds_down(Leds, Old, New) when Old > New ->
- reset_led(Leds, Old),
- leds_down(Leds, Old-1, New).
-leds_up(_Leds, Old, New) when Old == New ->
- done;
-leds_up(Leds, Old, New) when Old < New ->
- set_led(Leds, Old),
- leds_up(Leds, Old+1, New).
-
-led_on_col(N) when N > 13 -> ?highloadfg;
-led_on_col(N) when N > 9 -> ?midloadfg;
-led_on_col(_) -> ?lowloadfg.
-
-led_off_col(N) when N > 13 -> ?highloadbg;
-led_off_col(N) when N > 9 -> ?midloadbg;
-led_off_col(_) -> ?lowloadbg.
-
-reset_led(_Leds, 0) -> ok;
-reset_led(Leds, N) ->
- gs:config(lists:nth(N, Leds), [{fill, led_off_col(N)}]).
-
-set_led(_Leds, 0) -> ok;
-set_led(Leds, N) ->
- gs:config(lists:nth(N, Leds), [{fill, led_on_col(N)}]).
-
-%%----------------------------------------------------------------------
-%% Utilities
-%%----------------------------------------------------------------------
-
-bcast(MNodes, Msg) ->
- lists:foreach(fun(MNode) ->
- case MNode#mnode.status of
- alive ->
- MNode#mnode.pid ! Msg;
- dead ->
- ignore
- end
- end,
- MNodes).
-
-%% parse_nodes(MNodes) -> NodeApps
-%% MNodes -> [#mnode{}]
-%% NodeApps -> [{Node, Status, Apps}]
-%% Node -> atom()
-%% Status -> alive | dead
-%% Apps -> [{Pid, App}]
-%% Pid -> pid()
-%% App -> atom()
-parse_nodes(MNodes) ->
- parse_nodes(MNodes, []).
-parse_nodes([MNode|MNodes], NodeApps) ->
- Apps = parse_apps(MNode#mnode.apps, []),
- parse_nodes(MNodes,
- [{MNode#mnode.name,MNode#mnode.status,Apps}|NodeApps]);
-parse_nodes([], NodeApps) ->
- NodeApps.
-
-parse_apps([{Pid, App, _Descr}|Rest], Apps) ->
- parse_apps(Rest, [{Pid, App}|Apps]);
-parse_apps([], Apps) ->
- Apps.
-
-%%----------------------------------------------------------------------
-%% Canvas buttons
-%%----------------------------------------------------------------------
-
-canvasbutton(Canvas, Text, X, Y, W, H, Data) ->
-
- %% Draw a rectangle (for event catching)
- Rect = gs:create(rectangle, Canvas, [{coords, [{X,Y}, {X+W,Y+H}]},
- {fill, gs:read(Canvas, bg)},
- {buttonpress, true},
- {buttonrelease, true}]),
-
- %% Make the rectangle area look like a 3D button by using lines
- Ul = gs:create(line, Canvas, [{coords, [{X,Y+H},{X,Y},{X+W,Y}]},
- {fg, white}, {width, 2}]),
- Ll = gs:create(line, Canvas, [{coords, [{X,Y+H},{X+W,Y+H},{X+W,Y}]},
- {fg, {87,87,87}}, {width, 2}]),
-
- %% Write the text in the middle
- Xc = X + round(W/2),
- Yc = Y + round(H/2),
- T = gs:create(text, Canvas, [{text, Text}, {coords, [{Xc,Yc}]},
- {anchor, c},
- {buttonpress, true},
- {buttonrelease, true}]),
-
- %% Create the canvasbutton object
- CBtn = #canvasbutton{text=T, ul=Ul, ll=Ll, rect=Rect,
- x=X, y=Y, w=W, h=H},
-
- %% Configure the data
- gs:config(T, {data, {canvasbutton, CBtn, Data}}),
- gs:config(Rect, {data, {canvasbutton, CBtn, Data}}),
-
- CBtn.
-
-press(Canvasbutton) ->
- gs:config(Canvasbutton#canvasbutton.ul, {fg, {87,87,87}}),
- gs:config(Canvasbutton#canvasbutton.ll, {fg, white}).
-
-release(Canvasbutton) ->
- gs:config(Canvasbutton#canvasbutton.ul, {fg, white}),
- gs:config(Canvasbutton#canvasbutton.ll, {fg, {87,87,87}}).
diff --git a/lib/appmon/src/appmon_a.erl b/lib/appmon/src/appmon_a.erl
deleted file mode 100644
index 6838a7a275..0000000000
--- a/lib/appmon/src/appmon_a.erl
+++ /dev/null
@@ -1,1122 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(appmon_a).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
-
-%%----------------------------------------------------------------------
-%%
-%% Monitors an application, i.e its supervision tree.
-%%
-%%----------------------------------------------------------------------
-%%
-%%
-%% INTRODUCTION
-%% ------------
-%%
-%% This file contains a description of the files involved
-%% and the communication between the appmon_a display
-%% manager and the appmon_a2 information gatherer. Further
-%% information on the placement algorithm can be found in
-%% the place.erl file.
-%%
-%%
-%% FILES
-%% -----
-%%
-%% The supervision tree graphical software consists of
-%% the following files:
-%%
-%% appmon_a Gen server driving the process display window.
-%% Responsible for assigning gs identifiers to all
-%% processes and process link
-%% appmon_a2 The process information gathering routines.
-%% Works by following the process links from application
-%% master once every second
-%% dg The process database is implemented as a shared
-%% digraph (see manual pages for digraph) and this is
-%% the routines handling this digraph. Since the digraph
-%% is shared appmon_a2 will put some info into it that the
-%% appmon_a later will modify. The structures used are
-%% described in dg.hrl
-%% place Places a tree, decides the x and y coordinates (not
-%% necessarily corresponding to window coordinates) of
-%% processes (or vertices to be specific). Note that
-%% special routines are used to transform the possibly
-%% cyclic digraph into a strict tree before trying to
-%% place it.
-%%
-%%
-%%
-%% IMPLEMENTATION DETAIL
-%% ---------------------
-%%
-%% The appmon_a module will follow links between processes,
-%% starting with the application master. A unique
-%% reference is used to prevent infinite recursion. Note
-%% that this process and link gathering is done in the
-%% live digraph so that already known processes are
-%% updated with the reference and new ones are added to
-%% the digraph. After all processes and links have been
-%% added or updated a search is made for those processes
-%% and links that have an old reference. These are those
-%% processes and links that are not present in the
-%% application any more. Those are extracted from the
-%% digraph and then deleted and the extracts are then
-%% used (by appmon_a) to delete the appropriate gs
-%% objects. The responsibilities of appmon_a is thus 1) add
-%% all new processes and links to the digraph and 2) make
-%% a list of all those objects from the digraph that have
-%% been deleted.
-%%
-%% When appmon_a2 has gathered all necessary information it
-%% notifies the appmon_a display manager. Note that this is
-%% implemented as a call (as opposed to a cast) to
-%% prevent appmon_a2 from changing the digraph while appmon_a
-%% uses it. appmon_a places all processes using the place
-%% module. place will place the processes in the x y
-%% planes, hopefully in a nice way, re-forming the
-%% digraph during the process into a strict tree using
-%% some simple heuristics, some links that makes the
-%% graph cyclic will be considered secondary and later
-%% coloured red. Note that the process links are not
-%% placed since their coordinates are those of the
-%% processes that they are links between. The place
-%% module is only concerned at a fairly high level of
-%% abstraction. Currently its x coordinates are used as
-%% real coordinates while the y coordinates must be
-%% scaled to correct values, thus the x plane is
-%% continous and the y plane is disctrete.
-%%
-%% Having placed processes the new ones are drawn on the
-%% display along with all new process links, then all
-%% processes and process links are moved to their
-%% possibly new positions. The place module is not
-%% sensitive to changes in position and therefore has no
-%% concept of which nodes will have to be moved. hence
-%% all nodes are moved (but most of them probably to the
-%% same position as before)
-%%
-%%
-%%
-%%
-%%----------------------------------------------------------------------
-
-
-
--export([start/2, start/3, stop/0]).
-
-
--record(astate, {app, name, client, digraph}).
-
--import(lists, [foreach/2]).
-
-%% gen server stuff
--behaviour(gen_server).
--export([init/1, handle_cast/2, handle_info/2, terminate/2]).
--export([handle_call/3, code_change/3]).
-
-
--define(APPSPACE, 10). % The space between apps
--define(NODEAREA_H, 90). % The height of a node
--define(BUTTAREA_H, 80). % The button area height
--define(APPBUTT_H, 20). % Height of appl button
--define(EDITORW, 260).
-
--define(MAXWIDTH, 800).
--define(MINWIDTH, 382).
--define(MAXHEIGHT, 450).
--define(MINHEIGHT, 325).
-
--define(SUPVIEWTXT, "Sup. view").
--define(PROCVIEWTXT, "Proc. view").
--define(CLOSETXT, "Close").
--define(REFRESHTXT, "Refresh").
--define(SAVEOPTSTXT, "Save options").
--define(HELPTXT, "Help").
-
--define(CHARWIDTH, 7). %Should use GS primitives
-
--define( darkkhaki, {189, 183, 107}).
--define( palegoldenrod, {238, 232, 170}).
--define( peachpuff4, {139, 119, 101}).
--define( red, red).
--define( darkgrey, {169, 169, 169}).
--define( lightgrey, {211, 211, 211}).
--define( royalblue, {65, 105, 225}).
--define( aquamarine4, {69, 139, 116}).
--define( palegreen4, {84, 139, 84}).
--define( darkseagreen, {105, 139, 105}).
--define( f_line_col, {150, 150, 255}).
-
-
--include("appmon_dg.hrl").
-
-
-%%------------------------------------------------------------
-%%------------------------------------------------------------
-
-
-start(NodeName, AppName) ->
- gen_server:start_link(?MODULE, {NodeName, AppName, AppName}, []).
-
-start(NodeName, AppName, AppId) ->
- gen_server:start_link(?MODULE, {NodeName, AppName, AppId}, []).
-
-
-stop() ->
- ok.
-
-
-
-%%------------------------------------------------------------
-%% Public interface
-
-
-%%------------------------------------------------------------
-%% Administration
-
-%% AppName is the name of the application, usually an atom like sasl
-%% or kernel, AppId is the application pid or the application name,
-%% either goes.
-init({NodeName, AppName, AppId}) ->
- process_flag(trap_exit, true),
- {ok, Client} = appmon_info:start_link(NodeName, self(), []),
- init_ref(),
- init_foreign_places(),
- DG = digraph:new([cyclic, private]),
- State = #astate{app=AppId, name=AppName, client=Client, digraph=DG},
- refresh(State),
- setup_base_win(NodeName, AppName),
- {ok, State}.
-
-terminate(_Reason, _State) ->
- ok.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-handle_call(norequest, _From, State) ->
- {reply, null, State}.
-
-%%------------------------------------------------------------
-%% handle casts
-
-handle_cast({ping, _Node, _From}, State) ->
- {noreply, State};
-handle_cast(_Other, State) ->
- {noreply, State}.
-
-
-
-%%------------------------------------------------------------
-%% handle info
-
-handle_info({gs, _, click, _, [?CLOSETXT|_]}, State) ->
- {stop, normal, State};
-handle_info({gs, _, destroy, _, _}, State) ->
- {stop, normal, State};
-handle_info({gs, _, click, _, [?REFRESHTXT|_]}, State) ->
- refresh(State),
- {noreply, State};
-handle_info({gs, _, click, _, [?HELPTXT|_]}, State) ->
- HelpFile = filename:join([code:lib_dir(appmon),
- "doc", "html", "part_frame.html"]),
- tool_utils:open_help(win(), HelpFile),
- {noreply, State};
-handle_info({gs, Id, click, {mode, Mode}, _}, State) ->
- %%io:format("handle_info: Setting mode: ~p~n", [Mode]),
- set_mode(Id, Mode),
- {noreply, State};
-handle_info({gs, _, click, _, [?SUPVIEWTXT|_]}, State) ->
- refresh(State, [{info_type, sup}]),
- {noreply, State};
-handle_info({gs, _, click, _, [?PROCVIEWTXT|_]}, State) ->
- refresh(State, [{info_type, link}]),
- {noreply, State};
-handle_info({gs, Id, buttonpress, _,[1, X, Y|_]}, State) ->
- %%io:format("Id clicked: ~p~n", [gs:read(Id, {find, {X, Y}})]),
- catch find_pid(State, Id, X, Y),
- set_default_mode(),
- {noreply, State};
-handle_info({gs, Win, configure, _Data, [W, H|_]}, State) ->
- case win() of Win -> user_driven_resize(W, H);
- _-> ok
- end,
- {noreply, State};
-
-handle_info({delivery, _S, pinfo, _N, Res}, State) ->
- appmon_txt:print(Res),
- {noreply, State};
-handle_info({delivery, S, app, N, Res}, State) ->
- {delivery, _Serv, app, _Name, {Root, Vs, Ls, SecLs}} =
- flush({delivery, S, app, N, Res}),
- update2(Vs, Root, Ls, SecLs, State),
- {noreply, State};
-
-handle_info({kill}, State) ->
- {stop, normal, State};
-handle_info({state}, State) ->
- {noreply, State};
-handle_info({'EXIT', _Pid, _Reason}, State) ->
- {noreply, State};
-handle_info(_Other, State) ->
- {noreply, State}.
-
-
-%% Refresh sets new options for the request and forces an update of
-%% the screen ant status.
-refresh(State) ->
- refresh(State, []).
-refresh(State, Opts) ->
- appmon_info:app(State#astate.client,
- State#astate.name, true, Opts).
-
-
-
-%% find_pid finds the pid of the clicked object. The scenario is that
-%% the user clicks on an item in his window, that ObjId is searched
-%% for among all nodes (vertices) and if found action is taken
-%% depending on the current mode (see handle_info)
-find_pid(State, Id, X, Y) ->
- %% Try to manage both versions of GS, remove first case later.
- ObjList = case gs:read(Id, {find, {X, Y}}) of
- {error, _} ->
- gs:read(Id, {hit, {X, Y}}); % Try new format
- Num when is_integer(Num) -> [Num];
- _Other -> []
- end,
- DG = State#astate.digraph,
- All = appmon_dg:get(all, DG),
- find_pid2(ObjList, All, DG, State).
-
-find_pid2([Id | Ids], All, DG, State) ->
- case search_for_pid(All, DG, Id) of
- {ok, _KeyStr, Pid} ->
- handle_proc_press(mode(), Pid, State);
- _ -> find_pid2(Ids, All, DG, State)
- end;
-find_pid2([], _All, _DG, _State) -> ok.
-
-search_for_pid([V|Vs], DG, ObjId) ->
- VD = appmon_dg:get(data, DG, V),
- if ObjId==VD#vdata.txt_obj ->
- {ok, V, VD#vdata.type};
- true -> search_for_pid(Vs, DG, ObjId)
- end;
-search_for_pid([], _DG, _ObjId) -> false.
-
-
-%%
-%% called when a process has been clicked on.
-%%
-handle_proc_press(info, Pid, State) ->
- appmon_info:pinfo(State#astate.client, Pid, true,
- [{timeout, at_most_once}]);
-handle_proc_press(send, Pid, _State) ->
- {P, RawStr} = two_entries(winroot(), 250, 70,
- "Send", "To: ", "Msg: ",
- pid_to_list(Pid), "", bg()),
- Str = case lists:last(RawStr) of
- 46 -> RawStr;
- _ -> RawStr++"."
- end,
- case erl_scan:string(Str) of
- {ok, Tokens, _} ->
- case erl_parse:parse_term(Tokens) of
- {ok, Term} ->
- case catch list_to_pid(P) of
- To when is_pid(To) -> To ! Term;
- _ -> error
- end;
- _Error -> error
- end;
- _Error -> error
- end;
-handle_proc_press(trace, Pid, _State) ->
- case trace_state(Pid) of
- true ->
- io:format("Removing trace on ~p~n", [Pid]),
- sys:trace(Pid, false),
- set_trace_state(Pid, false);
- _Other ->
- io:format("Putting trace on ~p~n", [Pid]),
- sys:trace(Pid, true, 1000),
- set_trace_state(Pid, true)
- end;
-handle_proc_press(kill, Pid, _State) ->
- exit(Pid, kill).
-
-
-trace_state(Pid) -> get({trace_state, Pid}).
-set_trace_state(Pid, State) -> put({trace_state, Pid}, State).
-
-set_default_mode() ->
- {Id, Mode} = get(default_mode),
- case mode() of
- Mode -> true;
- _Other -> set_mode(Id, Mode)
- end.
-set_default_mode(Id, Mode) ->
- put(default_mode, {Id, Mode}),
- select(Id), %Dirty workaround
- set_default_mode().
-
-set_mode(Id, Mode) ->
- %%io:format("mode=~p~n", [Mode]),
- set_mode(Mode),
- deselect(),
- select(Id).
-
-set_mode(Mode) -> put(mode, Mode).
-mode() -> get(mode).
-
-flush({delivery, S, A, N, R}) ->
- receive
- {delivery, S, A, N, R2} ->
- flush({delivery, S, A, N, R2})
- after 0 ->
- {delivery, S, A, N, R}
- end.
-
-
-%%------------------------------------------------------------
-%% Real stuff
-%%
-update2(Vs, Root, Ls, SecLs, State) ->
- DG = State#astate.digraph,
- Ref = mk_ref(),
- Added = add_procs(Vs, DG, Ref),
- AddedLs = add_links(Ls, DG, Ref, primary),
- AddedLs2 = add_links(SecLs, DG, Ref, secondary),
- DelLs = del_links(appmon_dg:eget(all, DG), DG, Ref),
- Dels = del_procs(appmon_dg:get(all, DG), DG, Ref),
-
- LastX = appmon_place:place(DG, Root),
- Width = lists:max(LastX),
- Height = length(LastX),
-
- %% Delete things from screen
- del(Dels), del(DelLs),
-
- %% Add vertices to screen
- foreach(fun(V) -> draw_node(DG, V) end, Added),
-
- %% Add edges to screen
- foreach(fun(E) -> draw_edge(DG, E) end, AddedLs),
- foreach(fun(E) -> draw_edge(DG, E) end, AddedLs2),
-
- %% Move vertices on screen
- foreach(fun(V) -> move_vertex(DG, V) end, appmon_dg:get(all, DG)),
-
- tree_driven_resize(Width, Height),
-
- gs:config(win(), {map, true}), %Make win visible
- ok.
-
-%% Make an integer reference, could have used make_ref BIF but didn't
-mk_ref() -> put(reference, get(reference)+1).
-init_ref() -> put(reference, 0).
-
-
-%% Add processes (vertices) to digraph, use the string repr of pid as
-%% key in digraph.
-add_procs([{Pid, Str}|Vs], DG, Ref) ->
- case appmon_dg:add(DG, Str, mk_vdata(Str, Pid, Ref), Ref) of
- known -> add_procs(Vs, DG, Ref);
- updated -> add_procs(Vs, DG, Ref);
- _ ->
- case lists:member(32, Str) of
- true ->
- appmon_dg:set(x, DG, Str, foreign), % UNHOLY!
- add_procs(Vs, DG, Ref); % Don't add foreign
- _ -> [Str | add_procs(Vs, DG, Ref)]
- end
- end;
-add_procs([], _DG, _Ref) -> [].
-
-
-%% Add links to digraph. NOTE that foreign links get a special weight
-%% and that no link is added if it goes to a process not in the set of
-%% vertices.
-%%
-%% OTP-1970: Check that linked-to processes really exist.
-%%
-add_links([{V1, V2}|Ls], DG, Ref, Weight) ->
- L = case lists:member(32, V2) of
- true -> {V1, V2, foreign};
- _ -> {V1, V2, Weight}
- end,
- case appmon_dg:get(data, DG, V2) of
- false -> add_links(Ls, DG, Ref, Weight);
- VD ->
- if VD#vdata.ref == Ref -> % OTP-1970
- case appmon_dg:eadd(DG, L, mk_edata(L, Ref), Ref) of
- known -> add_links(Ls, DG, Ref, Weight);
- updated -> add_links(Ls, DG, Ref, Weight);
- _Other -> [L | add_links(Ls, DG, Ref, Weight)]
- end;
- true ->
- add_links(Ls, DG, Ref, Weight)
- end
- end;
-add_links([], _DG, _Ref, _Weight) -> [].
-
-%% Make an edge data structure
-mk_edata(_L, Ref) ->
- #edata{ref=Ref}.
-
-%% Make a vertex data structure, note that pid can be either a pid or
-%% a port, we're not picky here.
-mk_vdata(P, Pid, Ref) ->
- #vdata{ref=Ref, type=Pid, txt=P, width=width(P)}.
-width(Txt) -> ?CHARWIDTH*length(Txt)+10. % Should use GS stuff instead
-
-
-%% Delete those processes that have the wrong reference from the
-%% digraph. Returns a list of deleted procs and their data (to be able
-%% to erase things on screen).
-del_procs([V|Vs], DG, Ref) ->
- VD = appmon_dg:get(data, DG, V),
- if VD#vdata.ref /= Ref -> appmon_dg:del(DG, V),
- [{V, VD} | del_procs(Vs, DG, Ref)];
- true -> del_procs(Vs, DG, Ref)
- end;
-del_procs([], _DG, _Ref) -> [].
-
-
-%% Deletes links that have the wrong reference from the digraph, note
-%% that the weight of the edge is not considered here. Returns a list
-%% of deleted links and their data (to be able to erase things on
-%% screen).
-del_links([L | Ls], DG, Ref) ->
- ED = appmon_dg:eget(data, DG, L),
- if ED#edata.ref /= Ref -> appmon_dg:edel(DG, L),
- [{L, ED} | del_links(Ls, DG, Ref)];
- true -> del_links(Ls, DG, Ref)
- end;
-del_links([], _DG, _Ref) -> [].
-
-%% Del deletes the GS objects of the list of should-be-deleted
-%% items. Returns nothing particular.
-del(L) ->
- lists:foreach(fun({{V1, V2, Weight}, D}) when is_record(D, edata) ->
- if Weight== foreign ->
- dealloc_foreign({V1, V2, Weight});
- true -> ok end,
- destroy(D#edata.line);
- ({_I, D}) when is_record(D, vdata) ->
- destroy(D#vdata.sym_obj),
- destroy(D#vdata.txt_obj)
- end, L).
-
-
-move_vertex(DG, V) ->
- VData = appmon_dg:get(data, DG, V),
-%% io:format("Vertex ~p data: x:~p, oldx:~p, y:~p, oldy:~p offs:~p~n",
-%% [V, VData#vdata.x, VData#vdata.origx,
-%% VData#vdata.y, VData#vdata.origy, offsetx()]),
- if VData#vdata.x == foreign -> ok;
- true ->
- X = VData#vdata.x,
- Y = scaley(VData#vdata.y),
- OldX = VData#vdata.origx,
- OldY = scaley(VData#vdata.origy),
- if X==OldX, Y==OldY -> true;
- true ->
- %%io:format("Moving vertex: ~p~n", [V]),
-
- W = VData#vdata.width,
- {BoxC, TxtC} = calc_box_coords(X, Y, W),
-
- %% move the symbol and text
- gs:config(VData#vdata.sym_obj, [{coords, BoxC}]),
- gs:config(VData#vdata.txt_obj, [{coords, TxtC}]),
- foreach(fun(E) -> move_edge(DG, E) end,
- appmon_dg:get(edges, DG, V))
- end
- end.
-
-
-move_edge(DG, E) ->
- {{V1, V2, Weight}, V1, V2, ED} = appmon_dg:eget(edge, DG, E),
- VD1 = appmon_dg:get(data, DG, V1),
- VD2 = appmon_dg:get(data, DG, V2),
- Line = ED#edata.line,
- move_line(DG, VD1, VD2, Line, Weight).
-move_line(DG, VD1, VD2, Line, Weight) when is_list(Line) ->
- move_line(DG, VD1, VD2, hd(Line), Weight);
-move_line(_DG, VD1, VD2, Line, Weight) ->
- Coords = calc_coords(VD1, VD2, Weight),
- gs:config(Line, [{coords, Coords} | line_opts(Weight)]).
-
-%% Draw the vertex on the canvas
-draw_node(DG, V) ->
- %%io:format("Drawing~n",[]),
- Data = appmon_dg:get(data, DG, V),
-
- X = Data#vdata.x,
- Y = scaley(Data#vdata.y),
-
- {Sym, Txt} = draw(rectangle, sup_col(), Data#vdata.txt, X, Y,
- Data#vdata.width),
-
- appmon_dg:av(DG, V, Data#vdata{sym_obj=Sym, txt_obj=Txt}),
- true.
-
-%% Draws a symbol (rectangle for instance) on the canvas.
-draw(Symbol, Col, Txt, X, Y, W) ->
- {BoxC, TxtC} = calc_box_coords(X, Y, W),
- Box = gs:create(Symbol, canvas(), [{coords, BoxC}, {fill, Col}]),
-
- TxtObj = gs:create(text, canvas(), [{coords, TxtC},
- {anchor, c},
- %%{buttonpress, true},
- {text, Txt}]),
- {Box, TxtObj}.
-
-%% Returns {BoxCoords, TextCoords}
-calc_box_coords(X, Y, W) ->
- {[{X, Y-radius()}, {X+W, Y+radius()}], [{X+trunc(W/2), Y}]}.
-
-
-%% Draw a line on the canvas
-draw_edge(DG, E) ->
- {V1, V2, Weight} = E,
- Line = draw_line(DG, V1, V2, Weight),
-%% io:format("Line: ~p~n", [Line]),
- appmon_dg:eset(line, DG, E, Line).
-
-
-%% From is parent, To is child. If To is not a record then we are
-%% dealing with a link to a process on another node. Find a suitable
-%% place at the left margin and write the process name there and draw
-%% a line to it.
-%%
-draw_line(DG, From, To, foreign) ->
- VD1 = appmon_dg:get(data, DG, From),
- Y = find_foreign_place(VD1#vdata.y+0.5, foreign_places()),
- add_foreign_place({From, To, foreign}, Y),
-%% io:format("New Y: ~p~n", [Y]),
- appmon_dg:set(x, DG, To, 0),
- appmon_dg:set(y, DG, To, Y),
- VD2 = appmon_dg:get(data, DG, To),
- Coords = calc_coords(VD1, VD2, foreign),
-%% io:format("Node coords: ~p~n", [Coords]),
- L = gs:create(line, canvas(), [{coords, Coords} | line_opts(foreign)]),
- T = gs:create(text, canvas(), [{coords, [{0, 5+scaley(Y)}]},
- {anchor, nw}, {fg, f_line_col()},
-%% {font, {screen, 10}},
- {text, To}]),
- [L, T];
-
-draw_line(DG, From, To, Weight) ->
- VD1 = appmon_dg:get(data, DG, From),
- VD2 = appmon_dg:get(data, DG, To),
- Coords = calc_coords(VD1, VD2, Weight),
- gs:create(line, canvas(), [{coords, Coords} | line_opts(Weight)]).
-
-%%----------------------------------------------------------------------
-%%
-%% Line coordinate calculation
-%%
-%% Calculate coordinates for edges (links, lines). Primaries have a
-%% nice knee and secondaries are oriented differently. If weight is
-%% foreign then we will calculate a nice line to the left margin.
-%%
-calc_coords(From, To, foreign) ->
- Y = scaley(To#vdata.y),
- X1 = From#vdata.x+trunc(From#vdata.width/2),
- Y1 = scaley(From#vdata.y)+radius(),
- [{0, Y}, {X1-40, Y}, {X1, Y1}];
-calc_coords(From, To, primary) ->
- X1 = From#vdata.x+trunc(From#vdata.width/2),
- Y1 = scaley(From#vdata.y)+radius(),
-
- X2 = To#vdata.x+trunc(To#vdata.width/2),
- Y2 = scaley(To#vdata.y)-radius(),
-
- Y3 = trunc((Y1+Y2)/2),
- [{X1, Y1}, {X1, Y3}, {X2, Y3}, {X2, Y2}];
-
-calc_coords(V1, V2, _Weight) ->
- Y1 = scaley(V1#vdata.y),
- X1 = V1#vdata.x,
- X1w = X1+V1#vdata.width,
- Y2 = scaley(V2#vdata.y),
- X2 = V2#vdata.x,
- X2w = X2+V2#vdata.width,
-
- if Y1 == Y2 -> calc_u(X1, X1w, Y1, X2, X2w);
- X1w < X2 -> calc_s(X1w, Y1, X2, Y2);
- X2w < X1 -> calc_s(X1, Y1, X2w, Y2);
- true ->
- D1 = abs(X1-X2), D2 = abs(X1w-X2w),
- if D1 > D2 -> calc_rbrack(X1w, Y1, X2w, Y2);
- true -> calc_lbrack(X1, Y1, X2, Y2)
- end
- end.
-
-%% Calculates line coordinates that will go from bottom of one node to
-%% bottom of another on the same level. The line will form a nice "U".
-calc_u(X1, X1w, Y, X2, X2w) ->
- X3 = trunc((X1+X1w)/2),
- X4 = trunc((X2+X2w)/2),
- Y2 = Y+radius(),
- Y3 = Y2+20,
- [{X3, Y2}, {X3, Y3}, {X4, Y3}, {X4, Y2}].
-
-%% Calculates line coordinates that will go from right (or left) side
-%% to right (or left) side, thus forming a "[" or a "]" (bracket).
-calc_rbrack(X1, Y1, X2, Y2) ->
- X3 = 20 + if X1 > X2 -> X1;
- true -> X2
- end,
- [{X1, Y1}, {X3, Y1}, {X3, Y2}, {X2, Y2}].
-calc_lbrack(X1, Y1, X2, Y2) ->
- X3 = -20 + if X1 < X2 -> X1;
- true -> X2
- end,
- [{X1, Y1}, {X3, Y1}, {X3, Y2}, {X2, Y2}].
-
-%% Calculates line coordinates that will form a nice "S"
-calc_s(X1, Y1, X2, Y2) ->
- X3 = trunc((X1+X2)/2),
- [{X1, Y1}, {X3, Y1}, {X3, Y2}, {X2, Y2}].
-
-
-%% Options for lines (edges, links)
-line_opts(foreign) -> [{width, 2}, {smooth, true}, {fg, f_line_col()}];
-line_opts(primary) -> [{width, 2}, {smooth, false}, {fg, line_col()}];
-line_opts(_) -> [{width, 2}, {smooth, true}, {fg, sec_line_col()}].
-
-
-
-%%----------------------------------------------------------------------
-%%
-%% Handling of links to foreign processes
-%%
-%%----------------------------------------------------------------------
-dealloc_foreign(L) ->
-%% io:format("deallocing foreign: ~p~n", [L]),
- put(foreign_places, lists:keydelete(L, 1, foreign_places())).
-add_foreign_place(V, Y) ->
-%% io:format("Adding foreign: ~p~n", [V]),
- put(foreign_places, [{V, Y} | foreign_places()]).
-foreign_places() ->
- get(foreign_places).
-init_foreign_places() ->
- put(foreign_places, []).
-
-%% Find a good place for the foreign node
-find_foreign_place(StartY, L) ->
- case lists:keysearch(StartY, 2, L) of
- {value, _} -> find_foreign_place(StartY + 1, L);
- _ -> StartY
- end.
-
-
-%%------------------------------------------------------------
-%%
-%% Graphical stuff
-%%
-
-setup_base_win(NodeName, AppName) ->
- set_winroot(gs:start([{kernel,true}])),
-
- W = ?MINWIDTH, H = ?MINHEIGHT,
-
- Name = "APPMON: " ++ atom_to_list(AppName) ++ " on " ++
- atom_to_list(NodeName),
-
- set_win(gs:create(window, winroot(), [{title, Name}, %%{bg, red},
- {x, 250}, {y, 100},
- {width, W}, {bg, win_col()},
- {height, H+?BUTTAREA_H}])),
- %% standard buttons
- mk_std_butts(win(), W),
- set_canvas(gs:create(canvas, win(),[{x,0}, {y,?BUTTAREA_H},
- {width, W}, {height, H},
- {bg, bg()},
- {buttonpress, true}])),
-
- set_old_win_size(width, gs:read(win(), width)),
- set_old_win_size(height, gs:read(win(), height)),
-
-%% gs:config(win(), {map, true}), %Make win visible
- ok.
-
-
-nice_line_coords(W, H) ->
- [{0,H-10}, {W,H-10}].
-
-%%------------------------------
-%% Button stuff
-
-mk_butt_area(Win, W) ->
- H = ?BUTTAREA_H,
- F = gs:create(frame, Win,[{x,0}, {y,0}, %%{bg, frame_col()},
- {width,W}, {height,H}]),
- C = gs:create(canvas,F,[{x,0}, {y,0}, {width, W}, {height, H-9},
- {bg, bg()}]),
- L = gs:create(line,C,[{coords,nice_line_coords(W, H)}]),
-
- MB = gs:create(menubar, Win, []),
-
- FMB = gs:create(menubutton, MB, [{label, {text, "File"}}]),
- FM = gs:create(menu, FMB, []),
- gs:create(menuitem, FM, [{label, {text, ?CLOSETXT}}]),
-
- OMB = gs:create(menubutton, MB, [{label, {text, "Options"}}]),
- OM = gs:create(menu, OMB, []),
- gs:create(menuitem, OM, [{label, {text, ?REFRESHTXT}}]),
- Group = now(),
- gs:create(menuitem, OM, [{itemtype, separator}]),
- gs:create(menuitem, OM, [{label, {text, ?SUPVIEWTXT}}, {itemtype, radio},
- {group, Group}]),
- gs:create(menuitem, OM, [{label, {text, ?PROCVIEWTXT}}, {select, true},
- {group, Group}, {itemtype, radio}]),
-
- HMB = gs:create(menubutton, MB, [{label, {text, "Help"}}, {side, right}]),
- HM = gs:create(menu, HMB, []),
- gs:create(menuitem, HM, [{label, {text, ?HELPTXT}}]),
-
- {F, C, L}.
-
-mk_std_butts(Win, W) ->
- {F, C, L} = mk_butt_area(Win, W),
- set_bframe(F), set_bcanvas(C), set_bline(L),
-
- IButt = mk_mode_butt({text, "Info"}, {mode, info}, 10),
- mk_mode_butt({text, "Send"}, {mode, send}, 90),
- mk_mode_butt({text, "Trace"}, {mode, trace}, 170),
- mk_mode_butt({text, "Kill"}, {mode, kill}, 250),
-
- set_default_mode(IButt, info),
-
- true.
-
-select(Id) ->
- gs:config(Id, {bg, sel_col()}),
- set_selected(Id).
-
-deselect() ->
- gs:config(selected(), {bg, de_sel_col()}).
-
-mk_mode_butt(Label, Data, X) ->
- gs:create(button, bframe(), [{label, Label}, {x, X}, {y, 35},
- {data, Data}, {width, 70}, {height, 25}]).
-
-%%------------------------------------------------------------
-%% Graphical utilities
-
-mk_frame(P, X, Y, W, H, BG) ->
- gs:create(frame, P, [{x, X}, {y, Y}, {width, W}, {height, H}, {bg, BG}]).
-
-mk_butt(P, X, Y, W, H, Txt) ->
- gs:create(button, P, [{x, X}, {y, Y}, {height, H}, {width, W},
- {label, {text, Txt}}]).
-
-mk_butt(P, X, Y, Txt) ->
- mk_butt(P, X, Y, 70, 20, Txt).
-
-mk_label(P, X, Y, W, H, Txt, BG) ->
- gs:create(label, P, [{x, X}, {y, Y}, {height, H}, {width, W},
- {label, {text, Txt}}, {bg, BG}]).
-
-mk_entry(P, X, Y, W, H, Txt, BG) ->
- gs:create(entry, P, [{x, X}, {y, Y}, {height, H}, {width, W}, {text, Txt},
- {bg, BG}, {keypress, true}]).
-
-
-two_entries(Root, W, H, Name, LTxt1, LTxt2, StartTxt1, StartTxt2, BG) ->
- Win = gs:create(window, Root, [{title, Name}, %%{bg, red},
- %%{x, X}, {y, Y},
- {width, W}, {bg, BG},
- {height, H}]),
- F = mk_frame(Win, 0, 0, W, H, BG),
-
- mk_label(F, 10, 10, 30, 20, LTxt1, BG),
- mk_label(F, 10, 40, 30, 20, LTxt2, BG),
-
- E1 = mk_entry(F, 40, 10, 120, 20, StartTxt1, BG),
- E2 = mk_entry(F, 40, 40, 120, 20, StartTxt2, BG),
-
- Ok = mk_butt(F, 170, 10, "Ok"),
- Cn = mk_butt(F, 170, 40, "Cancel"),
- gs:config(Win, {map, true}),
-
- Ret = case catch two_entries_loop(E1, E2, Ok, Cn) of
- {P2, Msg} -> {P2, Msg};
- _Other ->
- false
- end,
- gs:destroy(Win),
- Ret.
-
-
-two_entries_loop(E1, E2, Ok, Cn) ->
- receive
- {gs, Ok, click, _, _} ->
- {gs:read(E1, text),
- gs:read(E2, text)};
- {gs, E1, keypress, _, ['Return'|_]} ->
- {gs:read(E1, text),
- gs:read(E2, text)};
- {gs, E2, keypress, _, ['Return'|_]} ->
- {gs:read(E1, text),
- gs:read(E2, text)};
- {gs, _, keypress, _, _} ->
- two_entries_loop(E1, E2, Ok, Cn);
- {gs, Cn, click, _, _} ->
- true
- end.
-
-%%--------------------------------------------------------------------
-%%
-%% Resizing routines.
-%%
-%% Resizing deals with a number of different interdependent
-%% sizes. Top size is the window size. From window size all other
-%% sizes are calculated, we call this the "leader" size. The
-%% canvas is usually the same size as the window, except for the
-%% row of buttons at the top of the windoww. The canvas is also
-%% displaced when the tree is smaller than the minimum window
-%% size.
-%%
-%%
-%% Window size - the size of the outer window. Note that
-%% provisions must be made for the button area at the top of the
-%% window, this is called WinAdj. this is the only item taht
-%% changes when the user manually resizes the window.
-%%
-%% Canvas size - The size of the canvas, should be equal to
-%% window size less the button area. Must be adjusted when the
-%% window has been manually resized. The canvas also has a
-%% scrollregion which must be maintained. Note that we could have
-%% used the canvas size as "leading" size, but this did not work
-%% since the canvas doesn't fill the complete window when the
-%% tree is smaller than the window.
-%%
-%% Tree size - The size of the tree. This may change whenever a
-%% new tree is delivered from the info routine.
-%%
-%% Dim - All these size adjustments are done in some dimension
-%% (width or height).
-%%
-%% Max, Min - The outmost window may not become larger than Max
-%% size or smaller than Min size when resized by the tree
-%% size. The user resizing is not restricted to these sizes.
-%%
-%% Scrollbars:
-%%
-%% Scrollbars are used whenever necessary, whenever the tree size
-%% is bigger than canvas size (in any dimension).
-%%
-%% Invariants:
-%%
-%% The three sizes are not varied at the same time. When the
-%% window is resized because of a new tree, then window and
-%% canvas must be updated. When the user has resized, then only
-%% the canvas must be changed (to fit in the window)
-%%
-%% Tree driven resize
-%%
-%% This occurs when the tree has been updated. The window may
-%% grow and shrink to fit the tree, but may not be smaller than
-%% Min and not bigger than Max (scrollbars will be used instead)
-%%
-
-tree_driven_resize(TWidth, THeight) ->
- gs:config(win(), {configure, false}),
- Width = TWidth+20,
- Height = scaley(THeight+1),
- put({width, tree}, Width),
- put({height, tree}, Height),
- adjust_win(width, Width),
- adjust_win(height, Height),
- fit_tree_to_win(width, Width),
- fit_tree_to_win(height, Height),
- check_scroll_region(Width, Height, gs:read(canvas(), scrollregion)),
- gs:config(win(), {configure, true}),
- ok.
-
-
-%% Will adjust the window size to the tree size (given the max and min
-%% restrictions.
-adjust_win(Dim, TreeSize) ->
- case get({Dim, user_resize}) of
- true -> ok;
- _ ->
- WinSize = gs:read(win(), Dim),%%get_dim(Dim, win()),
- case get_wanted_winsize(Dim, TreeSize) + winadj(Dim) of
- WinSize -> ok;
- NewSize ->
- %%set(Dim, win(), NewSize+winadj(Dim))
- set_old_win_size(Dim, NewSize),
- gs:config(win(), {Dim, NewSize})
- end
- end.
-
-get_wanted_winsize(Dim, Size) ->
- Max = maxsize(Dim), Min = minsize(Dim),
- if Size > Max -> Max;
- Size < Min -> Min;
- true -> Size
- end.
-
-set_old_win_size(Dim, Size) -> put({Dim, winsize}, Size).
-old_win_size(Dim) -> get({Dim, winsize}).
-
-
-%%--------------------------------------------------------------------
-%%
-%% user_driven_resize
-%%
-%% This is when the user drags the window to some size. This is
-%% basically the same as a tree resize, only this time the window
-%% itself must not be fiddled with. When the window has been
-%% resized this way then normal tree driven resize is not allow
-%% to alter the size in that dimension. User overrides.
-%%
-user_driven_resize(W, H) ->
- gs:config(win(), {configure, false}),
- check_user_resize(width, W),
- check_user_resize(height, H),
- check_scroll_region(get({width, tree}), get({height, tree}),
- gs:read(canvas(), scrollregion)),
- gs:config(win(), {configure, true}).
-
-check_user_resize(Dim, Size) ->
- case old_win_size(Dim) of
- Size -> false;
- _ ->
- put({Dim, user_resize}, true),
- set_old_win_size(Dim, Size),
- fit_tree_to_win(Dim, get({Dim, tree}))
- end.
-
-
-
-%%--------------------------------------------------------------------
-%%
-%% General resizing routines
-%%
-%% fit_tree_to_win - Will fit the canvas into a pre-sized window in
-%% one dimension.
-%%
-fit_tree_to_win(Dim, TreeSize) ->
- Size = gs:read(win(), Dim) - winadj(Dim),
- set_canvas_offset(Dim, Size, TreeSize),
- set_button_width(Dim, Size),
- if TreeSize > Size ->
- gs:config(canvas(), {trans_dim2vh(Dim), trans_dim2enable(Dim)});
- TreeSize < Size ->
- gs:config(canvas(), {trans_dim2vh(Dim), false});
- true ->
- gs:config(canvas(), {trans_dim2vh(Dim), false})
- end.
-
-
-%%------------------------------
-%% Set the canvas width and displacement in x.
-set_canvas_offset(height, Size, _) ->
- gs:config(canvas(), {height, Size});
-set_canvas_offset(width, Size, Size) ->
- gs:config(canvas(), [{x, 0}, {width, Size}]);
-set_canvas_offset(width, Size, TreeSize) when Size<TreeSize ->
- gs:config(canvas(), [{x, 0}, {width, Size}]);
-set_canvas_offset(width, Size, TreeSize) when Size>TreeSize->
- Val = trunc((Size-TreeSize)/2),
- gs:config(canvas(), [{x, Val}, {width, Size-Val}]).
-
-%%------------------------------
-%% Set the button area width
-set_button_width(height,_) -> ok;
-set_button_width(width, W) ->
- gs:config(bcanvas(), [{width, W}]),
- gs:config(bframe(), [{width, W}]),
- gs:config(bline(), [{coords, nice_line_coords(W, ?BUTTAREA_H)}]).
-
-
-%%------------------------------
-%% Update the scrollregion size if needed.
-check_scroll_region(W, H, {_, _, W, H}) -> ok;
-check_scroll_region(W, H, {_, _, _, _}) ->
- gs:config(canvas(), {scrollregion, {0, 0, W, H}}).
-
-
-%% Window sizing primitives
-winadj(width) -> 0;
-winadj(height) -> ?BUTTAREA_H.
-maxsize(width) -> ?MAXWIDTH;
-maxsize(height) -> ?MAXHEIGHT.
-minsize(width) -> ?MINWIDTH;
-minsize(height) -> ?MINHEIGHT.
-
-
-
-trans_dim2vh(width) -> hscroll;
-trans_dim2vh(height) -> vscroll.
-trans_dim2enable(width) -> bottom;
-trans_dim2enable(height) -> right.
-
-
-
-
-
-%%------------------------------------------------------------
-%% Global Window info
-
-winroot() -> get(winroot).
-win() -> get(win).
-canvas() -> get(canvas).
-bframe() -> get(bframe).
-bcanvas() -> get(bcanvas).
-bline() -> get(bline).
-set_winroot(X) -> put(winroot, X).
-set_win(X) -> put(win, X).
-set_canvas(X) -> put(canvas, X).
-set_bframe(X) -> put(bframe, X).
-set_bcanvas(X) -> put(bcanvas, X).
-set_bline(X) -> put(bline, X).
-
-sup_col() -> ?darkkhaki.
-%%work_col() -> ?orange.
-bg() -> ?palegoldenrod.
-line_col() -> ?peachpuff4. %% saddlebrown.darkgoldenrod
-f_line_col() -> ?royalblue. %% saddlebrown.darkgoldenrod
-sec_line_col() -> ?red.
-win_col() -> bg(). %%darkolivegreen.
-
-sel_col() -> ?darkgrey.
-de_sel_col() -> ?lightgrey.
-set_selected(Id)-> put(selected, Id).
-selected() -> get(selected).
-
-scaley(Y) -> 55*Y.
-radius() -> 10.
-
-destroy(undefined) -> true;
-destroy(L) when is_list(L) -> lists:foreach(fun(X) -> destroy(X) end , L);
-destroy(Win) -> gs:destroy(Win).
-
diff --git a/lib/appmon/src/appmon_dg.erl b/lib/appmon/src/appmon_dg.erl
deleted file mode 100644
index f53defa946..0000000000
--- a/lib/appmon/src/appmon_dg.erl
+++ /dev/null
@@ -1,205 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%------------------------------------------------------------
-%%
-%% Digraph handling for process view GUI. Feeble attempt at data
-%% separation. Provides functional interface to the data structures
-%% vdata and edata, v for vertex and e for edge.
-%%
-%%------------------------------------------------------------
--module(appmon_dg).
-
--include("appmon_dg.hrl").
-
-%% Exports for vertices
--export([get/3, get/2, set/4, av/3, add/4, del/2, visited/3]).
-
-%% Exports for edges
--export([eget/2, eget/3, eset/4, eadd/4, edel/2, ae/3]).
-
-%% Exports for convenience
--export([print_dg/1]).
-
-
-%%------------------------------------------------------------
-
-
-eget(all, DG) ->
- digraph:edges(DG).
-
-eget(data, DG, E) ->
- case digraph:edge(DG, E) of
- {_, _V1, _V2, Data} -> Data;
- _Other -> false
- end;
-eget(edge, DG, {V1, V2}) ->
- case digraph:edge(DG, {V1, V2}) of
- {E, W1, W2, ED} -> {E, W1, W2, ED};
- Other ->
- case digraph:edge(DG, {V2, V1}) of
- {E, W1, W2, ED} -> {E, W1, W2, ED};
- Other -> false
- end
- end;
-
-%% Weight in edge name
-eget(edge, DG, {V1, V2, Weight}) ->
- case digraph:edge(DG, {V1, V2, Weight}) of
- {E, W1, W2, ED} -> {E, W1, W2, ED};
- _Other -> false
- end;
-eget(in, DG, V) ->
- efilter(digraph:in_edges(DG, V)).
-
-efilter(Es) ->
- lists:filter(fun({_V1, _V2, primary}) -> true;
- (_E) -> false end,
- Es).
-
-eset(ref, DG, E, Ref) ->
- {E2, _V1, _V2, D} = eget(edge, DG, E),
- update_e(DG, E2, D#edata{ref=Ref});
-eset(line, DG, E, Line) ->
- {E2, _V1, _V2, D} = eget(edge, DG, E),
- update_e(DG, E2, D#edata{line=Line}).
-
-edel(DG, E) ->
- digraph:del_edge(DG, E).
-
-eadd(DG, E, D, Ref) ->
- case eget(edge, DG, E) of
- {_, _, _, ED} when is_record(ED, edata), ED#edata.ref == Ref ->
- known;
- {_, _, _, ED} when is_record(ED, edata), ED#edata.ref /= Ref ->
- update_e(DG, E, ED#edata{ref=Ref}),
- updated;
- _Other ->
- ae(DG, E, D)
- end.
-
-ae(DG, {V1, V2, Weight}, D) ->
- digraph:add_edge(DG, {V1, V2, Weight}, V1, V2, D).
-
-update_e(DG, {V1, V2, Weight}, D) ->
- digraph:del_edge(DG, {V1, V2, Weight}),
- digraph:add_edge(DG, {V1, V2, Weight}, V1, V2, D).
-
-%% Filter destination vertex from a list of edges
-vfilter(Vs) ->
- lists:map(fun({_V1, V2, _Weight}) -> V2;
- ({_V1, V2}) -> V2
- end, Vs).
-
-get(all, DG) ->
- digraph:vertices(DG).
-
-get(data, DG, {V1, V2}) ->
- case digraph:edge(DG, {V1, V2}) of
- {_,_,_,Data} -> Data;
- _Other -> false
- end;
-get(data, DG, V) ->
- case digraph:vertex(DG, V) of
- {_,Data} -> Data;
- _Other -> false
- end;
-
-%% Return all children of vertex V (those which V has edges to)
-get(out, DG, V) ->
- vfilter(efilter(digraph:out_edges(DG, V)));
-get(in, DG, V) ->
- digraph:in_neighbours(DG, V);
-get(edges, DG, V) ->
- digraph:edges(DG, V);
-get(w, DG, V) ->
- Data = get(data, DG, V),
- Data#vdata.width;
-get(x, DG, V) ->
- Data = get(data, DG, V),
- Data#vdata.x.
-
-set(type, DG, V, Type) ->
- D = get(data, DG, V),
- av(DG, V, D#vdata{type=Type});
-
-set(ref, DG, V, Ref) ->
- D = get(data, DG, V),
- av(DG, V, D#vdata{ref=Ref});
-
-set(y, DG, V, Y) ->
- D = get(data, DG, V),
- av(DG, V, D#vdata{y=Y});
-
-set(data, DG, V, D) when is_record(D, vdata)->
- av(DG, V, D);
-
-set(x, DG, V, X) ->
- D = get(data, DG, V),
- if D#vdata.x /= X ->
- av(DG, V, D#vdata{x=X});
- true -> true
- end.
-
-visited(DG, {V1, V2}, Ref) -> % for edge
- D = eget(data, DG, {V1, V2}),
- if is_record(D, edata), D#edata.ref == Ref -> true;
- true -> false
- end;
-visited(DG, V, Ref) ->
- D = get(data, DG, V),
- if is_record(D, vdata), D#vdata.ref == Ref -> true;
- true -> false
- end.
-
-add(DG, V, D, Ref) ->
- case get(data, DG, V) of
- D2 when is_record(D2, vdata), D2#vdata.ref==Ref ->
- io:format("Ooops in ~p:add vertex~n", [?MODULE]),
- known;
- D2 when is_record(D2, vdata) ->
- %%io:format("~p touch vertex ~p~n", [self(), V]),
- set(ref, DG, V, Ref),
- set(type, DG, V, D#vdata.type),
- save_coords(DG, V),
- updated;
- _Other ->
- av(DG, V, D), added
- end.
-
-save_coords(DG, V) ->
- D = get(data, DG, V),
- D2 = D#vdata{origx=D#vdata.x, origy=D#vdata.y},
- av(DG, V, D2).
-
-del(DG, V) ->
- digraph:del_vertex(DG, V).
-
-
-av(DG, V, D) ->
- digraph:add_vertex(DG, V, D).
-
-print_dg(DG) ->
- io:format("Vertices:~n", []),
- lists:foreach(fun(V) -> io:format(" ~p ~p~n",
- [V, get(data, DG, V)]) end,
- get(all, DG)),
- io:format("Edges:~n", []),
- lists:foreach(fun(V) -> io:format(" ~p ~p~n",
- [V, eget(edge, DG, V)]) end,
- eget(all, DG)),
- true.
diff --git a/lib/appmon/src/appmon_dg.hrl b/lib/appmon/src/appmon_dg.hrl
deleted file mode 100644
index c3485cf1fd..0000000000
--- a/lib/appmon/src/appmon_dg.hrl
+++ /dev/null
@@ -1,45 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-
-
-
-%%
-%% The dg package record definitions
-%%
-%% This is the declarations of the datastructures used for the
-%% application monitoring software. All fields are reserved for the
-%% implementation except those stated otherwise
-%%
-
--record(vdata, {ref, %
- type, %
- x, %
- origx=-1, %
- y, %
- origy=-1, %
- txt="", % Set by user
- width=0, % Set by user
- sym_obj=undefined, %
- txt_obj}). %
-
-
-
--record(edata, {ref, %
- line, %
- weight}). %
-
diff --git a/lib/appmon/src/appmon_lb.erl b/lib/appmon/src/appmon_lb.erl
deleted file mode 100644
index 3ab6ce58e6..0000000000
--- a/lib/appmon/src/appmon_lb.erl
+++ /dev/null
@@ -1,696 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-
-%%% Due to the fact that the application buttons in the appmon window
-%%% gets too small to read when the number of applications increases,
-%%% this listbox window has been created.
-%%% Because of the limitations of GS a listbox was chosen to keep
-%%% the nodes and applications. When it's possible to scroll a frame I
-%%% think one should put in scrollbars in the appmon main window.
-%%% The listbox solution is too slow with lots of applications.
-%%%
-%%% In the listbox the nodes are shown with their applications beneith.
-%%% By double clicking on an application name, or a single click and
-%%% then pressing the load button, its application window is started.
-
--module(appmon_lb).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
--export ([
- start/1,
- stop/1,
- add_node/2,
- remove_node/2,
- add_apps/3,
- remove_app/3,
- open_win/2,
- update_status/3
- ]).
-
--export ([init/1]).
-
--define (LB_W, 200). % List box width
--define (LB_H, 400). % List box height
--define (BUTT_W, 100).
--define (WIN_W, ?LB_W + ?BUTT_W + 25). % Window width
--define (WIN_H, ?LB_H + 20). % Window height
-
-
-%%% #node{}
-%%%
-%%% The record 'node' contains the name of the node, its status and
-%%% the applications running on that node.
-%%%
-%%% node == atom ()
-%%% status == alive || dead
-%%% apps == [#app{}]
-%%%
-
--record (node, {node, %% Name of the node
- status = alive,
- apps = []}).
-
-%%% #app{}
-%%%
-%%% The record 'app' contains the name of the application and its pid
-%%%
-%%% app == atom ()
-%%% pid == pid ()
-%%%
-
--record (app, {app,
- pid}).
-
-
-%%% #win{}
-%%%
-%%% The record 'win' contains the pid of the listbox window,
-%%% its x and y position, its width and height.
-%%%
-%%% pid == win_closed || pid ()
-%%% x == integer ()
-%%% y == integer ()
-%%% width == integer ()
-%%% height == integer ()
-%%%
-
--record (win, {pid = win_closed,
- x = 50,
- y = 50,
- width = ?WIN_W,
- height = ?WIN_H}).
-
-
-
-%%% Every function in the interface is called with the pid
-%%% of this recieve loop, called 'LbPid'.
-%%%
-
-
-%%% start /1
-%%%
-%%% start returns the pid of the spawned receive loop or
-%%% it will call exit/2 after a timeout.
-%%%
-%%% Pre:
-%%% CallingPid == pid ()
-%%%
-%%% Def:
-%%% pid () || exit/2
-%%%
-
-start (CallingPid) ->
- PidInit = spawn (?MODULE, init, [CallingPid]),
-
- %% Wait for a initialization completion message from
- %% the spawned process before returning its Pid.
-
- receive
- {initialization_complete, PidInit} ->
- PidInit
-
- %% (Conditional) Failure to start within the time limit
- %% will result in termination (Timeout may be infinite).
-
- after
- 60000 ->
- exit (PidInit, kill),
- exit ({startup_timeout, ?MODULE})
- end.
-
-
-
-%%% stop /1
-%%%
-%%% stop exits the receive loop
-%%%
-%%% Post:
-%%% exiting the receive loop
-%%%
-
-stop (LbPid) ->
- call (LbPid, stop).
-
-
-
-%%% add_node /2
-%%%
-%%% add_node adds the given node to the DB list.
-%%%
-%%% Pre:
-%%% Node == atom ()
-%%%
-%%% Post:
-%%% Node is added to the DB list
-%%%
-
-add_node (LbPid, Node) ->
- call (LbPid, {add_node, Node}).
-
-
-
-%%% remove_node /2
-%%%
-%%% remove_node removes the given node from the DB list.
-%%%
-%%% Pre:
-%%% Node == atom ()
-%%%
-%%% Post:
-%%% Node is removed from the DB list
-%%%
-
-remove_node (LbPid, Node) ->
- call (LbPid, {remove_node, Node}).
-
-
-
-%%% add_apps /3
-%%%
-%%% add_apps add the given applications to the given
-%%% node in the DB list.
-%%%
-%%% Pre:
-%%% Apps == [App]
-%%% App == {Name, Pid}
-%%% Name == atom ()
-%%% Pid == pid ()
-%%% Node == atom ()
-%%%
-%%% Post:
-%%% Node#node{apps = Apps}
-%%%
-
-add_apps (LbPid, Apps, Node) ->
- call (LbPid, {add_apps, Apps, Node}).
-
-
-
-%%% remove_app /3
-%%%
-%%% remove_app remove the given application from the
-%%% given node in the DB list.
-%%%
-%%% Pre:
-%%% App == atom ()
-%%% Node == atom ()
-%%%
-%%% Def:
-%%% Node#node{apps = OldApps - App}
-%%%
-
-remove_app (LbPid, App, Node) ->
- call (LbPid, {remove_app, App, Node}).
-
-
-
-%%% open_win /3
-%%%
-%%% open_win opens the listbox window with the given nodes
-%%% and their applications.
-%%%
-%%% Pre:
-%%% Nodes_apps == [{Node, Status, Apps}]
-%%% Node == atom ()
-%%% Status == alive || dead
-%%% Apps == [App]
-%%% App == {AppName, AppPid}
-%%% AppName == atom ()
-%%% AppPid == pid ()
-%%%
-%%% Post:
-%%% Window with listbox
-%%%
-
-open_win (LbPid, Nodes_apps) ->
- call (LbPid, {open_win, Nodes_apps}).
-
-
-
-%%% update_status /3
-%%%
-%%% update_status changes the status for the given node.
-%%%
-%%% Pre:
-%%% Node == atom ()
-%%% Status == alive || dead
-%%%
-%%% Def:
-%%% Node#node{status = Status}
-%%%
-
-update_status (LbPid, Node, Status) ->
- call (LbPid, {update_status, Node, Status}).
-
-
-
-%%% call /2
-%%%
-%%% call sends the given action to the listbox receive loop.
-%%%
-%%% Pre:
-%%% Action == atom () || tuple ()
-%%%
-
-call (LbPid, Action) ->
- LbPid ! Action.
-
-
-
-%%% init /1
-%%%
-
-init (CallingPid) ->
- CallingPid ! {initialization_complete, self ()},
- loop (#win{}, []).
-
-
-
-%%% loop /2
-%%%
-%%% loop is the recive loop for the listbox window process.
-%%%
-%%% Pre:
-%%% Win == #win{}
-%%% Data == [#node{}]
-%%%
-
-loop (Win, Data) ->
- receive
- {add_node, Node} ->
- NewData = add_node_1 (Node, Data),
- update (NewData, Win#win.pid),
- loop (Win, NewData);
-
- {remove_node, Node} ->
- NewData = dead_node (Node, Data),
- update (NewData, Win#win.pid),
- loop (Win, NewData);
-
- {add_apps, Apps, Node} ->
- NewData = add_apps_1 (Apps, Node, Data),
- update (NewData, Win#win.pid),
- loop (Win, NewData);
-
- {remove_app, App, Node} ->
- NewData = remove_app_1 (App, Node, Data),
- update (NewData, Win#win.pid),
- loop (Win, NewData);
-
- {open_win, Nodes_apps} ->
- NewData = parse_data ([], Nodes_apps),
- NewWin = Win#win{pid = init_win ({Win#win.x, Win#win.y})},
- update (NewData, NewWin#win.pid),
- loop (NewWin, NewData);
-
- {update_status, Node, Status} ->
- NewData = update_status_1 (Node, Status, Data),
- update (NewData, Win#win.pid),
- loop (Win, NewData);
-
- stop ->
- true;
-
-
- {gs, _Id, destroy, _D, _Arg} ->
- bye;
-
- {gs, _Id, configure, _D, [W, H | _]} ->
- NewWin = configure (Win#win.pid, W, H),
- loop (NewWin, Data);
-
- {gs, lb, doubleclick, _, _Txt} ->
- load_app (gs:read (lb, selection), Data),
- loop (Win, Data);
-
- {gs, lb, click, _, _Txt} ->
- loop (Win, Data);
-
- {gs, close, click, _D, _Arg} ->
- case Win#win.pid of
- win_closed ->
- true;
-
- _opened ->
- gs:destroy (Win#win.pid)
- end,
- loop (#win{}, Data);
-
- {gs, load, click, _D, _Txt} ->
- load_app (gs:read (lb, selection), Data),
- loop (Win, Data);
-
- {gs, clear, click, _D, _Txt} ->
- gs:config (lb, {selection, clear}),
- loop (Win, Data);
-
-
- _ ->
- loop (Win, Data)
- end.
-
-
-
-%%% init_win /1
-%%%
-
-init_win ({X, Y}) ->
- GS = gs:start (),
-
- Win = gs:window (win, GS, [{x, X},
- {y, Y},
- {width, ?WIN_W},
- {height, ?WIN_H},
- {title,"Appmon: nodes and applications"},
- {configure, true}]),
-
- gs:listbox (lb, Win, [{x, 5},
- {y, 10},
- {width, ?LB_W},
- {height, ?LB_H},
- {vscroll, right},
- {hscroll, bottom},
- {selectmode, single},
- {click, true},
- {doubleclick, true}]),
-
- gs:button (load, Win, [{x, ?WIN_W - ?BUTT_W - 10},
- {y, ?WIN_H - 120},
- {width, ?BUTT_W},
- {label, {text, "Load"}}]),
-
- gs:button (clear, Win, [{x, ?WIN_W - ?BUTT_W - 10},
- {y, ?WIN_H - 80},
- {width, ?BUTT_W},
- {label, {text, "Clear"}}]),
-
- gs:button (close, Win, [{x, ?WIN_W - ?BUTT_W - 10},
- {y, ?WIN_H - 40},
- {width, ?BUTT_W},
- {label, {text, "Close"}}]),
-
- gs:config (Win, {map, true}),
- Win.
-
-
-
-%%% add_node_1 /2
-%%%
-%%% add_node adds the given node in the given window
-%%% with its appications in a listbox.
-%%%
-
-add_node_1 (Node, []) ->
- [new_node (Node)];
-
-add_node_1 (Node, [H | T]) ->
- T1 = lists:keysort (#node.node, [new_node (Node) | T]),
- [H | T1].
-
-
-
-%%% dead_node /2
-%%%
-%%% dead_node returns a list with the given node's
-%%% status changed to dead.
-%%%
-
-dead_node (Node, Data) ->
- case lists:keysearch (Node, #node.node, Data) of
- {value, Node_rec} ->
- L = Node_rec#node.apps,
- lists:keyreplace (Node, #node.node,
- Data, new_node (Node, dead, L));
-
- _false ->
- Data
- end.
-
-
-
-
-
-%%% add_apps_1 /3
-%%%
-%%% add_apps_1 returns a list with the given application
-%%% into the old list inserted.
-%%%
-
-add_apps_1 (Apps, Node, Data) ->
- case lists:keysearch (Node, #node.node, Data) of
- {value, _Node_rec} ->
- NewApps = parse_apps (Apps, []),
- lists:keyreplace (Node, #node.node,
- Data, new_node (Node, NewApps));
-
- _false ->
- Data
- end.
-
-
-
-%%% remove_app_1 /3
-%%%
-%%% remove_app_1 returns a list with the given application
-%%% removed from the old list.
-%%%
-
-remove_app_1 (App, Node, Data) ->
-
- case lists:keysearch (Node, #node.node, Data) of
- {value, Node_rec} ->
- L = Node_rec#node.apps,
- L2 = lists:keydelete (App, #app.app, L),
- lists:keyreplace(Node, #node.node, Data, new_node(Node,L2));
-
- _false ->
- Data
- end.
-
-
-
-%%% configure /3
-%%%
-%%% configure returns a win record after the window has been
-%%% configured.
-%%%
-
-configure (WPid, W, H) ->
- X = gs:read (WPid, x),
- Y = gs:read (WPid, y),
-
- gs:config (lb, [{width, W - ?BUTT_W - 25}, {height, H - 20}]),
- gs:config (load, [{x, W - ?BUTT_W - 10}, {y, H - 120}]),
- gs:config (clear, [{x, W - ?BUTT_W - 10}, {y, H - 80}]),
- gs:config (close, [{x, W - ?BUTT_W - 10}, {y, H - 40}]),
-
- #win{pid = WPid, x = X, y = Y, width = W, height = H}.
-
-
-
-
-
-%%% load_app /2
-%%%
-%%% load_app opens the application window by calling
-%%% the appmon_a module.
-%%%
-
-load_app ([], _Data) -> %% no application chosen
- ok;
-
-load_app ([Index], Data) ->
- App = gs:read (lb, {get, Index}),
-
- case string:substr (App, 1, 3) of
- " " ->
- AppName = list_to_atom (string:substr (App, 4)),
-
- case get_node (AppName, Index, Data) of
- no_node ->
- ok;
-
- NodeName ->
- appmon_a:start (NodeName, AppName)
- end;
-
- _ ->
- ok
- end.
-
-
-
-%%% update_status_1 /3
-%%%
-%%% update_status_1 returns a list with the given
-%%% node's status updated.
-%%%
-
-update_status_1 (Node, Status, Data) ->
- case lists:keysearch (Node, #node.node, Data) of
- {value, Node_rec} ->
- lists:keyreplace (Node,
- #node.node,
- Data,
- new_node(Node,Status,Node_rec#node.apps));
-
- _not_found ->
- Data
- end.
-
-
-
-%%% update /2
-%%%
-%%% update updates the listbox with new data.
-%%%
-
-update (_Data, win_closed) ->
- true;
-
-update (Data, _Win) ->
- gs:config (lb, clear),
- lb_print (Data).
-
-
-
-%%% lb_print /1
-%%%
-%%% lb_print prints the list into the listbox.
-%%%
-
-lb_print ([]) ->
- ok;
-
-lb_print ([#node{node = Node, status = Status, apps = Apps} | T]) ->
- Str = io_lib:format ("~p (~p)", [Node, Status]),
- gs:config (lb, {add, Str}),
-
- case Status of
- alive ->
- lb_print_apps (Apps);
-
- _dead ->
- gs:config (lb, {add, ""}),
- ok
- end,
-
- lb_print (T).
-
-
-
-%%% lb_print_apps /1
-%%%
-%%% lb_print_apps prints the applications into the listbox.
-%%%
-
-lb_print_apps ([]) ->
- ok;
-
-lb_print_apps ([#app{app = App} | T]) ->
- Str = io_lib:format (" ~p", [App]),
- gs:config (lb, {add, Str}),
- lb_print_apps (T).
-
-
-
-%%% new_node /1, 2, 3
-%%%
-%%% new_node returna a new node record constructed
-%%% with the given data
-%%%
-
-new_node (Node) ->
- #node{node = Node}.
-
-new_node (Node, Apps) ->
- #node{node = Node, apps = Apps}.
-
-new_node (Node, Status, Apps) ->
- #node{node = Node, status = Status, apps = Apps}.
-
-
-
-%%% new_app /2
-%%%
-%%% new_app returns a new application record
-%%% constructed with the given data.
-%%%
-
-new_app (App, Pid) ->
- #app{app = App, pid = Pid}.
-
-
-
-%%% parse_apps /2
-%%%
-%%% parse_apps returns a list of application records.
-%%%
-
-parse_apps ([], [H | T]) ->
- [H | lists:keysort (#app.app, T)];
-
-parse_apps ([App | T], L) ->
- Pid = element (1, App),
- Name = element (2, App),
- parse_apps (T, [new_app (Name, Pid) | L]).
-
-
-
-%%% get_node /3
-%%%
-%%% get_node returns the node from the given list
-%%% or else no_node if it doesn't exists.
-%%%
-
-get_node (_App, _Index, []) ->
- no_node;
-
-get_node (App, Index, [Node | T]) ->
- Length = length (Node#node.apps) + 1,
-
- case Length < Index of
- true ->
- get_node (App, Index - Length, T);
-
- false ->
- Node#node.node
- end.
-
-
-
-%%% parse_data /2
-%%%
-%%% parse_data returns a list with node records.
-%%%
-
-parse_data (Data, []) ->
- Data;
-
-parse_data (Data, [{Node, Status, Apps} | T]) ->
- Apps_1 = parse_apps (Apps, []),
- parse_data ([new_node (Node, Status, Apps_1) | Data], T).
-
-
-
diff --git a/lib/appmon/src/appmon_place.erl b/lib/appmon/src/appmon_place.erl
deleted file mode 100644
index fe1e909d7c..0000000000
--- a/lib/appmon/src/appmon_place.erl
+++ /dev/null
@@ -1,192 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%------------------------------------------------------------
-%%
-%% Places a Digraph in a tree-like manner. The vertices in the digraph
-%% is updated with x and y positions. The operation is not atomic. The
-%% digraph may be cyclic but edges must then have been labeled primary
-%% or secondary and the set of primary links must make up a non-cyclic
-%% graph (a tree).
-%%
-%%
-%% IMPLEMENTATION DETAIL
-%% ---------------------
-%%
-%% The placement algorithm is straightforward, place the
-%% nodes in the vertical plane (y-plane) and then place
-%% nodes in the horisontal plane (x-plane).
-%%
-%% First all nodes are placed in the y (vertical) plane
-%% by a standard traversing of the tree. We then place
-%% the tree in the x (horisontal) plane. Each node is
-%% placed in the middle of its children as far to the
-%% left as possible, preferably at the left margin. Two
-%% things can make a node not be placed at the left
-%% margin and that is the case when a previous node has
-%% been placed at the same vertical level as the node we
-%% are trying to place (thus forcing a placement further
-%% to the right), and the second case is when the middle
-%% of the subtree of the node is not at the left margin
-%% (which it only is when the subtree is empty). The
-%% algorithm obviously depends on keeping track of the
-%% rightmost positions at all depths, and this
-%% information is also usefull when calculating the width
-%% of the tree.
-%%
-%%
-%%
-%%------------------------------------------------------------
-
-
-
--module(appmon_place).
-
--export([place/2]).
-
--include("appmon_dg.hrl").
-
-
--import(lists, [foreach/2, foldl/3]).
-
-
-place(DG, Root) ->
- case appmon_dg:get(data, DG, Root) of
- false -> [0];
- _Other ->
- placey(DG, Root, 1),
- placex(DG, Root, [])
- end.
-
-
-%%------------------------------------------------------------
-%%
-%%
-%% Placing a graph in y plane
-%% --------------------------
-%%
-%% Place nodes in the graph in the y plane rather stupidly
-%%
-
-placey(DG, V, Y) ->
- appmon_dg:set(y, DG, V, Y),
- Y1 = Y+1,
- foreach(fun(C) -> placey(DG, C, Y1) end, appmon_dg:get(out, DG, V)).
-
-
-
-
-%%------------------------------------------------------------
-%%
-%%
-%% Place a tree in the x plane
-%% ---------------------------
-%%
-%% Place nodes in the tree in the x plane. The goal of the x
-%% placement is to place all nodes as far to the left as possible
-%% while maintaining a nice tree shape.
-%%
-%% To place a node we must first place its children, the
-%% intention is to place the current node in the middle and above
-%% its children. The calc_mid function will place the node in the
-%% middle of its children. If the node should be placed further
-%% to the right than the middle of its children, then its
-%% children are moved DeltaX positions to be balanced under the
-%% node. Thus at the end the node and its children form a nice
-%% looking tree.
-%%
-%% The function also maintains the 'rightmost x on each level'
-%% list LastX by putting its own position on top of the list
-%%
-%%
-
-placex(DG, V, LastX) ->
- Ch = appmon_dg:get(out, DG, V),
- ChLX = foldl(fun(C, Accu) -> placex(DG, C, Accu) end,
- tll(LastX),
- Ch),
-
- Width = appmon_dg:get(w, DG, V),
- MyX = calc_mid(DG, Width, Ch),
- DeltaX = calc_delta(MyX, hdd(LastX)+spacex()),
-
- appmon_dg:set(x, DG, V, MyX),
- move(DG, V, [MyX+Width | ChLX], DeltaX).
-
-
-%%------------------------------------------------------------
-%%
-%%
-%% Move a subtree DeltaX positions to the right
-%% --------------------------------------------
-%%
-%% Used when moving children to balance under an already placed
-%% parent. Note that the correct LastX depends on the ordering of
-%% the children which must be the same as when the children were
-%% first placed. It must be ensured that hdd(NewLastX) is the
-%% same as hdd(NewLastX)+DeltaX. If the order of children is
-%% preserved then so is hdd(LastX). Another solution would be to
-%% set hdd(LastX) from the parent
-%%
-%% Note the two base clauses, one for the no-children case and
-%% one optimisation clause (unneccessary perhaps) for DeltaX==0
-%%
-
-move(_DG, _L, LastX, 0) -> LastX;
-move(DG, V, LastX, DeltaX) -> move2(DG, V, LastX, DeltaX).
-
-move2(DG, V, LastX, DeltaX) ->
- NewX = appmon_dg:get(x, DG, V)+DeltaX,
- appmon_dg:set(x, DG, V, NewX),
- ChLX = foldl(fun(C, LX) -> move2(DG, C, LX, DeltaX) end,
- tll(LastX),
- appmon_dg:get(out, DG, V)),
- [erlang:max(NewX+appmon_dg:get(w, DG, V), hdd(LastX)) | ChLX].
-
-
-%%------------------------------------------------------------
-%%
-%%
-%% Calculate the middle position of the children
-%% ---------------------------------------------
-%%
-%% Calculates the mid x position for a list of children. This
-%% position is later compared to the position dictated by LastX
-%% in calc_delta.
-
-calc_mid(_DG, _Width, []) -> 0;
-calc_mid(DG, Width, ChList) ->
- LeftMostX = appmon_dg:get(x, DG, hd(ChList)),
- Z2 = lists:last(ChList),
- RightMostX = appmon_dg:get(x, DG, Z2)+appmon_dg:get(w, DG, Z2),
- trunc((LeftMostX+RightMostX)/2)-trunc(Width/2).
-
-calc_delta(Mid, Right) ->
- if Right>Mid -> Right-Mid;
- true -> 0
- end.
-
-
-
-%% Special head and tail
-%% Handles empty list in a non-standard way
-tll([]) -> [];
-tll([_|T]) -> T.
-hdd([]) -> 0;
-hdd([H|_]) -> H.
-
-spacex() -> 20. % Should be macro??
diff --git a/lib/appmon/src/appmon_txt.erl b/lib/appmon/src/appmon_txt.erl
deleted file mode 100644
index 056265af90..0000000000
--- a/lib/appmon/src/appmon_txt.erl
+++ /dev/null
@@ -1,307 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%------------------------------------------------------------
-%%
-%% Simple text viewer
-%%
-%%------------------------------------------------------------
-
--module(appmon_txt).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
--export([start/0, start/1, print/1, fprint/1]).
-
-%% gen_server stuff
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2]).
-
--define(LOADTXT, "Load file").
--define(SAVETXT, "Save file").
--define(SAVEASTXT, "Save as").
--define(CLOSETXT, "Close").
--define(HELPTXT, "Help").
-
-%%------------------------------------------------------------
-%%
-%% start/0 starts an open text viewer that can be filled with
-%% whatever.
-%%
-%%------------------------------------------------------------
-start() ->
- start([]).
-
-%%------------------------------------------------------------
-%%
-%% start(ListOfOptions) starts an open text viewer with options
-%%
-%% Options can be
-%% {file, FileName} - insert contents of file
-%% locked - the text cannot be edited
-%% {text, Text} - insert text at startup
-%%
-%%------------------------------------------------------------
-start(Opts) ->
- gen_server:start_link({local, ?MODULE}, ?MODULE, Opts, []).
-
-%% Start a text viewer if necessary
-print(Txt) ->
- catch start(),
- gen_server:call(?MODULE, {add_txt, Txt}),
- ok.
-
-fprint(File) ->
- catch start(),
- gen_server:call(?MODULE, {add_file, File}),
- ok.
-
-
-%%------------------------------------------------------------
-%% gen server admin
-
-init(Opts) ->
- process_flag(trap_exit, true),
- setup_base_win(),
- default_status(),
- setup_opts(Opts),
- {ok, []}.
-
-terminate(_Reason, _State) ->
- ok.
-
-%%------------------------------------------------------------
-%% gen server stuff
-handle_call({add_txt, Txt}, _From, State) ->
- do_insert_text(Txt),
- scroll_to_last_line(),
- {reply, ok, State};
-handle_call({add_file, FileName}, _From, State) ->
- do_load_file(FileName),
- {reply, ok, State};
-handle_call(_Request, _From, State) ->
- {reply, ok, State}.
-handle_cast(_Request, State) ->
- {noreply, State}.
-handle_info({gs, _, click, _, [?CLOSETXT|_]}, State) ->
- {stop, normal, State};
-handle_info({gs, _, click, _, [?LOADTXT|_]}, State) ->
- ui_load(),
- {noreply, State};
-handle_info({gs, _, configure, _, [W, H | _]}, State) ->
- resize(W, H),
- {noreply, State};
-
-handle_info({gs, _, destroy, _, _}, State) ->
- {stop, normal, State};
-handle_info(Request, State) ->
- io:format("~p got info: ~p~n", [self(), Request]),
- print_status("Not implemented"),
- {noreply, State}.
-
-
-%%------------------------------------------------------------
-%% Handle options
-
-setup_opts([Opt|Opts]) ->
- setup_opt(Opt),
- setup_opts(Opts);
-setup_opts([]) -> ok.
-
-setup_opt(Opt) ->
- case Opt of
- {file, FileName} ->
- do_load_file(FileName);
- locked ->
- do_lock();
- {text, Text} ->
- do_insert_text(Text);
- _Other ->
- ok
- end.
-
-do_load_file(FileName) ->
- case catch i_load_file(FileName) of
- ok ->
- default_status();
- _Other ->
- print_status(lists:append(["File not found: ", FileName]))
- end.
-
-i_load_file(FileName) ->
- {ok, Bin} = file:read_file(FileName),
- L = binary_to_list(Bin),
- i_do_clear(),
- do_insert_text(L),
- ok.
-
-ui_load() ->
- Title = "Load file",
- Files = get_file_list(),
- case catch ui_list_dialog(Title, "File: ", Files) of
- {ok, FileName} ->
- do_load_file(FileName);
- _Other ->
- print_status("Load cancelled")
- end.
-
-get_file_list() ->
- case file:list_dir(".") of
- {ok, FileList} -> lists:sort(FileList);
- _Other -> []
- end.
-
-do_insert_text(Text) ->
- gs:config(editor(), {insert, {'end', Text}}),
- ok.
-
-%% Scrolls editor to show the last rows
-scroll_to_last_line() ->
- H = gs:read(editor(), size),
- R = gs:read(editor(), height),
- TopRow = H-R/15,
- if TopRow > 0 -> gs:config(editor(), {vscrollpos, TopRow});
- true -> gs:config(editor(), {vscrollpos, 0})
- end,
- ok.
-
-do_lock() ->
- gs:config(editor(), {enable, false}).
-
-i_do_clear() ->
- gs:config(editor(), clear).
-
-%%------------------------------------------------------------
-%% Graphical stuff
-
-label_h() -> 20.
-menu_h() -> 29.
-
-setup_base_win() ->
- H = 400, W=580,
- LabelHeight=label_h(), MenuHeight=menu_h(),
-
- F = gs:start([{kernel,true}]),
- set_winroot(F),
-
- Win = gs:create(window, F, [{width, W}, {height, H},
- {title,"APPMON: Process Information"}]),
-
- E = gs:create(editor, Win, [{x, 0}, {y, MenuHeight},
- {width, W},
- {height, H-MenuHeight-LabelHeight-1},
- {vscroll, right}]),
- set_editor(E),
-
- L = gs:create(label, Win, [{x, 0}, {y, H-LabelHeight},
- {height,LabelHeight }, {width, W},
- {align, w}]),
- set_status(L),
- print_status("Loading"),
-
- gs:config(Win, {map, true}),
-
- MB = gs:create(menubar, Win, []),
-
- FMB = gs:create(menubutton, MB, [{label, {text, "File"}}]),
- FM = gs:create(menu, FMB, []),
- gs:create(menuitem, FM, [{label, {text, ?CLOSETXT}}]),
-
- gs:config(Win, {configure, true}),
- ok.
-
-resize(W, H) ->
- gs:config(editor(), [{width, W}, {height, H-label_h()-menu_h()}]),
- gs:config(status(), [{y, H-label_h()}, {width, W}]),
- ok.
-
-%%------------------------------------------------------------
-%% ui_list_dialog(
-%%
-%% Traditional dialog with a list box and a selection field that
-%% is updated from the list box.
-%%
-%% Returns {ok, String} if successful and something else if not
-%%
-%% Title - the name of the window
-%% LeadText - the lead text on the selection field
-%% List - a list of items that will be displayed in the list box
-%%
-%%------------------------------------------------------------
-
-ui_list_dialog(Title, LeadText, TxtList) ->
- W = 200, H = 300,
-
- Win = gs:create(window, winroot(), [{title, Title},
- {width, W},{height, H}]),
- Ok = gs:create(button, Win, [{x, 10}, {y,10},
- {width, 50}, {height, 20},
- {label, {text, "Ok"}}]),
- Cn = gs:create(button, Win, [{x, 70}, {y,10},
- {width, 50}, {height, 20},
- {label, {text, "Cancel"}}]),
-
- gs:create(label, Win, [{x, 10}, {y, 50},
- {width, 60}, {height, 20},
- {label, {text, LeadText}}]),
- Box = gs:create(entry, Win, [{x, 10}, {y, 70},
- {width, 160}, {height, 20},
- {keypress, true}]),
- List = gs:create(listbox, Win, [{x, 10}, {y, 100}, {width, 180},
- {height, 190},
- {items, TxtList}, {vscroll, right},
- {hscroll, false}, {click, true},
- {doubleclick, true},
- {keypress, true}]),
- gs:config(Win, {map, true}),
-
- RetVal = ui_load_loop(Box, List, Ok, Cn),
-
- gs:destroy(Win),
-
- RetVal.
-
-ui_load_loop(Box, List, Ok, Cn) ->
- receive
- {gs, Box, keypress, _, ['Return'|_]} ->
- {ok, gs:read(Box, text)};
- {gs, Box, keypress, _, _} ->
- ui_load_loop(Box, List, Ok, Cn);
- {gs, Ok, click, _, _} ->
- {ok, gs:read(Box, text)};
- {gs, List, doubleclick, _, [_Idx, Txt|_]} ->
- {ok, Txt};
- {gs, List, click, _, [_Idx, Txt|_]} ->
- gs:config(Box, {text, Txt}),
- ui_load_loop(Box, List, Ok, Cn);
- _Other ->
- something_else
- end.
-
-%% The status row at the bottom of the window
-set_status(Id) -> put(status_row, Id).
-status() -> get(status_row).
-print_status(Msg) -> gs:config(get(status_row), {label, {text, Msg}}).
-default_status() -> print_status("Done").
-
-set_editor(X) -> put(editor, X).
-editor() -> get(editor).
-
-winroot() -> get(winroot).
-set_winroot(X) -> put(winroot, X).
diff --git a/lib/appmon/src/appmon_web.erl b/lib/appmon/src/appmon_web.erl
deleted file mode 100644
index 048f7fa165..0000000000
--- a/lib/appmon/src/appmon_web.erl
+++ /dev/null
@@ -1,1031 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2011. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%%---------------------------------------------------------------------
-%%% File : webappmon.erl
-%%% Author : Martin G. <[email protected]>
-%%% Purpose : Frontend to the webbased version of appmon.
-%%% Created : 24 Apr 2001 by Martin G. <[email protected]>
-%%%---------------------------------------------------------------------
-
--module(appmon_web).
-
-%% The functions that the user can call to interact with the genserver
--export([init/1,handle_call/3,handle_cast/2,handle_info/2]).
--export([terminate/2,code_change/3]).
-
--export([node_info/2,application_info/2,application_env/2]).
--export([proc_info/2,trace/2]).
--export([start/0,stop/0,start_link/0]).
-
-%% Export the function that returns the configuration data needed by
-%% webtool
--export([configData/0]).
-
--behaviour(gen_server).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Start the genserver %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-start_link()->
- gen_server:start_link({local,webappmon_server},appmon_web,[],[]).
-start()->
- gen_server:start({local,webappmon_server},appmon_web,[],[]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Stop the genserver %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-stop()->
- gen_server:call(webappmon_server,stop,1000).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Get the page that shows the nodes and the apps on the sel node %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-node_info(Env,Input)->
- gen_server:call(webappmon_server,{node_data,Env,Input}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Get the application process tree %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-application_info(Env,Input)->
- gen_server:call(webappmon_server,{app_data,Env,Input}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Get the page that shows the data about the process %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-proc_info(Env,Input)->
- gen_server:call(webappmon_server,{proc_data,Env,Input}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Get the spec on the app %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-application_env(Env,Input)->
- gen_server:call(webappmon_server,{app_env,Env,Input}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Toggle the trace flag for the selected process %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-trace(Env,Input)->
- gen_server:call(webappmon_server,{trace,Env,Input}).
-
-configData()->
- {appmon,[{web_data,{"WebAppmon","/appmon/main_frame.html"}},
- {alias,{"/appmon",code:priv_dir(appmon)}},
- {alias,{erl_alias,"/erl",[appmon_web]}},
- {start,{child,{backend,{process_info,start_link,[]},
- permanent,100,worker,[process_info]}}},
- {start,{child,{{local,webappmon_server},
- {appmon_web,start_link,[]},
- permanent,100,worker,[appmon_web]}}}
- ]}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-% Callback functions for the genserver %
-% %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-init(_Arg)->
- {ok,[]}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Create the different pages %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-handle_call({node_data,_Env,Input},_From,State)->
- {reply,app_and_node_sel_page(Input),State};
-
-handle_call({app_data,_Env,Input},_From,State)->
- {reply,process_tree_page(Input),State};
-
-handle_call({proc_data,_Env,Input},_From,State)->
- {reply,process_specifickation_page(Input),State};
-
-handle_call({app_env,_Env,Input},_From,State)->
- {reply,application_specifickation_page(Input),State};
-
-handle_call({trace,_Env,Input},_From,State)->
- {reply,toggle_trace(Input),State}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Shutdown the genserver %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-terminate(_,_State)->
- ok.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% Callback function currently not used ... %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-handle_cast(_,State)->
- {noreply,State}.
-
-handle_info(_,State)->
- {noreply,State}.
-
-code_change(_OldVsn,State,_Extra)->
- {ok,State}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% %%
-%% Private functions to create the part of the sides that is common %%
-%% to all sides %%
-%% %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the Header for the page If we now the mimetype use that type%%
-%% otherwise use text %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-header() ->
- header("text/html").
-header(MimeType) ->
- "Content-type: " ++ MimeType ++ "\r\n\r\n".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the Htmlheader sett the title of the side to nothing if %%
-%% we dont know the name of the side %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-html_header()->
- html_header("").
-
-html_header(Part) ->
- "<HTML BGCOLOR=\"#FFFFFF\">\n" ++
- "<HEAD>\n" ++
- "<TITLE>Appmon " ++ Part ++ "</TITLE>\n" ++
- "</HEAD>\n".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Close the Html tag and if neccessay add some clean upp %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-html_end()->
- "</HTML>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% %%
-%% The functions that creates the whole pages by collecting %%
-%% the necessary data %%
-%% %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Returns the page where the user see's which nodes and apps that %%
-%% are availible for monitoring %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-app_and_node_sel_page(Input)->
- [header(),
- html_header(),
- node_body(httpd:parse_query(Input)),
- html_end()].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Returns the process tree for the application whose name is %%
-%% the first value in the Inputs key/value list %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_tree_page(Input)->
- [header(),
- html_header(),
- application_javascript(httpd:parse_query(Input)),
- application_body(httpd:parse_query(Input)),
- html_end()].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Send trace on or off to the process thats pid is the third arg of %%
-%% the inputs key/val list. Then it returns the process tree for the %%
-%% the application that is the first key/val pair of input %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-toggle_trace(Input)->
- send_trace(httpd:parse_query(Input)),
- [header(),
- html_header(),
- application_javascript(httpd:parse_query(Input)),
- application_body(httpd:parse_query(Input)),
- html_end()].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Creates the page that shows all information about the process that %%
-%% that is the first arg of th input key/val pairs %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_specifickation_page(Input)->
- [header(),
- html_header(),
- process_body(httpd:parse_query(Input)),
- html_end()].
-
-application_specifickation_page(Input)->
- [header(),
- html_header(),
- application_env_body(httpd:parse_query(Input)),
- html_end()].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The Private functions that do the job %%
-%% To build the the page that shows the applications %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Build the body of the side that shows the node name and %%
-%% the application list %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-node_body([{"node",Node}|_Rest])->
- case process_info:is_node(Node) of
- {true,Controlled_node,Name} ->
- "<BODY BGCOLOR=\"#FFFFFF\">" ++
- node_selections_javascripts() ++
- node_selection(Controlled_node) ++
- node_title() ++
- application_tree(Controlled_node,Name) ++
- "</BODY>";
-
- {false,Server_node,Name} ->
- "<BODY BGCOLOR=\"#FFFFFF\">" ++
- node_selections_javascripts() ++
- node_selection(Server_node) ++
- node_title() ++
- application_tree(Server_node,Name) ++
- "</BODY>"
- end;
-
-node_body(_Whatever)->
- node_body([{atom_to_list(node),atom_to_list(node())}]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Returns the javascript that sets a new node to monitor %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-node_selections_javascripts()->
- "<SCRIPT>
- function node_selected()
- {
- parent.frames.base_frames.location=\"../../appmon/start_info.html\"
- window.location =\"./node_info?node=\" + " ++
- "document.node_selection.nodes[document.node_selection.nodes.selectedIndex].value;
- }
- </SCRIPT>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Insert the html code that shows the combobox where the user can %%
-%% select another node to monitor %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-node_selection(Node)->
- " <FORM ACTION=\"./node_info\" NAME=node_selection>\n
- <TABLE WIDTH=\"100%\" BORDER=\"0\">\n
- <TR><TD ALIGN=\"center\">\n
- <SELECT NAME=nodes onChange=\"node_selected()\">\n" ++
- print_nodes(order_nodes(Node,process_info:get_nodes())) ++
- "</SELECT>\n
- </TD></TR>\n
- </TABLE>\n
- </FORM>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Add the node we are working with in the beginning of the list and %%
-%% remove it from other places so its always the first in the listbox %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-order_nodes(Node,Node_list)->
- [Node|lists:delete(Node,Node_list)].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Take the list of nodes and make it to a list of options to the %%
-%% the combobox %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-print_nodes([])->
- [];
-print_nodes([Node|Rest])->
- "<OPTION value=\"" ++
- atom_to_list(Node) ++
- "\">" ++
- atom_to_list(Node) ++
- "\n" ++
- print_nodes(Rest).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the header of the node info page i.e. the name of the node %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-node_title()->
- " <TABLE WIDTH=\"100%\" BORDER=\"0\">
- <TR><TD ALIGN=\"center\"><FONT SIZE=5>Applications</FONT></TD></TR>
- </TABLE>\n".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Build the body of the side that shows the node i.e the application %%
-%% list %%
-%% Node and Node_name are the same just different types %%
-%% Node are the atom Node_name the string of the node name %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-application_tree(Node,Node_name)->
- Fun=fun(Name)->
- Name_str =atom_to_list(Name),
- "<LI><A HREF=\"./application_info?name=" ++ Name_str ++
- "&mode=all&node=" ++ Node_name ++
- "\" TARGET=main><B>" ++ Name_str ++
- "</B></A>" ++ print_space(15-length(Name_str),[]) ++
- "<A HREF=\"./application_env?name=" ++ Name_str ++
- "&node=" ++ Node_name ++
- "\" TARGET=\"main\"><FONT SIZE=2>spec</FONT></A></LI>\n"
- end,
- "<UL>" ++
- lists:map(Fun, (process_info:get_applications(Node))) ++
- "</UL>" ++
- "<FORM Name=reload>" ++
- "<INPUT TYPE=\"button\" onClick=\"node_selected()\"
- VALUE=\"Reload\">\n" ++
- "</FORM>" ++
- "<!--<A HREF=\"../../appmon/application_help.html\" TARGET=main>Help</A>-->".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Print spaces between the application name and the spec link %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-print_space(N,Space)when N >0 ->
- print_space(N-1,"&nbsp;" ++ Space);
-print_space(_N,Space)->
- Space.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The Private functions that do the job %%
-%% To build the the page that shows process in an application %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%Generates the javascript that govern the look of the page that %%
-%%the processes of an application %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%Args is the list whit input args should be App Mode, Node
-application_javascript(Args)when length(Args)>=3 ->
- Vars=
- "<SCRIPT>
- var proc;
- var app=\"" ++ element(2,lists:nth(1,Args)) ++ "\";
- var node=\"" ++ element(2,lists:nth(3,Args)) ++ "\";",
- CommonFuncs=
- " function reload_bottom_frame()
- {parent.proc_data.location.href=\"/appmon/blank.html\";}
-
- function show_process_info()
- {
- if(proc.indexOf(\"#Port\")== -1)
- {
- if(proc.charAt(0)==\'<\')
- window.location=\"./proc_info?name=\" + proc + \"&node=\" + node
- else
- {
- start=proc.indexOf(\"<\");
- endpoint=proc.lastIndexOf(\">\");
- window.location=\"./proc_info?name=\" + proc.slice(start,endpoint+1) + \"&node=\" + node ;
- }
- }
- }
-
- function trace()
- {
- if(proc.charAt(0)==\'<\')
- window.location=\"./trace?name=\" + app + \"&mode=\" + get_mode() + \"&node=\" + node + \"&proc=\" + proc;
- else
- {
- start=proc.indexOf(\"<\");
- endpoint=proc.lastIndexOf(\">\");
- window.location=\"./trace?name=\" + app + \"&mode=\" + get_mode() + \"&node=\" + node + \"&proc=\" +
- proc.slice(start,endpoint+1) ;
- }
-
- }
-
- function reload_page()\n
- {
- window.location=\"./application_info?name=\" + app + \"&mode=\" + get_mode() + \"&node=\" + node ;
- }
- function get_mode()
- {
- for (i= 0; i < document.reload_form.mode.length; i++)
- {
- if (document.reload_form.mode[i].checked)
- return(document.reload_form.mode[i].value);
- }
- return(\"all\");
- }",
- Vars++CommonFuncs++"</SCRIPT>";
-application_javascript(_)->
- "<SCRIPT></SCRIPT>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the body i.e the process tree for the applications whose %%
-%% name is the second arg in the first tuple %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%args is the list [{_,Appname},{_,Mode},{_Node}]
-application_body(Args) when is_list(Args),length(Args) >= 3 ->
- App=element(2,lists:nth(1,Args)),
- Mode=element(2,lists:nth(2,Args)),
- Node=element(2,lists:nth(3,Args)),
- "<BODY BGCOLOR=\"FFFFFF\" onLoad=reload_bottom_frame() >"
- ++ mode_selection(Mode) ++
- selected_app_header(App,Node) ++ process_tree(App,Mode,Node)++
- "</BODY>";
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% If the pattern above ain't match then something is wrong %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-application_body(_Whatever)->
- "Please use the links to the left".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the part of the process tree page side where the user can %%
-%% select the mode the view the tree in. %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-mode_selection(Mode)->
- "<FORM NAME=\"reload_form\">\n" ++
- "<TABLE>" ++
- "<TR>\n" ++
- "<!--<TD><INPUT TYPE=\"button\" NAME=\"refresh_but\" VALUE=\"Reload\" onClick=\"reload_page()\">
- &nbsp;&nbsp;&nbsp;&nbsp;</TD>\n-->" ++
- print_radio_buttons([{"all","All processes"},{"sup_child","Supervised processes"},
- {"sup","Only supervisors"}],Mode) ++
- "</TR>\n </TABLE>\n" ++
- "</FORM>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Print the radiobuttons. if the mode is the one the current %%
-%% radiobutton represent set the one checked %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-print_radio_buttons([],_)->
- [];
-print_radio_buttons([{Mode,Name}|Rest],Mode)->
- "<TD><INPUT TYPE=\"radio\" NAME=\"mode\" CHECKED=\"true\" VALUE=\""++
- Mode ++"\" onClick=\"reload_page()\">&nbsp;&nbsp;" ++Name ++
- "</TD>\n" ++ print_radio_buttons(Rest,Mode);
-print_radio_buttons([{Mode1,Name}|Rest],Mode)->
- "<TD><INPUT TYPE=\"radio\" NAME=\"mode\" VALUE=\""++ Mode1 ++
- "\" onClick=\"reload_page()\">&nbsp;&nbsp;" ++ Name ++
- "</TD>\n" ++
- print_radio_buttons(Rest,Mode).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The part that shows the name of the application that the process %%
-%% tree represent %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-selected_app_header(App,Node)->
- {Year,Mon,Day}=date(),
- "<TABLE>
- <TR>
- <TD>Node:</TD>
- <TD>" ++Node ++"</TD>
- </TR>
- <TR>
- <TD>Application:</TD>
- <TD>" ++App ++"</TD>
- </TR>
- <TR>
- <TD>Date:</TD>
- <TD>" ++ integer_to_list(Day) ++ "/" ++
- integer_to_list(Mon) ++"&nbsp;-&nbsp;"++
- integer_to_list(Year) ++
- "</TD>
- </TR>
- </TABLE>
- <TABLE WIDTH=100%>
- <TR>
- <TD>
- <HR WIDTH=\"80%\">
- <!--<FONT SIZE=4>Process tree</FONT>
- <HR ALIGN=\"center\" WIDTH=\"80%\">-->
- </TD>
- </TR>
- </TABLE>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%%get the process tree from process_info and build the nested %%
-%% unordered list that represent the applications process tree %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_tree(App,Mode,Node)->
- case process_info:get_processes(list_to_atom(App),
- list_to_atom(Mode),
- list_to_atom(Node)) of
- unknown->
- "Unknown application please update application tree";
- {Tree,Traced_dict} ->
- "<UL>" ++
- htmlify_tree(Tree,Traced_dict,1,Node,Mode,App) ++
- "</UL>"
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Build each node in the tree and then build its children %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-htmlify_tree({Pid,Childs,Childs2},Proc_tab,N,Node,Mode,App)->
- case ets:lookup(Proc_tab,Pid) of
- [] when N<3->
- print_pid(Pid,Node,Mode,App,notrace)++
- htmlify_prim_child(Childs,Proc_tab,N+1,Node,Mode,App) ++
- htmlify_sec_child(Childs2);
- [_Traced]->
- print_pid(Pid,Node,Mode,App,"<FONT SIZE=2 COLOR=\"firebrick\">Stop Trace</FONT>")++
- htmlify_prim_child(Childs,Proc_tab,N+1,Node,Mode,App) ++
- htmlify_sec_child(Childs2);
- []->
- print_pid(Pid,Node,Mode,App,"<FONT SIZE=2>Start Trace</FONT>")++
- htmlify_prim_child(Childs,Proc_tab,N+1,Node,Mode,App) ++
- htmlify_sec_child(Childs2)
- end.
-
-print_pid(Pid,Node,_Mode,_App,notrace)->
- "<LI><A TARGET=\"proc_data\" STYLE=\"text-decoration:none; color:blue\" HREF=\"./proc_info?name=" ++ urlify_pid(Pid) ++
- "&node="++ Node ++" \" >"++ htmlify_pid(Pid,[]) ++
- "</A>";
-
-print_pid([$P,$o,$r,$t|Rest],_Node,_Mode,_App,_TrMode)->
- "<LI>" ++ htmlify_pid([$P,$o,$r,$t|Rest],[]);
-
-print_pid(Pid,Node,Mode,App,TrMode)->
- "<LI><A TARGET=\"proc_data\" STYLE=\"text-decoration:none; color:blue\" HREF=\"./proc_info?name=" ++
- urlify_pid(Pid) ++ "&node="++ Node ++" \" >"++
- htmlify_pid(Pid,[]) ++ "</A>"++
- "&nbsp;&nbsp;&nbsp
- <A HREF=\"./trace?app="++App++"&mode="++Mode++
- "&node="++Node++"&proc="++urlify_pid(Pid)++"\">
- "++TrMode++"</A>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Change the '<' sign and the '>' sign to the html representation %%
-%% of the sign %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-htmlify_pid([60|Pid],New)->
- htmlify_pid(Pid,";tl&"++New);
-htmlify_pid([139|Pid],New)->
- htmlify_pid(Pid,";tl&"++New);
-
-htmlify_pid([62|Pid],New)->
- htmlify_pid(Pid,";tg&"++New);
-htmlify_pid([155|Pid],New)->
- htmlify_pid(Pid,";tg&"++New);
-htmlify_pid([Chr|Pid],New)->
- htmlify_pid(Pid,[Chr|New]);
-htmlify_pid([],New)->
- lists:reverse(New).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Change the < and > sign to the representation of the signs in %%
-%% the HTTP protocol %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-urlify_pid(Pid) ->
- case re:run(Pid,"[<](.*)[>]",[{capture,all_but_first,list}]) of
- {match,[PidStr]}->
- "%3C"++PidStr++"%3E";
- _->
- Pid
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Change the < and > sign from the representation of the signs in %%
-%% the HTTP protocol %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-unurlify_pid(Pid)->
- unurlify_pid(Pid,[]).
-
-unurlify_pid([$%,$3,$C|Rest],New)->
- unurlify_pid(Rest,[60|New]);
-
-unurlify_pid([$%,$3,$E|Rest],New)->
- unurlify_pid(Rest,[62|New]);
-unurlify_pid([Chr|Rest],New)->
- unurlify_pid(Rest,[Chr|New]);
-
-unurlify_pid([],New)->
- lists:reverse(New).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Make html of the list of primary childs %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-htmlify_prim_child([],_Proc_tab,_N,_Node,_Mode,_App)->
- [];
-
-htmlify_prim_child(Childs,Proc_tab,N,Node,Mode,App)->
- Fun=fun(Child)->
- htmlify_tree(Child,Proc_tab,N,Node,Mode,App)
- end,
- "<UL>\n" ++ lists:map(Fun,Childs) ++ "</UL>\n".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Make html of hte list whit sedondary childs, they has no childs %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-htmlify_sec_child([])->
- [];
-
-htmlify_sec_child(Sec_child_list)->
- Htmlify_child=fun(Pid1)->
- "<LI><FONT COLOR=\"#FF2222\">" ++ Pid1 ++
- "</FONT></LI>\n"
- end,
- "<UL>" ++ lists:map(Htmlify_child,Sec_child_list) ++ "</UL>\n".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The Private functions that do the job %%
-%% To build the the page that shows process data %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The function that creates the collects the various part of %%
-%% the side that shows information about a specific process, %%
-%% Pid_name should be the list representation of a pid %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_body(Args) when length(Args)==2->
- Pid=element(2,lists:nth(1,Args)),
- Node=element(2,lists:nth(2,Args)),
- "<BODY BGCOLOR=\"#FFFFFF\">" ++
- process_information_table(Pid,Node) ++ "</BODY>";
-
-process_body(_)->
- "<BODY BGCOLOR=\"#FFFFFF\">Please dont call this side manually</BODY>".
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the table that shows the name of the pid to show extended %%
-%% info about %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Get the table that shows the extended info about a process %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-process_information_table(Pid_name,Node)->
- PidID=unurlify_pid(Pid_name),
- case catch list_to_pid(PidID) of
- Pid when is_pid(Pid) ->
- get_process_table(Pid,Node);
- _Other ->
- io_lib:format("Not a process id ~s",[PidID])
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Create the table that shoows the extended info about processes %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-get_process_table(Pid,Node_name) when is_list(Node_name)->
- Node=list_to_atom(Node_name),
- get_process_table(Pid,Node);
-
-get_process_table(Pid,Node) when is_atom(Node)->
- case lists:member(Node,[node()|nodes()]) of
- true->
- Proc_data=process_info:get_process_data(Pid,Node),
- "<TABLE BORDER=1 >
- <TR BGCOLOR=\"#8899AA\"><TD COLSPAN=6 ALIGN=\"center\" >
- <FONT size=4> Process" ++
- htmlify_pid(pid_to_list(Pid),[]) ++ "</FONT>
- </TD></TR>" ++
- start_process_proc_data(Proc_data) ++
- "</TABLE><BR><BR>";
- _ ->
- "Please try again the Node dont exists"
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The process information is quite messy tidi it up by creating a %%
-%% table that looks like key val %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-start_process_proc_data(Proc_data)->
- %%Pic out the special cases the links and the process dict
- {Special,Usual}=split_proc_data(Proc_data),
- Usual2=append_empty(Usual),
- UsualProcData=process_proc_data(Usual2,0),
- SpecProcData=process_proc_data(Special),
- UsualProcData++SpecProcData.
-
-append_empty(List) when length(List) rem 2 == 0 ->
- List;
-append_empty(List)->
- append_empty(lists:append(List,[empty])).
-
-split_proc_data(Proc_data)->
- Spec=lists:map(fun(Key)->
- case lists:keysearch(Key,1,Proc_data) of
- {value,Data}->
- Data;
- _ ->
- not_included
- end
- end,[links,dictionary,messages]),
- Spec2=clear(Spec,[]),
- Usual=lists:filter(fun({Key,_Val})->
- case Key of
- messages ->
- false;
- links ->
- false;
- dictionary ->
- false;
- _ ->
- true
- end
- end,Proc_data),
- {Spec2,Usual}.
-
-clear([],New)->
- New;
-clear([not_included|Spec],New)->
- clear(Spec,New);
-clear([Other|Spec],New)->
- clear(Spec,[Other|New]).
-
-process_proc_data(Data,3)->
- "</TR>"++process_proc_data(Data,0);
-process_proc_data([],_N)->
- [];
-process_proc_data(Data,0)->
- "<TR>"++process_proc_data(Data,1);
-
-process_proc_data([empty|Data],N)->
- "<TD>&nbsp;</TD><TD>&nbsp;</TD> "++process_proc_data(Data,N+1);
-
-process_proc_data([{current_function,MFA}|Rest],N)->
- "<TD NOWRAP=true><FONT SIZE=3><B>Current function:</B></TD><TD><FONT SIZE=3>"++
- io_lib:format("~p",[MFA]) ++"</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{error_handler,Mod}|Rest],N)->
- "<TD NOWRAP=\"true\"><B><FONT SIZE=3>Error handler:</B></TD><TD><FONT SIZE=3>"
- ++ atom_to_list(Mod) ++ "</TD>\n" ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{group_leader,Grp}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Group leader:</B></TD><TD><FONT SIZE=3>" ++
- htmlify_pid(pid_to_list(Grp),[]) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{heap_size,Size}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Heap size:</B></TD><TD><FONT SIZE=3>"
- ++ integer_to_list(Size) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{initial_call,MFA}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Initial call:</B></TD><TD><FONT SIZE=3>"++
- io_lib:format("~p",[MFA]) ++"</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{message_queue_len,Size}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Message queue length:</B></TD><TD><FONT SIZE=3>" ++
- integer_to_list(Size) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{priority,Level}|Rest],N)->
- "<TD><FONT SIZE=3><B>Process priority:</B></TD><TD><FONT SIZE=3>" ++
- atom_to_list(Level) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{reductions,Number}|Rest],N)->
- "<TD ><FONT SIZE=3><B>Number of executed reductions:</B></TD>
- <TD><FONT SIZE=3>" ++ integer_to_list(Number) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{registered_name,Name}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Process Name:</B></TD><TD><FONT SIZE=3>"
- ++ atom_to_list(Name) ++ "</TD>\n" ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{stack_size,Size}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Stack size:</B></TD><TD><FONT SIZE=3>"
- ++ integer_to_list(Size) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{status,Status}|Rest],N)->
- "<TD NOWRAP=\"true\"><FONT SIZE=3><B>Process status:</B></TD><TD><FONT SIZE=3>"
- ++ atom_to_list(Status) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{trap_exit,Boolean}|Rest],N)->
- "<TD NOWRAP=\"true\" ><FONT SIZE=3><B>Trap Exit:</B></TD><TD><FONT SIZE=3>"
- ++ atom_to_list(Boolean) ++ "</TD>\n " ++
- process_proc_data(Rest,N+1);
-
-process_proc_data([{Key,Val}|Rest],N)->
- "<TD NOWRAP=\"true\" ><FONT SIZE=3><B>" ++ io_lib:write(Key) ++
- "</B></TD><TD><FONT SIZE=3>" ++ io_lib:write(Val) ++
- "</TD>\n " ++
- process_proc_data(Rest,N).
-
-process_proc_data([])->
- [];
-process_proc_data([{links,List_of_pids}|Rest])->
- "<TR><TD NOWRAP=\"true\"><FONT SIZE=3><B>Links:</B></TD><TD COLSPAN=5><FONT SIZE=3>"++ print_links(List_of_pids) ++"</TD></TR>\n " ++
- process_proc_data(Rest);
-
-process_proc_data([{messages,Queue}|Rest])->
- "<TR><TD NOWRAP=\"true\"><FONT SIZE=3><B>Message Queue:</B></TD><TD COLSPAN=5><FONT SIZE=3>" ++ io_lib:write(Queue) ++ "</TD></TR>\n " ++
- process_proc_data(Rest);
-
-process_proc_data([{dictionary,Dict}|Rest])->
- "<TR><TD NOWRAP=\"true\"><FONT SIZE=3><B>Process dictionary:</B></TD><TD COLSPAN=5><FONT SIZE=3>&nbsp;</TD></TR>\n " ++
- get_dictionary_data(Dict) ++
- process_proc_data(Rest).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% In the process info there are the links to other processes print %%
-%% this pid %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-print_links(Pids)->
- print_links(Pids,[]).
-
-print_links([],Links)->
- htmlify_pid(Links,[]);
-
-print_links([Pid],Links) when is_pid(Pid) ->
- print_links([],Links ++ pid_to_list(Pid));
-
-print_links([Pid],Links) when is_port(Pid) ->
- print_links([],Links ++ erlang:port_to_list(Pid));
-
-print_links([Pid|Rest],Links) when is_pid(Pid) ->
- print_links(Rest,Links ++ pid_to_list(Pid) ++ ", ");
-
-print_links([Pid|Rest],Links) when is_port(Pid) ->
- print_links(Rest,Links ++ erlang:port_to_list(Pid) ++ ", ").
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Fix the data in the process dictionary %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-get_dictionary_data([])->
- [];
-
-get_dictionary_data([{Key,Val}|Dict])->
- FormatedVal=add_space(htmlify_pid(lists:flatten(fix_type(Val)),[])),
- "<TR><TD><FONT SIZE=3>" ++
- htmlify_pid(lists:flatten(fix_type(Key)),[]) ++
- "</TD><TD COLSPAN=5><FONT SIZE=3>" ++
- FormatedVal++ "</TD></TR>\n" ++
- get_dictionary_data(Dict).
-
-add_space(List)->
- add_space(List,0,[]).
-add_space([],_Len,New) ->
- lists:reverse(New);
-add_space([Char|Rest],Len,New)when Len<50 ->
- add_space(Rest,Len+1,[Char|New]);
-
-add_space([$\,|Rest],_Len,New) ->
- add_space(Rest,0,[$\ ,$,|New]);
-
-add_space([Char|Rest],Len,New) ->
- add_space(Rest,Len+1,[Char|New]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Interpret the type of the data and make it to a list %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-fix_type(Val) when is_atom(Val) ->
- atom_to_list(Val);
-fix_type(Val) when is_float(Val) ->
- float_to_list(Val);
-fix_type(Val) when is_integer(Val) ->
- integer_to_list(Val);
-fix_type(Val) when is_list(Val) ->
- case io_lib:printable_list(Val) of
- true->
- case Val of
- []->
- io_lib:write(Val);
- _->
- Val
- end;
- _->
- io_lib:write(Val)
- end;
-fix_type(Val) when is_pid(Val) ->
- pid_to_list(Val);
-fix_type(Val) when is_port(Val) ->
- erlang:port_to_list(Val);
-fix_type(Val) when is_tuple(Val) ->
- io_lib:write(Val);
-fix_type(_Val) ->
- [].
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% The Private functions that send the trace signal to the process %%
-%% thats the 4 member of the Arg list %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-send_trace(Args)when length(Args)>=4->
- {_,Proc}=lists:nth(4,Args),
- Pid2=unurlify_pid(Proc),
- process_info:send_trace(Pid2);
-
-send_trace(_Args)->
- arg_error.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Private functions that prints the application environment %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-application_env_body(Args)when length(Args)>=2 ->
- App=element(2,lists:nth(1,Args)),
- Node=element(2,lists:nth(2,Args)),
- "<SCRIPT>
- function reload_bottom_frame()
- {parent.proc_data.location.href=\"/appmon/blank.html\";}
- </SCRIPT>
- <BODY BGCOLOR=\"#FFFFFF\" onLoad=reload_bottom_frame()>"
- ++ application_env_table(App,Node) ++ "</BODY>";
-
-application_env_body(_)->
- "<BODY BGCOLOR=\"#FFFFFF\">Please dont call this side manually</BODY>".
-
-application_env_table(App,Node)->
- case process_info:get_application_keys(list_to_atom(App),
- list_to_atom(Node)) of
- {ok,List}->
- "<TABLE BORDER=1>" ++ application_env_head(App,Node) ++
- print_key_list(List,[]) ++ "</TABLE>";
- _ ->
- "Please try again,something went wrong"
- end.
-
-application_env_head(App,Node)->
- "<TR BGCOLOR=\"#8899AA\"><TD ALIGN=\"center\" COLSPAN=3>
- <FONT SIZE=6>" ++ App ++ "@" ++ Node ++ "</FONT>\n
- </TD></TR>
- <TR><TD COLSPAN=3>&nbsp</TD></TR>
- <TR BGCOLOR=\"#8899AA\">
- <TD><B>Key</B></TD><TD><B>Val/Sec. key</B></TD><TD><B>Sec. Val</B></TD>
- </TR>".
-
-print_key_list([],Result)->
- Result;
-
-print_key_list([{application,Name}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("Application name :",Name));
-
-print_key_list([{description,Desc}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("Description :",Desc));
-
-print_key_list([{vsn,Ver}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("Version :",Ver));
-
-print_key_list([{id,Id}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("ID:",fix_type(Id)));
-
-print_key_list([{modules,Mods}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("Modules:","&nbsp;") ++
- print_secondary_list(Mods,[]));
-
-print_key_list([{maxP,Max}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Max nr of processes",fix_type(Max)));
-
-print_key_list([{maxT,Max}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Max running sec:",fix_type(Max)));
-
-print_key_list([{registered,Names}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Registered names:","&nbsp;") ++
- print_secondary_list(Names,[]));
-
-print_key_list([{applications,Apps}|Rest],Result)->
- print_key_list(Rest,Result ++ print_key("Depends on:","&nbsp") ++
- print_secondary_list(Apps,[]));
-
-print_key_list([{included_applications,Inc_apps}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Included applications:",
- fix_type(Inc_apps)));
-
-print_key_list([{env,Env}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Environment:",fix_type(Env)));
-
-print_key_list([{mod,Mod}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Application callback mod:",
- fix_type(Mod)));
-
-print_key_list([{start_phases,Phase_arg}|Rest],Result)->
- print_key_list(Rest,Result ++
- print_key("Application callback mod:",
- fix_type(Phase_arg)));
-
-print_key_list([_|Rest],Result)->
- print_key_list(Rest,Result).
-
-print_key(Label,Val)->
- "<TR>
- <TD><B>" ++ Label ++ "</B></TD><TD>" ++ Val ++
- "</TD><TD>&nbsp;</TD>
- </TR>".
-
-print_key2(Label,Val)->
- "<TR>
- <TD>&nbsp;</TD><TD>" ++ Label ++ "</TD><TD>" ++ Val ++ "</TD>
- </TR>".
-
-print_secondary_list([],Result)->
- Result;
-print_secondary_list([{Mod,Ver}|Rest],Result) ->
- print_secondary_list(Rest,Result ++
- print_key2(fix_type(Mod),fix_type(Ver)));
-
-print_secondary_list([Mod|Rest],Result) ->
- print_secondary_list(Rest,Result ++
- print_key2(fix_type(Mod),"&nbsp;")).
diff --git a/lib/appmon/src/process_info.erl b/lib/appmon/src/process_info.erl
deleted file mode 100644
index e5d44ae50e..0000000000
--- a/lib/appmon/src/process_info.erl
+++ /dev/null
@@ -1,662 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(process_info).
--behavior(gen_server).
-
--export([start/0, start_link/0, stop/0]).
--export([is_node/1, get_nodes/0,
- get_applications/1, get_application_keys/2,
- get_processes/3, get_process_data/2,
- send_trace/1]).
-
-%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
-
--record(data, {que=undef,
- procs=undef,
- links=undef,
- links2=undef}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% %%
-%% Functions to retrieve information about which application %%
-%% at the node %%
-%% %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-start() ->
- gen_server:start({local, proc_info}, process_info, [], []).
-
-start_link() ->
- gen_server:start_link({local, proc_info}, process_info, [], []).
-
-stop() ->
- gen_server:call(proc_info, stop, 1000).
-
-%% is_node(NodeS) -> {bool(), Node, NodeS2}
-%% NodeS = NodeS2 = string()
-%% Node = node()
-is_node(NodeS) ->
- Node = list_to_atom(NodeS),
- case lists:member(Node, [node()|nodes()]) of
- true->
- {true, Node, NodeS};
- false ->
- {false, node(), atom_to_list(node())}
- end.
-
-%% get_nodes() -> [node()]
-get_nodes() ->
- [node()|nodes()].
-
-%% get_applications(Node) -> [App]
-%% Node = node()
-%% App = atom()
-%% Returns the list of all applications with a supervision tree (that
-%% is, not library applications such as stdlib) at Node.
-get_applications(Node) ->
- Info = rpc:call(Node, application, info, []),
- {value, {running, Apps}} = lists:keysearch(running, 1, Info),
- [App || {App, Pid} <- Apps, is_pid(Pid)].
-
-%% get_application_keys(App, Node) -> {ok, Keys} | {error, Reason}
-%% Node = node()
-%% App = atom()
-%% Keys = [{Key, Val}]
-%% Key = atom()
-%% Val = term()
-%% Reason = badapp | badrpc
-get_application_keys(App, Node) ->
- case rpc:call(Node, application, get_all_key, [App]) of
- {ok, Keys} ->
- {ok, Keys};
- undefined ->
- {error, badapp};
- {badrpc, _} ->
- {error, badrpc}
- end.
-
-%% get_processes(App, Mode, Node) -> {Tree, Dict} | unknown
-%% App = atom()
-%% Mode = sup | sup_child | all
-%% Node = node()
-get_processes(App, Mode, Node) ->
- gen_server:call(proc_info, {get_processes, App, Mode, Node}).
-
-%% get_process_data(Pid, Node) -> ProcData
-%% Pid = pid()
-%% Node = node()
-%% ProcData -- see erlang:process_info/1
-get_process_data(Pid, Node) ->
- case rpc:call(Node, erlang, process_info, [Pid]) of
- {badrpc, _} ->
- [{error,"Please try again"}];
- Res ->
- Res
- end.
-
-%% send_trace(PidL) -> void()
-send_trace(PidL) ->
- gen_server:call(proc_info, {send_trace, PidL}).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% %%
-%% gen_server callbacks %%
-%% %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-init([]) ->
- {ok, ets:new(procs, [])}.
-
-handle_call({get_processes, App, Mode, Node}, _From, State) ->
- case do_get_processes(App, Mode, Node) of
- unknown ->
- {reply, unknown, State};
- Tree ->
- {reply, {Tree, State}, State}
- end;
-handle_call({send_trace, PidL}, _From, State) ->
- do_send_trace(PidL, State),
- {reply, ok, State};
-handle_call(stop, _From, State) ->
- {stop, normal, ok, State}.
-
-handle_cast(_, State) ->
- {noreply, State}.
-
-handle_info(_, State) ->
- {noreply, State}.
-
-terminate(_Reason, _State) ->
- ok.
-
-code_change(_, State, _) ->
- {ok, State}.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% %%
-%% Internal functions %%
-%% %%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%% do_get_processes(App, Mode, Node) -> Tree | unknown
-%% App = atom()
-%% Mode = all | sup | sup_childs
-%% Node = node()
-%% Tree = term()
-do_get_processes(App, Mode, Node) ->
- case rpc:call(Node, application_controller, get_master, [App]) of
- Pid when is_pid(Pid) ->
- start_collecting_data(Pid, Mode, Node);
- undefined ->
- unknown
- end.
-
-%% Initiate the database, get the processes and the links.
-%% Then build lists and return them.
-start_collecting_data(Pid, Mode, Node) ->
- Db = get_database(),
- {Db2, Tree} = build_graph({master,Pid}, Db, Pid, Mode, Node),
- delete_database(Db2),
- Tree.
-
-get_database() ->
- P = ets:new(procs,[]),
- L = ets:new(link,[bag]),
- L2 = ets:new(link2,[bag]),
- Q = queue:new(),
- ets:insert(P, {whereis(application_controller), crap}),
- ets:insert(P, {whereis(gs), crap}),
- #data{que=Q, procs=P, links=L, links2=L2}.
-
-delete_database(Db) ->
- ets:delete(Db#data.procs),
- ets:delete(Db#data.links),
- ets:delete(Db#data.links2).
-
-%% The thought is
-%% 1. Get the processes that links to Pid.
-%% Pid is the application master the first time.
-%% 2. Add the processes to the database and clear the list of children
-%% from processes which for some resason not should be there.
-%% 3. Queue the children, so we later can se if they have any links.
-%% 4. Add links to the childrens.
-%% 5. When the whole tree is retreived remove the unnecessary processes
-%% depending on the mode.
-%% 6. Take all links that point to the same pid and sort out
-%% the primary and secondary relations.
-%% If more than one process links to the same process, the relation
-%% between a supervisor and a process is primary. The rest is
-%% secondary, there is no different in real world just in logic
-%% between a secondary and a primary relation.
-%% When all processes in the application is collected,
-%% fix secondary links and return the tree.
-build_graph(finish, Db, Grp, Mode, Node) ->
- Db = fix_links(Db, Grp, Node),
- delete_unwanted(Db, Mode, Grp),
- Tree = start_tree(Db, Node),
- {Db, Tree};
-build_graph(Pid, Db, Grp, Mode, Node) ->
- Children = get_children(Pid, Mode, Node),
- Children2 = add_and_remove(Children, Pid, Db, Grp, Node),
- Q2 = queue_children(Db#data.que, Children2),
- add_children(Pid, Db, Children2, 1),
- case queue:out(Q2) of
- {empty, _}->
- build_graph(finish, Db, Grp, Mode, Node);
- {{value,NPid}, Q3}->
- Db2 = Db#data{que=Q3},
- build_graph(NPid,Db2,Grp,Mode,Node)
- end.
-
-%% Collect the processes which the current process has a link to
-%% Pid is now the application_master and the application master's
-%% child is the application supervisor but in reality there are two
-%% application master processes.
-%% Fix this by reordering the processes a little.
-get_children({master,Pid}, _Mode, Node) when is_pid(Pid) ->
- %% Get the master pid
- MPid = case application_master:get_child(Pid) of
- {Pid1, _App} -> Pid1;
- Pid1 -> Pid1
- end,
- %% Get the second appplication master process and order them
- %% correctly
- case rpc:call(Node, erlang, process_info, [MPid,links]) of
- {links, [H|T]} -> [H,MPid|T];
- {links, []} -> MPid
- end;
-get_children({Pid, _Name}, _Mode, Node) when is_pid(Pid),
- Node==node(Pid) ->
- {links,Links} = rpc:call(Node, erlang, process_info, [Pid,links]),
- Links;
-get_children(Pid, _Mode, Node) when is_pid(Pid), Node==node(Pid) ->
- {links,Links} = rpc:call(Node, erlang, process_info, [Pid,links]),
- Links;
-get_children(Pid, _Mode, Node) when is_pid(Pid), Node/=node(Pid) ->
- [];
-get_children(Port, _Mode, _Node) when is_port(Port) ->
- [].
-
-%% Add the links to the database.
-%% The first case -- when it is the application master process -- there
-%% is only one real child even though there are more links.
-add_children({master,Pid}, Db, [Child|_Rest], N) ->
- add_child(Pid, Db, Child, N);
-add_children(_Pid, _Db, [], _N) ->
- ok;
-add_children(Pid, Db, [Child|Rest], N) ->
- add_child(Pid, Db, Child, N),
- add_children(Pid, Db, Rest, N+1).
-
-add_child(Pid, Db, Child, N) ->
- case ets:match_object(Db#data.links, {Pid,Child,'_'}) of
- [] ->
- ets:insert(Db#data.links, {Pid,Child,N});
- _ ->
- ok
- end.
-
-%% Add the list of processes to the queue.
-queue_children(Queue, []) ->
- Queue;
-queue_children(Queue, [H|T]) ->
- Q = queue:in(H, Queue),
- queue_children(Q, T).
-
-%% The processess that we already has added to the database are
-%% not children to the current process, so we don't need to add them a
-%% second time.
-remove_used_children([], _Db, New_list) ->
- lists:reverse(New_list);
-remove_used_children([Child|Rest], Db, New) ->
- case ets:lookup(Db#data.procs, Child) of
- [] ->
- remove_used_children(Rest, Db, [Child|New]);
- _ ->
- remove_used_children(Rest, Db, New)
- end.
-
-%% Take the list of links and separate it into a list with ports and a
-%% list with pids.
-separate_ports([], Pids, Ports) ->
- {Pids, Ports};
-separate_ports([Child|Rest], Pids, Ports) ->
- if
- is_port(Child) ->
- separate_ports(Rest, Pids, [Child|Ports]);
- is_pid(Child) ->
- separate_ports(Rest, [Child|Pids], Ports)
- end.
-
-%% Add the current pid to the ets table with processes and clear
-%% the list of children from processes that should not be there.
-%% In the first case, no children are used so it's not necessary.
-add_and_remove(Children, {master,Pid}, Db, _Grp, Node)
- when is_pid(Pid), Node==node(Pid) ->
- ets:insert(Db#data.procs, {Pid, {master,master}, controller}),
- {_Pids,Ports} = separate_ports(Children, [], []),
- Ports++Children;
-%% This clause is removable when using only link as retrieving mode .
-add_and_remove(Children, {Pid,_Name}, Db, Grp, Node)
- when is_pid(Pid), Node==node(Pid) ->
- ets:insert(Db#data.procs, {Pid,
- rpc:call(Node,erlang,process_info,
- [Pid,registered_name])}),
- {Pids, Ports} = separate_ports(Children, [], []),
- Children1 = remove_used_children(Pids, Db, []),
- Children2 = remove_others_children(Children1, Grp, Node),
- Ports++Children2;
-add_and_remove(Children, Pid, Db, Grp, Node) when is_pid(Pid),
- Node==node(Pid) ->
- ets:insert(Db#data.procs, {Pid,
- rpc:call(Node,erlang,process_info,
- [Pid,registered_name])}),
- {Pids, Ports} = separate_ports(Children, [], []),
- Children1 = remove_used_children(Pids, Db, []),
- Children2 =remove_others_children(Children1, Grp, Node),
- Ports++Children2;
-add_and_remove(_Children, Pid, _Db, _Grp, Node) when is_pid(Pid),
- Node/=node(Pid) ->
- [];
-%% Take care of the ports, don't add them to the table with processes.
-add_and_remove(_Children, Pid, _Db, _Grp, _Node) when is_port(Pid) ->
- [].
-
-%% Control that the application's group leader is the group leader of
-%% Pid
-group_leader_check({Pid,_Name}, Grp, Node) ->
- group_leader_check(Pid, Grp, Node);
-group_leader_check(Pid, Grp, Node) ->
- case rpc:call(Node, erlang, process_info, [Pid,group_leader]) of
- {_Item, Grp} -> yes;
- _ -> no
- end.
-
-%% Take the list of children and remove the ones with anoother group
-%% leader.
-remove_others_children(Children, Grp, Node) ->
- lists:filter(fun(Child) ->
- case group_leader_check(Child, Grp, Node) of
- yes -> true;
- no -> false
- end
- end,
- Children).
-
-%% Mark the processes in the procs table as either supervisor or worker.
-fix_links(Db, Leader, Node) ->
- {Sup,_Work} = mark_supervisors_workers(Db, Leader, Node),
- ets:match_delete(Db#data.procs, {'_',crap}),
- [_Pid|Procs] = ets:tab2list(Db#data.procs),
- N_links = get_n_links(Procs, Db#data.links, []),
- N_links2 = take_sup_links(Sup, Db#data.links, N_links),
- add_shared_links(N_links2, Db#data.links2),
- Db.
-
-%% Add the links that point to the same child to the shared links table
-add_shared_links(N_links, Links2) ->
- Insert_fun = fun(Link) -> ets:insert(Links2, Link) end,
- lists:map(fun(List) -> lists:map(Insert_fun, List) end, N_links).
-
-%% Take the list of links that point to the same children and remove
-%% the ones that are children to supervisors.
-%% The first argument is a list of the supervisors.
-%% N_links contains a list of list of links that points to the same
-%% child.
-take_sup_links([], _Db, N_links) ->
- N_links;
-take_sup_links([H|Supervised], Links_table, N_links) ->
- N_list_fun = fun(Link) ->
- insert_sup_links(Link, H, Links_table)
- end,
- N_links2 = lists:map(fun(Link_list) ->
- lists:filter(N_list_fun,Link_list)
- end,
- N_links),
- take_sup_links(Supervised, Links_table, N_links2).
-
-%% Insert the supervised links in the primary links list.
-%% This function should be used as a fun to the filter function in
-%% take_sup_links/3.
-insert_sup_links({From,To,N}, Sup, Links_table) ->
- case From of
- Sup ->
- ets:insert(Links_table, {From,To,N}),
- false;
- _ ->
- true
- end.
-
-%% Get the links which points to the same children.
-get_n_links([], _Links, N_link) ->
- N_link;
-get_n_links([{Pid,_,_}|Procs], Links, N_link) ->
- case ets:match_object(Links, {'_',Pid,'_'}) of
- L when length(L)>1 ->
- ets:match_delete(Links, {'_',Pid,'_'}),
- get_n_links(Procs, Links, [L|N_link]);
- _L ->
- get_n_links(Procs, Links, N_link)
- end;
-get_n_links([{Pid,_}|Procs], Links, N_link) ->
- case ets:match_object(Links, {'_',Pid,'_'}) of
- L when length(L)>1 ->
- ets:match_delete(Links, {'_',Pid,'_'}),
- get_n_links(Procs, Links, [L|N_link]);
- _L ->
- get_n_links(Procs, Links, N_link)
- end.
-
-%% Mark the processes that are in the supervisor tree as either worker
-%% or supervisor.
-mark_supervisors_workers(Db, Leader, Node) ->
- %% Get the supervisors and workers.
- {Sup_list, Worker_list} = get_by_supervisors1(Leader),
- %% Update the supervisor pids.
- lists:map(fun(Pid) ->
- ets:insert(Db#data.procs,
- {Pid,
- rpc:call(Node, erlang,process_info,
- [Pid,registered_name]),
- supervisor})
- end,
- Sup_list),
- %% Update the worker pids.
- lists:map(fun(Pid) ->
- ets:insert(Db#data.procs,
- {Pid,
- rpc:call(Node, erlang,process_info,
- [Pid,registered_name]),
- worker})
- end,
- Worker_list),
- {lists:reverse(Sup_list), Worker_list}.
-
-%% The second way to retrieve the applications processes is to go by
-%% the supervision tree.
-get_by_supervisors1(Leader) ->
- case application_master:get_child(Leader) of
- {Pid, _Name}->
- get_by_supervisors([{namn,Pid,supervisor,list_of_mods}],
- [], []);
- Pid ->
- get_by_supervisors([{namn,Pid,supervisor,list_of_mods}],
- [], [])
- end.
-
-get_by_supervisors([], Sup, Work) ->
- {Sup, Work};
-get_by_supervisors([{_,Pid,supervisor,_}|Rest], Sup, Work)
- when is_pid(Pid) ->
- Children = supervisor:which_children(Pid),
- Children2 = lists:append(Children, Rest),
- get_by_supervisors(Children2, [Pid|Sup], Work);
-get_by_supervisors([{_,Pid,_,_}|Rest], Sup, Work) when is_pid(Pid) ->
- get_by_supervisors(Rest, Sup, [Pid|Work]);
-get_by_supervisors([_Whatever|Rest], Sup, Work) ->
- get_by_supervisors(Rest, Sup, Work).
-
-%% Use pattern matching to select mode and delete the unneccesary pids
-delete_unwanted(Db, sup_child, App_pid) ->
- delete_not_in_supervisor_tree(Db),
- add_main_link(Db, App_pid),
- Db;
-delete_unwanted(Db, all, _App_pid) ->
- Db;
-delete_unwanted(Db, sup, App_pid) ->
- delete_workers(Db),
- delete_not_in_supervisor_tree(Db),
- add_main_link(Db, App_pid),
- Db.
-
-add_main_link(Db, App_pid) ->
- case application_master:get_child(App_pid) of
- {Pid, _Name} when is_pid(Pid) ->
- ets:insert(Db#data.links, {App_pid,Pid,1});
- Pid when is_pid(Pid) ->
- ets:insert(Db#data.links, {App_pid,Pid,1});
- _ ->
- false
- end.
-
-%% Delete the processes that are in the supervision tree but are
-%% workers, and their links.
-delete_workers(Db) ->
- Pids = ets:match_object(Db#data.procs, {'_','_',worker}),
- Pids2 =
- lists:map(
- fun({Pid,_,_}) ->
- %% Remove the unwanted pids from the process table.
- ets:match_delete(Db#data.procs, {Pid,'_','_'}),
- %% Remove the links to and from the pid.
- ets:match_delete(Db#data.links, {Pid,'_','_'}),
- ets:match_delete(Db#data.links, {'_',Pid,'_'}),
- ets:match_delete(Db#data.links2, {Pid,'_','_'}),
- ets:match_delete(Db#data.links2, {'_',Pid,'_'})
- end,
- Pids),
- Pids2.
-
-%% Delete the processes that are not in the supervision tree.
-delete_not_in_supervisor_tree(Db) ->
- Pids = ets:match_object(Db#data.procs,{'_','_'}),
- Pids2 =
- lists:map(
- fun({Pid,_}) ->
- %% Remove the unwanted from the process table.
- ets:match_delete(Db#data.procs, {Pid,'_'}),
- %% Remove the links to and from the pid.
- ets:match_delete(Db#data.links, {Pid,'_','_'}),
- ets:match_delete(Db#data.links, {'_',Pid,'_'}),
- ets:match_delete(Db#data.links2, {Pid,'_','_'}),
- ets:match_delete(Db#data.links2, {'_',Pid,'_'})
- end,
- Pids),
- Pids2.
-
-%% Start generating the tree.
-start_tree(Db, Node) ->
- case get_master(Db) of
- no -> false;
- Pid ->
- build_node(Pid, Db, Node)
- end.
-
-%% Build a node and then it runs itself on every child to the current
-%% pid.
-build_node(Pid, Db, Node) when is_pid(Pid), Node==node(Pid) ->
- Sort_fun = fun sort_order/2,
- Fix_sec_name_fun = fun(Pid2) -> get_link_name(Pid2, Db) end,
- Build_tree_fun = fun({_,Pid1,_}) -> build_node(Pid1,Db,Node) end,
- Children = ets:match_object(Db#data.links, {Pid,'_','_'}),
- Children1 = lists:sort(Sort_fun, Children),
- Sec_children = ets:match_object(Db#data.links2, {Pid,'_','_'}),
- {get_name(Pid,Db),
- lists:map(Build_tree_fun,Children1),
- lists:map(Fix_sec_name_fun,Sec_children)};
-build_node(Pid, _Db, Node) when is_pid(Pid), Node/=node(Pid) ->
- {"Runs on another node:"++erlang:pid_to_list(Pid), [], []};
-build_node(Pid, _Db, _Node) when is_port(Pid) ->
- {"Port :"++erlang:port_to_list(Pid), [], []}.
-
-%% Select the name of the pid from the database where we previosly
-%% added it.
-get_name(Pid, Db) ->
- case ets:lookup(Db#data.procs, Pid) of
- [{_,{_,master},_}] -> pid_to_list(Pid);
- [{_,{_,Name}}] -> atom_to_list(Name)++" : "++pid_to_list(Pid);
- [{_,{_,Name},_}] -> atom_to_list(Name)++" : "++pid_to_list(Pid);
- _ -> pid_to_list(Pid)
- end.
-
-%% Select the name of the process which we have a link to.
-get_link_name({_,Pid,_}, Db) when is_pid(Pid) ->
- case ets:lookup(Db#data.procs, Pid) of
- [{_,{_,Name}}] -> atom_to_list(Name)++" : "++pid_to_list(Pid);
- [{_,{_,Name},_}] -> atom_to_list(Name)++" : "++pid_to_list(Pid);
- _ -> pid_to_list(Pid)
- end;
-get_link_name({_,Port,_}, _Db) when is_port(Port) ->
- "Port :"++" : ";
-get_link_name(_, _) ->
- "".
-
-%% Sort the links in the order they where added, in ascending order.
-sort_order({_,_,N1}, {_,_,N2}) when N1>N2 -> true;
-sort_order(_N1, _N2) -> false.
-
-%% Select the pid of the application master.
-get_master(Db) ->
- case ets:match_object(Db#data.procs,
- {'_',{master,master},controller}) of
- [{Pid,_,_}|_Rest] -> Pid;
- _ -> no
- end.
-
-%% The main function to handle tracing.
-%% Checks if the process is in the table with traced processes. If so,
-%% it stops the trace, otherwise it starts the trace.
-do_send_trace(PidL, Traced_tab) ->
- Pid = list_to_pid(PidL),
- Key = get_key(Pid),
- case catch ets:lookup(Traced_tab, Key) of
- [] ->
- trace_process(Pid, Key, true, Traced_tab);
- [_Object]->
- trace_process(Pid, Key, false, Traced_tab)
- end,
- filter_procs(Traced_tab, ets:tab2list(Traced_tab)).
-
-get_key(Pid) ->
- Node = node(Pid),
- case rpc:call(Node, erlang, process_info, [Pid,registered_name]) of
- [] -> pid_to_list(Pid);
- {registered_name, Name} ->
- atom_to_list(Name)++" : "++pid_to_list(Pid)
- end.
-
-%% Tries to toggle the trace flag for the process.
-trace_process(Pid, Key, On_or_off, Procs_tab) ->
- case rpc:call(node(Pid), sys, trace, [Pid,On_or_off,1000]) of
- timeout ->
- Node = node(Pid),
- io:fwrite("timeout node= ~w, Pid= ~w mode= ~w ~n",
- [Node, Pid, On_or_off]);
- {badrpc, _} ->
- Node = node(Pid),
- io:fwrite("badrpc node= ~w, Pid= ~w mode= ~w ~n",
- [Node, Pid, On_or_off]);
- Res ->
- Node = node(Pid),
- io:fwrite("anymode ~w node= ~w, Pid= ~w mode= ~w ~n",
- [Res, Node, Pid,On_or_off]),
- case On_or_off of
- true -> ets:insert(Procs_tab, {Key,On_or_off});
- false -> ets:delete(Procs_tab, Key)
- end
- end.
-
-%% Check if the processes in the ets table with traced processes
-%% are alive. If not, remove them.
-filter_procs(Tab, Tab_list) ->
- lists:foreach(fun({Key,_Val}) -> is_alive(Key, Tab) end, Tab_list).
-
-is_alive(Key, Tab) ->
- case get_pid(Key) of
- nopid -> false;
- Pid -> is_alive2(Pid, Key, Tab)
- end.
-
-%% Key is either a pid in list form or Pidname:Pid in list form.
-get_pid(Key) ->
- case catch list_to_pid(string:substr(Key,string:rchr(Key,$<))) of
- Pid when is_pid(Pid) ->
- Pid;
- _ ->
- nopid
- end.
-
-is_alive2(Pid, Key, Tab) ->
- case catch rpc:call(node(Pid), erlang, is_process_alive, [Pid]) of
- true -> true;
- false ->
- catch ets:delete(Tab, Key),
- ok
- end.
diff --git a/lib/appmon/vsn.mk b/lib/appmon/vsn.mk
deleted file mode 100644
index 5585c5e1c2..0000000000
--- a/lib/appmon/vsn.mk
+++ /dev/null
@@ -1 +0,0 @@
-APPMON_VSN = 2.1.14.2
diff --git a/lib/asn1/src/asn1ct.erl b/lib/asn1/src/asn1ct.erl
index f2ccf5f212..f2e9606ccb 100644
--- a/lib/asn1/src/asn1ct.erl
+++ b/lib/asn1/src/asn1ct.erl
@@ -333,8 +333,7 @@ print_structured_errors([_|_]=Errors) ->
print_structured_errors(_) -> ok.
compile1(File, #st{opts=Opts}=St0) ->
- verbose("Erlang ASN.1 version ~p, compiling ~p~n", [?vsn,File], Opts),
- verbose("Compiler Options: ~p~n", [Opts], Opts),
+ compiler_verbose(File, Opts),
Passes = single_passes(),
Base = filename:rootname(filename:basename(File)),
OutFile = outfile(Base, "", Opts),
@@ -349,8 +348,7 @@ compile1(File, #st{opts=Opts}=St0) ->
%% compile_set/3 merges and compiles a number of asn1 modules
%% specified in a .set.asn file to one .erl file.
compile_set(SetBase, Files, #st{opts=Opts}=St0) ->
- verbose("Erlang ASN.1 version ~p compiling ~p ~n", [?vsn,Files], Opts),
- verbose("Compiler Options: ~p~n",[Opts], Opts),
+ compiler_verbose(Files, Opts),
OutFile = outfile(SetBase, "", Opts),
DbFile = outfile(SetBase, "asn1db", Opts),
InputModules = [begin
@@ -363,6 +361,11 @@ compile_set(SetBase, Files, #st{opts=Opts}=St0) ->
Passes = set_passes(),
run_passes(Passes, St).
+compiler_verbose(What, Opts) ->
+ verbose("Erlang ASN.1 compiler ~s\n", [?vsn], Opts),
+ verbose("Compiling: ~p\n", [What], Opts),
+ verbose("Options: ~p\n", [Opts], Opts).
+
%% merge_modules/2 -> returns a module record where the typeorval lists are merged,
%% the exports lists are merged, the imports lists are merged when the
%% elements come from other modules than the merge set, the tagdefault
diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl
index 4672f7edd3..c224f4c9fa 100644
--- a/lib/asn1/src/asn1ct_constructed_per.erl
+++ b/lib/asn1/src/asn1ct_constructed_per.erl
@@ -79,7 +79,7 @@ gen_encode_constructed_imm(Erule, Typename, #type{}=D) ->
[]
end,
Aligned = is_aligned(Erule),
- Value0 = asn1ct_gen:mk_var(asn1ct_name:curr(val)),
+ Value0 = make_var(val),
Optionals = optionals(to_textual_order(CompList)),
ImmOptionals = [asn1ct_imm:per_enc_optional(Value0, Opt, Aligned) ||
Opt <- Optionals],
@@ -87,7 +87,7 @@ gen_encode_constructed_imm(Erule, Typename, #type{}=D) ->
ExtImm = case Ext of
{ext,ExtPos,NumExt} when NumExt > 0 ->
gen_encode_extaddgroup(CompList),
- Value = asn1ct_gen:mk_var(asn1ct_name:curr(val)),
+ Value = make_var(val),
asn1ct_imm:per_enc_extensions(Value, ExtPos,
NumExt, Aligned);
_ ->
@@ -106,19 +106,17 @@ gen_encode_constructed_imm(Erule, Typename, #type{}=D) ->
c_index=N,
usedclassfield=UniqueFieldName,
uniqueclassfield=UniqueFieldName,
- valueindex=ValueIndex
+ valueindex=ValueIndex0
} -> %% N is index of attribute that determines constraint
{Module,ObjSetName} = ObjectSet,
#typedef{typespec=#'ObjectSet'{gen=Gen}} =
asn1_db:dbget(Module, ObjSetName),
case Gen of
true ->
- ObjectEncode =
- asn1ct_gen:un_hyphen_var(lists:concat(['Obj',AttrN])),
- El = make_element(N+1, asn1ct_gen:mk_var(asn1ct_name:curr(val))),
- ValueMatch = value_match(ValueIndex, El),
- ObjSetImm0 = [{assign,{var,ObjectEncode},ValueMatch}],
- {{AttrN,ObjectEncode},ObjSetImm0};
+ ValueIndex = ValueIndex0 ++ [{N+1,top}],
+ Val = make_var(val),
+ {ObjSetImm0,Dst} = enc_dig_out_value(ValueIndex, Val),
+ {{AttrN,Dst},ObjSetImm0};
false ->
{false,[]}
end;
@@ -128,7 +126,7 @@ gen_encode_constructed_imm(Erule, Typename, #type{}=D) ->
%% when the simpletableattributes was at an outer
%% level and the objfun has been passed through the
%% function call
- {{"got objfun through args","ObjFun"},[]};
+ {{"got objfun through args",{var,"ObjFun"}},[]};
_ ->
{false,[]}
end
@@ -136,7 +134,7 @@ gen_encode_constructed_imm(Erule, Typename, #type{}=D) ->
ImmSetExt =
case Ext of
{ext,_Pos,NumExt2} when NumExt2 > 0 ->
- asn1ct_imm:per_enc_extension_bit('Extensions', Aligned);
+ asn1ct_imm:per_enc_extension_bit({var,"Extensions"}, Aligned);
{ext,_Pos,_} ->
asn1ct_imm:per_enc_extension_bit([], Aligned);
_ ->
@@ -540,7 +538,7 @@ gen_encode_choice_imm(Erule, TopType, #type{def={'CHOICE',CompList}}) ->
Aligned = is_aligned(Erule),
Cs = gen_enc_choice(Erule, TopType, CompList, Ext),
[{assign,{expr,"{ChoiceTag,ChoiceVal}"},"Val"}|
- asn1ct_imm:per_enc_choice('ChoiceTag', Cs, Aligned)].
+ asn1ct_imm:per_enc_choice({var,"ChoiceTag"}, Cs, Aligned)].
gen_decode_choice(Erules,Typename,D) when is_record(D,type) ->
asn1ct_name:start(),
@@ -562,14 +560,14 @@ gen_encode_sof(Erule, Typename, SeqOrSetOf, D) ->
gen_encode_sof_imm(Erule, Typename, SeqOrSetOf, #type{}=D) ->
{_SeqOrSetOf,ComponentType} = D#type.def,
Aligned = is_aligned(Erule),
- Constructed_Suffix =
- asn1ct_gen:constructed_suffix(SeqOrSetOf,
- ComponentType#type.def),
- Conttype = asn1ct_gen:get_inner(ComponentType#type.def),
+ CompType = ComponentType#type.def,
+ Constructed_Suffix = asn1ct_gen:constructed_suffix(SeqOrSetOf, CompType),
+ Conttype = asn1ct_gen:get_inner(CompType),
Currmod = get(currmod),
Imm0 = case asn1ct_gen:type(Conttype) of
{primitive,bif} ->
- asn1ct_gen_per:gen_encode_prim_imm('Comp', ComponentType, Aligned);
+ asn1ct_gen_per:gen_encode_prim_imm({var,"Comp"},
+ ComponentType, Aligned);
{constructed,bif} ->
TypeName = [Constructed_Suffix|Typename],
Enc = enc_func(asn1ct_gen:list2name(TypeName)),
@@ -577,17 +575,19 @@ gen_encode_sof_imm(Erule, Typename, SeqOrSetOf, #type{}=D) ->
[{objfun,_}|_] -> [{var,"ObjFun"}];
_ -> []
end,
- [{apply,Enc,[{var,"Comp"}|ObjArg]}];
+ [{apply,{local,Enc,CompType},
+ [{var,"Comp"}|ObjArg]}];
#'Externaltypereference'{module=Currmod,type=Ename} ->
- [{apply,enc_func(Ename),[{var,"Comp"}]}];
+ [{apply,{local,enc_func(Ename),CompType},[{var,"Comp"}]}];
#'Externaltypereference'{module=EMod,type=Ename} ->
- [{apply,{EMod,enc_func(Ename)},[{var,"Comp"}]}];
+ [{apply,{EMod,enc_func(Ename),CompType},[{var,"Comp"}]}];
'ASN1_OPEN_TYPE' ->
- asn1ct_gen_per:gen_encode_prim_imm('Comp',
+ asn1ct_gen_per:gen_encode_prim_imm({var,"Comp"},
#type{def='ASN1_OPEN_TYPE'},
Aligned)
end,
- asn1ct_imm:per_enc_sof('Val', D#type.constraint, 'Comp', Imm0, Aligned).
+ asn1ct_imm:per_enc_sof({var,"Val"}, D#type.constraint, 'Comp',
+ Imm0, Aligned).
gen_decode_sof(Erules, Typename, SeqOrSetOf, #type{}=D) ->
asn1ct_name:start(),
@@ -871,8 +871,8 @@ gen_enc_components_call1(Erule,TopType,
CanonicalNum ->
CanonicalNum
end,
- Element0 = make_element(TermNo+1, asn1ct_gen:mk_var(asn1ct_name:curr(val))),
- {Imm0,Element} = asn1ct_imm:enc_bind_var(Element0),
+ Val = make_var(val),
+ {Imm0,Element} = asn1ct_imm:enc_element(TermNo+1, Val),
Imm1 = gen_enc_line_imm(Erule, TopType, Cname, Type, Element, DynamicEnc, Ext),
Category = case {Prop,Ext} of
{'OPTIONAL',_} ->
@@ -967,9 +967,9 @@ gen_enc_line_imm_1(Erule, TopType, Cname, Type, Element, DynamicEnc) ->
CurrMod = get(currmod),
case asn1ct_gen:type(Atype) of
#'Externaltypereference'{module=CurrMod,type=EType} ->
- [{apply,enc_func(EType),[{expr,Element}]}];
+ [{apply,{local,enc_func(EType),Atype},[Element]}];
#'Externaltypereference'{module=Mod,type=EType} ->
- [{apply,{Mod,enc_func(EType)},[{expr,Element}]}];
+ [{apply,{Mod,enc_func(EType),Atype},[Element]}];
{primitive,bif} ->
asn1ct_gen_per:gen_encode_prim_imm(Element, Type, Aligned);
'ASN1_OPEN_TYPE' ->
@@ -988,9 +988,9 @@ gen_enc_line_imm_1(Erule, TopType, Cname, Type, Element, DynamicEnc) ->
Enc = enc_func(asn1ct_gen:list2name(NewTypename)),
case {Type#type.tablecinf,DynamicEnc} of
{[{objfun,_}|_R],{_,EncFun}} ->
- [{apply,Enc,[{expr,Element},{var,EncFun}]}];
+ [{apply,{local,Enc,Type},[Element,EncFun]}];
_ ->
- [{apply,Enc,[{expr,Element}]}]
+ [{apply,{local,Enc,Type},[Element]}]
end
end
end.
@@ -1014,13 +1014,16 @@ enc_var_type_call(Erule, Name, RestFieldNames,
{_,Key,Code} <- ObjSet1],
ObjSet = lists:sort([P || {_,B}=P <- ObjSet2, B =/= none]),
Key = erlang:md5(term_to_binary({encode,ObjSet,RestFieldNames,Extensible})),
+ Imm = enc_objset_imm(Erule, Name, ObjSet, RestFieldNames, Extensible),
+ Lambda = {lambda,[{var,"Val"},{var,"Id"}],Imm},
Gen = fun(_Fd, N) ->
- enc_objset(Erule, Name, N, ObjSet,
- RestFieldNames, Extensible)
+ Aligned = is_aligned(Erule),
+ emit([{asis,N},"(Val, Id) ->",nl]),
+ asn1ct_imm:enc_cg(Imm, Aligned),
+ emit([".",nl])
end,
Prefix = lists:concat(["enc_os_",Name]),
- F = asn1ct_func:call_gen(Prefix, Key, Gen),
- [{apply,F,[{var,atom_to_list(Val)},{var,Fun}]}].
+ [{call_gen,Prefix,Key,Gen,Lambda,[Val,Fun]}].
fix_object_code(Name, [{Name,B}|_], _ClassFields) ->
B;
@@ -1042,9 +1045,7 @@ fix_object_code(Name, [], ClassFields) ->
end
end.
-
-enc_objset(Erule, Component, Name, ObjSet, RestFieldNames, Extensible) ->
- asn1ct_name:start(),
+enc_objset_imm(Erule, Component, ObjSet, RestFieldNames, Extensible) ->
Aligned = is_aligned(Erule),
E = {error,
fun() ->
@@ -1053,22 +1054,19 @@ enc_objset(Erule, Component, Name, ObjSet, RestFieldNames, Extensible) ->
"{value,Val},"
"{unique_name_and_value,'_'}})",nl])
end},
- Imm = [{'cond',
- [[{eq,{var,"Id"},Key}|
- enc_obj(Erule, Obj, RestFieldNames, Aligned)] ||
- {Key,Obj} <- ObjSet] ++
- [['_',case Extensible of
- false -> E;
- true -> {put_bits,{var,"Val"},binary,[1]}
- end]]}],
- emit([{asis,Name},"(Val, Id) ->",nl]),
- asn1ct_imm:enc_cg(Imm, Aligned),
- emit([".",nl]).
+ [{'cond',
+ [[{eq,{var,"Id"},Key}|
+ enc_obj(Erule, Obj, RestFieldNames, Aligned)] ||
+ {Key,Obj} <- ObjSet] ++
+ [['_',case Extensible of
+ false -> E;
+ true -> {put_bits,{var,"Val"},binary,[1]}
+ end]]}].
enc_obj(Erule, Obj, RestFieldNames0, Aligned) ->
case Obj of
#typedef{name={primitive,bif},typespec=Def} ->
- asn1ct_gen_per:gen_encode_prim_imm('Val', Def, Aligned);
+ asn1ct_gen_per:gen_encode_prim_imm({var,"Val"}, Def, Aligned);
#typedef{name={constructed,bif},typespec=Def} ->
InnerType = asn1ct_gen:get_inner(Def#type.def),
case InnerType of
@@ -1084,7 +1082,7 @@ enc_obj(Erule, Obj, RestFieldNames0, Aligned) ->
gen_encode_sof_imm(Erule, name, InnerType, Def)
end;
#typedef{name=Type} ->
- [{apply,enc_func(Type),[{var,"Val"}]}];
+ [{apply,{local,enc_func(Type),Type},[{var,"Val"}]}];
#'Externalvaluereference'{module=Mod,value=Value} ->
case asn1_db:dbget(Mod, Value) of
#typedef{typespec=#'Object'{def=Def}} ->
@@ -1097,9 +1095,9 @@ enc_obj(Erule, Obj, RestFieldNames0, Aligned) ->
Func = enc_func(Type),
case get(currmod) of
Mod ->
- [{apply,Func,[{var,"Val"}]}];
+ [{apply,{local,Func,Obj},[{var,"Val"}]}];
_ ->
- [{apply,{Mod,Func},[{var,"Val"}]}]
+ [{apply,{Mod,Func,Obj},[{var,"Val"}]}]
end
end.
@@ -1540,12 +1538,12 @@ gen_enc_choices([H|T], Erule, TopType, Pos, Constr, Ext) ->
no ->
case Type#type.tablecinf of
[{objfun,_}|_] ->
- {"got objfun through args","ObjFun"};
+ {"got objfun through args",{var,"ObjFun"}};
_ ->
false
end;
_ ->
- {no_attr,"ObjFun"}
+ {no_attr,{var,"ObjFun"}}
end,
DoExt = case Constr of
ext -> Ext;
@@ -1561,7 +1559,7 @@ gen_enc_choices([H|T], Erule, TopType, Pos, Constr, Ext) ->
[{put_bits,0,1,[1]}|
asn1ct_imm:per_enc_integer(Pos, Constr, Aligned)]
end,
- Body = gen_enc_line_imm(Erule, TopType, Cname, Type, 'ChoiceVal',
+ Body = gen_enc_line_imm(Erule, TopType, Cname, Type, {var,"ChoiceVal"},
EncObj, DoExt),
Imm = Tag ++ Body,
[{Cname,Imm}|gen_enc_choices(T, Erule, TopType, Pos+1, Constr, Ext)];
@@ -1778,3 +1776,13 @@ value_match1(Value,[],Acc,Depth) ->
Acc ++ Value ++ lists:concat(lists:duplicate(Depth,")"));
value_match1(Value,[{VI,_}|VIs],Acc,Depth) ->
value_match1(Value,VIs,Acc++lists:concat(["element(",VI,","]),Depth+1).
+
+enc_dig_out_value([], Value) ->
+ {[],Value};
+enc_dig_out_value([{N,_}|T], Value) ->
+ {Imm0,Dst0} = enc_dig_out_value(T, Value),
+ {Imm,Dst} = asn1ct_imm:enc_element(N, Dst0),
+ {Imm0++Imm,Dst}.
+
+make_var(Base) ->
+ {var,atom_to_list(asn1ct_gen:mk_var(asn1ct_name:curr(Base)))}.
diff --git a/lib/asn1/src/asn1ct_func.erl b/lib/asn1/src/asn1ct_func.erl
index dbadedb683..33f998722a 100644
--- a/lib/asn1/src/asn1ct_func.erl
+++ b/lib/asn1/src/asn1ct_func.erl
@@ -48,7 +48,7 @@ need(MFA) ->
call_gen(Prefix, Key, Gen, Args) when is_function(Gen, 2) ->
F = req({gen_func,Prefix,Key,Gen}),
- asn1ct_gen:emit([F,"(",call_args(Args, ""),")"]).
+ asn1ct_gen:emit([{asis,F},"(",call_args(Args, ""),")"]).
call_gen(Prefix, Key, Gen) when is_function(Gen, 2) ->
req({gen_func,Prefix,Key,Gen}).
diff --git a/lib/asn1/src/asn1ct_gen.erl b/lib/asn1/src/asn1ct_gen.erl
index 30d337635b..37b33194d0 100644
--- a/lib/asn1/src/asn1ct_gen.erl
+++ b/lib/asn1/src/asn1ct_gen.erl
@@ -23,6 +23,7 @@
-export([demit/1,
emit/1,
+ open_output_file/1,close_output_file/0,
get_inner/1,type/1,def_to_tag/1,prim_bif/1,
list2name/1,
list2rname/1,
@@ -70,8 +71,7 @@ pgen_module(OutFile,Erules,Module,
HrlGenerated = pgen_hrl(Erules,Module,TypeOrVal,Options,Indent),
asn1ct_name:start(),
ErlFile = lists:concat([OutFile,".erl"]),
- Fid = fopen(ErlFile),
- put(gen_file_out,Fid),
+ open_output_file(ErlFile),
asn1ct_func:start_link(),
gen_head(Erules,Module,HrlGenerated),
pgen_exports(Erules,Module,TypeOrVal),
@@ -85,9 +85,9 @@ pgen_module(OutFile,Erules,Module,
"%%%",nl,
"%%% Run-time functions.",nl,
"%%%",nl]),
- asn1ct_func:generate(Fid),
- file:close(Fid),
- _ = erase(gen_file_out),
+ Fd = get(gen_file_out),
+ asn1ct_func:generate(Fd),
+ close_output_file(),
_ = erase(outfile),
asn1ct:verbose("--~p--~n",[{generated,ErlFile}],Options).
@@ -1121,8 +1121,7 @@ pgen_info() ->
open_hrl(OutFile,Module) ->
File = lists:concat([OutFile,".hrl"]),
- Fid = fopen(File),
- put(gen_file_out,Fid),
+ open_output_file(File),
gen_hrlhead(Module).
%% EMIT functions ************************
@@ -1195,15 +1194,19 @@ call_args([A|As], Sep) ->
[Sep,do_emit(A)|call_args(As, ", ")];
call_args([], _) -> [].
-fopen(F) ->
+open_output_file(F) ->
case file:open(F, [write,raw,delayed_write]) of
- {ok, Fd} ->
+ {ok,Fd} ->
+ put(gen_file_out, Fd),
Fd;
{error, Reason} ->
io:format("** Can't open file ~p ~n", [F]),
exit({error,Reason})
end.
+close_output_file() ->
+ ok = file:close(erase(gen_file_out)).
+
pgen_hrl(Erules,Module,TypeOrVal,Options,_Indent) ->
put(currmod,Module),
{Types,Values,Ptypes,_,_,_} = TypeOrVal,
@@ -1226,8 +1229,7 @@ pgen_hrl(Erules,Module,TypeOrVal,Options,_Indent) ->
0 ->
0;
Y ->
- Fid = get(gen_file_out),
- file:close(Fid),
+ close_output_file(),
asn1ct:verbose("--~p--~n",
[{generated,lists:concat([get(outfile),".hrl"])}],
Options),
diff --git a/lib/asn1/src/asn1ct_gen_per.erl b/lib/asn1/src/asn1ct_gen_per.erl
index 8b999ddbf0..7ba649c874 100644
--- a/lib/asn1/src/asn1ct_gen_per.erl
+++ b/lib/asn1/src/asn1ct_gen_per.erl
@@ -99,7 +99,7 @@ gen_encode_user(Erules,D) when is_record(D,typedef) ->
gen_encode_prim(Erules, D) ->
- Value = asn1ct_gen:mk_var(asn1ct_name:curr(val)),
+ Value = {var,atom_to_list(asn1ct_gen:mk_var(asn1ct_name:curr(val)))},
gen_encode_prim(Erules, D, Value).
gen_encode_prim(Erules, #type{}=D, Value) ->
@@ -149,10 +149,10 @@ gen_encode_prim_imm(Val, #type{def=Type0,constraint=Constraint}, Aligned) ->
case Constraint of
[#'Externaltypereference'{type=Tname}] ->
EncFunc = enc_func(Tname),
- Imm = [{apply,EncFunc,[{expr,Val}]}],
+ Imm = [{apply,{local,EncFunc,[]},[Val]}],
asn1ct_imm:per_enc_open_type(Imm, Aligned);
[] ->
- Imm = [{call,erlang,iolist_to_binary,[{expr,Val}]}],
+ Imm = [{call,erlang,iolist_to_binary,[Val]}],
asn1ct_imm:per_enc_open_type(Imm, Aligned)
end
end.
diff --git a/lib/asn1/src/asn1ct_imm.erl b/lib/asn1/src/asn1ct_imm.erl
index 047156fc10..c14f0b889f 100644
--- a/lib/asn1/src/asn1ct_imm.erl
+++ b/lib/asn1/src/asn1ct_imm.erl
@@ -36,7 +36,7 @@
per_enc_small_number/2]).
-export([per_enc_extension_bit/2,per_enc_extensions/4,per_enc_optional/3]).
-export([per_enc_sof/5]).
--export([enc_absent/3,enc_append/1,enc_bind_var/1]).
+-export([enc_absent/3,enc_append/1,enc_element/2]).
-export([enc_cg/2]).
-export([optimize_alignment/1,optimize_alignment/2,
dec_slim_cg/2,dec_code_gen/2]).
@@ -256,33 +256,25 @@ per_enc_k_m_string(Val0, StringType, Constraint, Aligned) ->
B ++ [{call,erlang,length,[Val],Len},Enc]
end ++ per_enc_length(Bin, Unit, Len, SzConstraint, Aligned, k_m_string).
-per_enc_open_type([], Aligned) ->
- [{put_bits,1,8,unit(1, Aligned)},{put_bits,0,8,[1]}];
-per_enc_open_type([{'cond',
- [['_',
- {put_bits,0,0,_},
- {call,per_common,encode_unconstrained_number,_}=Call]]}],
- Aligned) ->
- %% We KNOW that encode_unconstrained_number/1 will return an IO list;
- %% therefore the call to complete/1 can be replaced with a cheaper
- %% call to iolist_to_binary/1.
- {Dst,Imm} = per_enc_open_type_output([Call], []),
- ToBin = {erlang,iolist_to_binary},
- Imm ++ per_enc_open_type(Dst, ToBin, Aligned);
-per_enc_open_type([{call,erlang,iolist_to_binary,Args}], Aligned) ->
- {_,[_,Bin,Len]} = mk_vars('dummy', [bin,len]),
- [{call,erlang,iolist_to_binary,Args,Bin},
- {call,erlang,byte_size,[Bin],Len}|per_enc_length(Bin, 8, Len, Aligned)];
per_enc_open_type(Imm0, Aligned) ->
- try
- {Prefix,Imm1} = split_off_nonbuilding(Imm0),
- Prefix ++ enc_open_type(Imm1, Aligned)
- catch
- throw:impossible ->
- {Dst,Imm} = per_enc_open_type_output(Imm0, []),
- ToBin = {enc_mod(Aligned),complete},
- Imm ++ per_enc_open_type(Dst, ToBin, Aligned)
- end.
+ Imm = case Aligned of
+ true ->
+ %% Temporarily make the implicit 'align' done by
+ %% complete/1 explicit to facilitate later
+ %% optimizations: the absence of 'align' can be used
+ %% as an indication that complete/1 can be replaced
+ %% with a cheaper operation such as
+ %% iolist_to_binary/1. The redundant 'align' will be
+ %% optimized away later.
+ Imm0 ++ [{put_bits,0,0,[1,align]}];
+ false ->
+ Imm0
+ end,
+ {[],[[],Val,Len,Bin]} = mk_vars([], [output,len,bin]),
+ [{list,Imm,Val},
+ {call,enc_mod(Aligned),complete,[Val],Bin},
+ {call,erlang,byte_size,[Bin],Len}|
+ per_enc_length(Bin, 8, Len, Aligned)].
per_enc_octet_string(Val0, Constraint0, Aligned) ->
{B,[Val,Bin,Len]} = mk_vars(Val0, [bin,len]),
@@ -316,28 +308,27 @@ per_enc_extensions(Val0, Pos0, NumBits, Aligned) when NumBits > 0 ->
_ -> [{put_bits,Bitmap,NumBits,[1]}]
end,
B++[{call,per_common,extension_bitmap,[Val,Pos,Pos+NumBits],Bitmap},
- {'cond',[[{eq,Bitmap,0}],
- ['_'|Length ++ PutBits]],{var,"Extensions"}}].
+ {list,[{'cond',[[{eq,Bitmap,0}],
+ ['_'|Length ++ PutBits]]}],
+ {var,"Extensions"}}].
per_enc_optional(Val0, {Pos,DefVals}, _Aligned) when is_integer(Pos),
is_list(DefVals) ->
- Val1 = lists:concat(["element(",Pos,", ",Val0,")"]),
- {B,[Val]} = mk_vars(Val1, []),
+ {B,Val} = enc_element(Pos, Val0),
Zero = {put_bits,0,1,[1]},
One = {put_bits,1,1,[1]},
B++[{'cond',
[[{eq,Val,DefVal},Zero] || DefVal <- DefVals] ++ [['_',One]]}];
per_enc_optional(Val0, {Pos,{call,M,F,A}}, _Aligned) when is_integer(Pos) ->
- Val1 = lists:concat(["element(",Pos,", ",Val0,")"]),
- {B,[Val,Tmp]} = mk_vars(Val1, [tmp]),
+ {B,Val} = enc_element(Pos, Val0),
+ {[],[[],Tmp]} = mk_vars([], [tmp]),
Zero = {put_bits,0,1,[1]},
One = {put_bits,1,1,[1]},
B++[{call,M,F,[Val|A],Tmp},
{'cond',
[[{eq,Tmp,true},Zero],['_',One]]}];
per_enc_optional(Val0, Pos, _Aligned) when is_integer(Pos) ->
- Val1 = lists:concat(["element(",Pos,", ",Val0,")"]),
- {B,[Val]} = mk_vars(Val1, []),
+ {B,Val} = enc_element(Pos, Val0),
Zero = {put_bits,0,1,[1]},
One = {put_bits,1,1,[1]},
B++[{'cond',[[{eq,Val,asn1_NOVALUE},Zero],
@@ -391,20 +382,22 @@ enc_append([H|T]) ->
[{block,H}|enc_append(T)];
enc_append([]) -> [].
-enc_bind_var(Val) ->
- {B,[{var,Var}]} = mk_vars(Val, []),
- {B,list_to_atom(Var)}.
+enc_element(N, Val0) ->
+ {[],[Val,Dst]} = mk_vars(Val0, [element]),
+ {[{call,erlang,element,[N,Val],Dst}],Dst}.
enc_cg(Imm0, false) ->
Imm1 = enc_cse(Imm0),
- Imm = enc_pre_cg(Imm1),
+ Imm2 = enc_pre_cg(Imm1),
+ Imm = enc_opt(Imm2),
enc_cg(Imm);
enc_cg(Imm0, true) ->
Imm1 = enc_cse(Imm0),
Imm2 = enc_hoist_align(Imm1),
Imm3 = enc_opt_al(Imm2),
Imm4 = per_fixup(Imm3),
- Imm = enc_pre_cg(Imm4),
+ Imm5 = enc_pre_cg(Imm4),
+ Imm = enc_opt(Imm5),
enc_cg(Imm).
%%%
@@ -972,11 +965,11 @@ mk_dest(S) -> S.
split_off_nonbuilding(Imm) ->
lists:splitwith(fun is_nonbuilding/1, Imm).
-is_nonbuilding({apply,_,_,_}) -> true;
is_nonbuilding({assign,_,_}) -> true;
is_nonbuilding({call,_,_,_,_}) -> true;
-is_nonbuilding({'cond',_,_}) -> true;
is_nonbuilding({lc,_,_,_,_}) -> true;
+is_nonbuilding({set,_,_}) -> true;
+is_nonbuilding({list,_,_}) -> true;
is_nonbuilding({sub,_,_,_}) -> true;
is_nonbuilding({'try',_,_,_,_}) -> true;
is_nonbuilding(_) -> false.
@@ -986,17 +979,13 @@ mk_vars(Input0, Temps) ->
Curr = asn1ct_name:curr(enc),
[H|T] = atom_to_list(Curr),
Base = [H - ($a - $A)|T ++ "@"],
- if
- is_atom(Input0) ->
- Input = {var,atom_to_list(Input0)},
- {[],[Input|mk_vars_1(Base, Temps)]};
- is_integer(Input0) ->
+ case Input0 of
+ {var,Name} when is_list(Name) ->
{[],[Input0|mk_vars_1(Base, Temps)]};
- Input0 =:= [] ->
+ [] ->
{[],[Input0|mk_vars_1(Base, Temps)]};
- true ->
- Input = mk_var(Base, input),
- {[{assign,Input,Input0}],[Input|mk_vars_1(Base, Temps)]}
+ _ when is_integer(Input0) ->
+ {[],[Input0|mk_vars_1(Base, Temps)]}
end.
mk_vars_1(Base, Vars) ->
@@ -1143,8 +1132,15 @@ per_enc_length(Bin, Unit, Len, {Lb,Ub}, Aligned, Type)
U = unit(Unit, Aligned, Type, Lb*Unit, Ub*Unit),
PutBits = [{put_bits,Bin,binary,U}],
build_length_cond(Prefix, [[Check|PutLen++PutBits]]);
-per_enc_length(Bin, Unit, Len, Sv, Aligned, Type) when is_integer(Sv) ->
- NumBits = Sv*Unit,
+per_enc_length(Bin, Unit0, Len, Sv, Aligned, Type) when is_integer(Sv) ->
+ NumBits = Sv*Unit0,
+ Unit = case NumBits rem 8 of
+ 0 ->
+ %% Help out the alignment optimizer.
+ 8;
+ _ ->
+ Unit0
+ end,
U = unit(Unit, Aligned, Type, NumBits, NumBits),
Pb = {put_bits,Bin,binary,U},
[{'cond',[[{eq,Len,Sv},Pb]]}].
@@ -1358,58 +1354,6 @@ opt_choice_2([_|_], _) ->
throw(impossible);
opt_choice_2([], _) -> [].
-
-%%%
-%%% Helper functions for code generation of open types.
-%%%
-
-per_enc_open_type(Val0, {ToBinMod,ToBinFunc}, Aligned) ->
- {B,[Val,Len,Bin]} = mk_vars(Val0, [len,bin]),
- B ++ [{call,ToBinMod,ToBinFunc,[Val],Bin},
- {call,erlang,byte_size,[Bin],Len}|
- per_enc_length(Bin, 8, Len, Aligned)].
-
-enc_open_type([{'cond',Cs}], Aligned) ->
- [{'cond',[[C|enc_open_type_1(Act, Aligned)] || [C|Act] <- Cs]}];
-enc_open_type(_, _) ->
- throw(impossible).
-
-enc_open_type_1([{error,_}]=Imm, _) ->
- Imm;
-enc_open_type_1(Imm, Aligned) ->
- NumBits = num_bits(Imm, 0),
- Pad = case 8 - (NumBits rem 8) of
- 8 -> [];
- Pad0 -> [{put_bits,0,Pad0,[1]}]
- end,
- NumBytes = (NumBits+7) div 8,
- enc_length(NumBytes, no, Aligned) ++ Imm ++ Pad.
-
-num_bits([{put_bits,_,N,[U|_]}|T], Sum) when is_integer(N) ->
- num_bits(T, Sum+N*U);
-num_bits([_|_], _) ->
- throw(impossible);
-num_bits([], Sum) -> Sum.
-
-per_enc_open_type_output([{apply,F,A}], Acc) ->
- Dst = output_var(),
- {Dst,lists:reverse(Acc, [{apply,F,A,{var,atom_to_list(Dst)}}])};
-per_enc_open_type_output([{call,M,F,A}], Acc) ->
- Dst = output_var(),
- {Dst,lists:reverse(Acc, [{call,M,F,A,{var,atom_to_list(Dst)}}])};
-per_enc_open_type_output([{'cond',Cs}], Acc) ->
- Dst = output_var(),
- {Dst,lists:reverse(Acc, [{'cond',Cs,{var,atom_to_list(Dst)}}])};
-per_enc_open_type_output([H|T], Acc) ->
- per_enc_open_type_output(T, [H|Acc]).
-
-output_var() ->
- asn1ct_name:new(enc),
- Curr = asn1ct_name:curr(enc),
- [H|T] = atom_to_list(Curr),
- list_to_atom([H - ($a - $A)|T ++ "@output"]).
-
-
%%%
%%% Optimize list comprehensions (SEQUENCE OF/SET OF).
%%%
@@ -1587,16 +1531,16 @@ collect_put_bits(Imm) ->
%%% the same element twice.
%%%
-enc_cse([{assign,{var,V},E}=H|T]) ->
- [H|enc_cse_1(T, E, V)];
+enc_cse([{call,erlang,element,Args,V}=H|T]) ->
+ [H|enc_cse_1(T, Args, V)];
enc_cse(Imm) -> Imm.
-enc_cse_1([{assign,Dst,E}|T], E, V) ->
- [{assign,Dst,V}|enc_cse_1(T, E, V)];
-enc_cse_1([{block,Bl}|T], E, V) ->
- [{block,enc_cse_1(Bl, E, V)}|enc_cse_1(T, E, V)];
-enc_cse_1([H|T], E, V) ->
- [H|enc_cse_1(T, E, V)];
+enc_cse_1([{call,erlang,element,Args,Dst}|T], Args, V) ->
+ [{set,V,Dst}|enc_cse_1(T, Args, V)];
+enc_cse_1([{block,Bl}|T], Args, V) ->
+ [{block,enc_cse_1(Bl, Args, V)}|enc_cse_1(T, Args, V)];
+enc_cse_1([H|T], Args, V) ->
+ [H|enc_cse_1(T, Args, V)];
enc_cse_1([], _, _) -> [].
@@ -1637,7 +1581,7 @@ enc_pre_cg_2({block,Bl0}, StL, StB) ->
enc_pre_cg_1(Bl0, StL, StB);
enc_pre_cg_2({call,_,_,_}=Imm, _, _) ->
Imm;
-enc_pre_cg_2({call_gen,_,_,_,_}=Imm, _, _) ->
+enc_pre_cg_2({call_gen,_,_,_,_,_}=Imm, _, _) ->
Imm;
enc_pre_cg_2({'cond',Cs0}, StL, _StB) ->
Cs = [{C,enc_pre_cg_1(Act, StL, outside_seq)} || [C|Act] <- Cs0],
@@ -1662,18 +1606,22 @@ enc_pre_cg_2({var,_}=Imm, _, _) -> Imm.
enc_make_cons({binary,H}, {binary,T}) ->
{binary,H++T};
enc_make_cons({binary,H0}, {cons,{binary,H1},T}) ->
- {cons,{binary,H0++H1},T};
+ enc_make_cons({binary,H0++H1}, T);
+enc_make_cons({binary,H}, {cons,{integer,Int},T}) ->
+ enc_make_cons({binary,H++[{put_bits,Int,8,[1]}]}, T);
enc_make_cons({integer,Int}, {binary,T}) ->
{binary,[{put_bits,Int,8,[1]}|T]};
+enc_make_cons({integer,Int}, {cons,{binary,H},T}) ->
+ enc_make_cons({binary,[{put_bits,Int,8,[1]}|H]}, T);
enc_make_cons(H, T) ->
{cons,H,T}.
-enc_pre_cg_nonbuilding({'cond',Cs0,Dst}, StL) ->
- Cs = [{C,enc_pre_cg_1(Act, StL, outside_seq)} || [C|Act] <- Cs0],
- {'cond',Cs,Dst};
enc_pre_cg_nonbuilding({lc,B0,Var,List,Dst}, StL) ->
B = enc_pre_cg_1(B0, StL, outside_seq),
{lc,B,Var,List,Dst};
+enc_pre_cg_nonbuilding({list,List0,Dst}, _StL) ->
+ List = enc_pre_cg_1(List0, outside_list, outside_seq),
+ {list,List,Dst};
enc_pre_cg_nonbuilding({'try',Try0,{P,Succ0},Else0,Dst}, StL) ->
Try = enc_pre_cg_1(Try0, StL, outside_seq),
Succ = enc_pre_cg_1(Succ0, StL, outside_seq),
@@ -1681,6 +1629,562 @@ enc_pre_cg_nonbuilding({'try',Try0,{P,Succ0},Else0,Dst}, StL) ->
{'try',Try,{P,Succ},Else,Dst};
enc_pre_cg_nonbuilding(Imm, _) -> Imm.
+%%%
+%%% Optimize calls to complete/1 and surrounding code. There are
+%%% several opportunities for optimizations.
+%%%
+%%% It may be possible to replace the call to complete/1 with
+%%% something cheaper (most important for the PER back-end which has
+%%% an expensive complete/1 implementation). If we can be sure that
+%%% complete/1 will be called with an iolist (no 'align' atoms or
+%%% bitstrings in the list), we can call iolist_to_binary/1
+%%% instead. If the list may include bitstrings, we can can call
+%%% list_to_bitstring/1 (note that list_to_bitstring/1 does not accept
+%%% a binary or bitstring, so we MUST be sure that we only pass it a
+%%% list). If complete/1 is called with a binary, we can omit the
+%%% call altogether.
+%%%
+%%% A call to byte_size/1 that follows complete/1 can be eliminated
+%%% if the size of the binary produced by complete/1 can be determined
+%%% and is constant.
+%%%
+%%% The code that encodes the length descriptor (a 'cond' instruction)
+%%% for a binary produced by complete/1 can be simplified if the lower
+%%% and upper bounds for the size of the binary are known.
+%%%
+
+-record(ost,
+ {sym,
+ t
+ }).
+
+enc_opt(Imm0) ->
+ {Imm,_} = enc_opt(Imm0, #ost{sym=gb_trees:empty()}),
+ Imm.
+
+enc_opt(align, St) ->
+ {align,St#ost{t=t_align({0,7})}};
+enc_opt({apply,What,As}, St) ->
+ {{apply,What,subst_list(As, St)},St#ost{t=t_any()}};
+enc_opt({assign,_,_}=Imm, St) ->
+ {Imm,St};
+enc_opt({binary,PutBits0}, St) ->
+ PutBits = [{put_bits,subst(V, St),Sz,F} ||
+ {put_bits,V,Sz,F} <- PutBits0],
+ NumBits = lists:foldl(fun({put_bits,_,Bits,_}, Sum) ->
+ Sum+Bits
+ end, 0, PutBits),
+ {{binary,PutBits},St#ost{t=t_bitstring(NumBits)}};
+enc_opt({block,Bl0}, St0) ->
+ {Bl,St} = enc_opt(Bl0, St0),
+ {{block,Bl},St};
+enc_opt({call,binary,encode_unsigned,[Int],Bin}=Imm, St0) ->
+ Type = get_type(Int, St0),
+ St = case t_range(Type) of
+ any ->
+ set_type(Bin, t_binary(), St0);
+ {Lb0,Ub0} ->
+ Lb = bit_size(binary:encode_unsigned(Lb0)),
+ Ub = bit_size(binary:encode_unsigned(Ub0)),
+ set_type(Bin, t_binary({Lb,Ub}), St0)
+ end,
+ {Imm,St};
+enc_opt({call,erlang,bit_size,[Bin],Dst}=Imm0, St0) ->
+ Type = get_type(Bin, St0),
+ case t_range(Type) of
+ any ->
+ St1 = set_type(Bin, t_bitstring(), St0),
+ St = propagate(Dst,
+ fun(T, S) ->
+ bit_size_propagate(Bin, T, S)
+ end, St1),
+ {Imm0,St};
+ {Lb,Ub}=Range ->
+ St = set_type(Dst, t_integer(Range), St0),
+ Imm = case Lb of
+ Ub -> none;
+ _ -> Imm0
+ end,
+ {Imm,St}
+ end;
+enc_opt({call,erlang,byte_size,[Bin],Dst}=Imm0, St0) ->
+ Type = get_type(Bin, St0),
+ case t_range(Type) of
+ any ->
+ St1 = set_type(Bin, t_binary(), St0),
+ St = propagate(Dst,
+ fun(T, S) ->
+ byte_size_propagate(Bin, T, S)
+ end, St1),
+ {Imm0,St};
+ {Lb0,Ub0} ->
+ Lb = (Lb0+7) div 8,
+ Ub = (Ub0+7) div 8,
+ St = set_type(Dst, t_integer({Lb,Ub}), St0),
+ Imm = case Lb of
+ Ub -> none;
+ _ -> Imm0
+ end,
+ {Imm,St}
+ end;
+enc_opt({call,erlang,iolist_to_binary,_}=Imm, St) ->
+ {Imm,St#ost{t=t_binary()}};
+enc_opt({call,erlang,length,[List],Dst}=Imm0, St0) ->
+ St1 = propagate(Dst,
+ fun(T, S) ->
+ length_propagate(List, T, S)
+ end, St0),
+ {Imm0,St1};
+enc_opt({call,per,complete,[Data],Dst}, St0) ->
+ Type = get_type(Data, St0),
+ St = set_type(Dst, t_binary(t_range(Type)), St0),
+ case t_type(Type) of
+ binary ->
+ {{set,Data,Dst},St};
+ bitlist ->
+ %% We KNOW that list_to_bitstring/1 will construct
+ %% a binary (the number of bits is divisible by 8)
+ %% because per_enc_open_type/2 added an 'align' atom
+ %% at the end. If that 'align' atom had not been
+ %% optimized away, the type would have been 'align'
+ %% instead of 'bitlist'.
+ {{call,erlang,list_to_bitstring,[Data],Dst},St};
+ iolist ->
+ {{call,erlang,iolist_to_binary,[Data],Dst},St};
+ nil ->
+ Imm = {list,{binary,[{put_bits,0,8,[1]}]},Dst},
+ enc_opt(Imm, St0);
+ _ ->
+ {{call,per,complete,[Data],Dst},St}
+ end;
+enc_opt({call,uper,complete,[Data],Dst}, St0) ->
+ Type = get_type(Data, St0),
+ St = set_type(Dst, t_binary(t_range(Type)), St0),
+ case t_type(Type) of
+ binary ->
+ {{set,Data,Dst},St0};
+ iolist ->
+ {{call,erlang,iolist_to_binary,[Data],Dst},St};
+ nil ->
+ Imm = {list,{binary,[{put_bits,0,8,[1]}]},Dst},
+ enc_opt(Imm, St0);
+ _ ->
+ %% 'bitlist' or 'any'.
+ {{call,uper,complete,[Data],Dst},St}
+ end;
+enc_opt({call,per_common,encode_chars,[List,NumBits|_],Dst}=Imm, St0) ->
+ %% Note: Never used when NumBits =:= 8 (list_to_binary/1 will
+ %% be used instead).
+ St1 = set_type(Dst, t_bitstring(), St0),
+ St = propagate(List,
+ fun(T, S) ->
+ char_propagate(Dst, T, NumBits, S)
+ end, St1),
+ {Imm,St};
+enc_opt({call,per_common,encode_chars_16bit,[List],Dst}=Imm, St0) ->
+ St1 = set_type(Dst, t_binary(), St0),
+ St = propagate(List,
+ fun(T, S) ->
+ char_propagate(Dst, T, 16, S)
+ end, St1),
+ {Imm,St};
+enc_opt({call,per_common,encode_big_chars,[List],Dst}=Imm, St0) ->
+ St1 = set_type(Dst, t_binary(), St0),
+ St = propagate(List,
+ fun(T, S) ->
+ char_propagate(Dst, T, 32, S)
+ end, St1),
+ {Imm,St};
+enc_opt({call,per_common,encode_fragmented,[_,Unit]}=Imm, St) ->
+ T = case Unit rem 8 of
+ 0 -> t_iolist();
+ _ -> t_bitlist()
+ end,
+ {Imm,St#ost{t=T}};
+enc_opt({call,per_common,encode_unconstrained_number,_}=Imm, St) ->
+ {Imm,St#ost{t=t_iolist()}};
+enc_opt({call,per_common,bitstring_from_positions,_}=Imm, St) ->
+ {Imm,St#ost{t=t_bitstring()}};
+enc_opt({call,per_common,to_named_bitstring,_}=Imm, St) ->
+ {Imm,St#ost{t=t_bitstring()}};
+enc_opt({call,_,_,_}=Imm, St) ->
+ {Imm,St#ost{t=t_any()}};
+enc_opt({call,_,_,_,_}=Imm, St) ->
+ {Imm,St#ost{t=undefined}};
+enc_opt({call_gen,N,K,F,L,As}, St) ->
+ {{call_gen,N,K,F,L,subst(As, St)},St#ost{t=t_any()}};
+enc_opt({'cond',Cs0}, St0) ->
+ case enc_opt_cs(Cs0, St0) of
+ [{'_',Imm,Type}] ->
+ {Imm,St0#ost{t=Type}};
+ [{Cond,Imm,Type0}|Cs1] ->
+ {Cs,Type} = enc_opt_cond_1(Cs1, Type0, [{Cond,Imm}]),
+ {{'cond',Cs},St0#ost{t=Type}}
+ end;
+enc_opt({cons,H0,T0}, St0) ->
+ {H,#ost{t=TypeH}=St1} = enc_opt(H0, St0),
+ {T,#ost{t=TypeT}=St} = enc_opt(T0, St1),
+ {{cons,H,T},St#ost{t=t_cons(TypeH, TypeT)}};
+enc_opt({error,_}=Imm, St) ->
+ {Imm,St#ost{t=t_any()}};
+enc_opt({integer,V}, St) ->
+ {{integer,subst(V, St)},St#ost{t=t_integer()}};
+enc_opt({lc,E0,B,C}, St) ->
+ {E,_} = enc_opt(E0, St),
+ {{lc,E,B,C},St#ost{t=t_any()}};
+enc_opt({lc,E0,B,C,Dst}, St) ->
+ {E,_} = enc_opt(E0, St),
+ {{lc,E,B,C,Dst},St#ost{t=undefined}};
+enc_opt({list,Imm0,Dst}, St0) ->
+ {Imm,#ost{t=Type}=St1} = enc_opt(Imm0, St0),
+ St = set_type(Dst, Type, St1),
+ {{list,Imm,Dst},St#ost{t=undefined}};
+enc_opt(nil, St) ->
+ {nil,St#ost{t=t_nil()}};
+enc_opt({seq,H0,T0}, St0) ->
+ {H,St1} = enc_opt(H0, St0),
+ {T,St} = enc_opt(T0, St1),
+ case {H,T} of
+ {none,_} ->
+ {T,St};
+ {{list,Imm,Data},
+ {seq,{call,per,complete,[Data],_},_}} ->
+ %% Get rid of any explicit 'align' added by per_enc_open_type/2.
+ {{seq,{list,remove_trailing_align(Imm),Data},T},St};
+ {_,_} ->
+ {{seq,H,T},St}
+ end;
+enc_opt({set,_,_}=Imm, St) ->
+ {Imm,St#ost{t=undefined}};
+enc_opt({sub,Src0,Int,Dst}, St0) ->
+ Src = subst(Src0, St0),
+ Type = get_type(Src, St0),
+ St = case t_range(Type) of
+ any ->
+ propagate(Dst,
+ fun(T, S) ->
+ set_type(Src, t_add(T, Int), S)
+ end,
+ St0);
+ {Lb,Ub} ->
+ set_type(Dst, t_integer({Lb-Int,Ub-Int}), St0)
+ end,
+ {{sub,Src,Int,Dst},St#ost{t=undefined}};
+enc_opt({'try',Try0,{P,Succ0},Else0,Dst}, St0) ->
+ {Try,_} = enc_opt(Try0, St0),
+ {Succ,_} = enc_opt(Succ0, St0),
+ {Else,_} = enc_opt(Else0, St0),
+ {{'try',Try,{P,Succ},Else,Dst},St0#ost{t=undefined}};
+enc_opt({var,_}=Imm, St) ->
+ Type = get_type(Imm, St),
+ {subst(Imm, St),St#ost{t=Type}}.
+
+remove_trailing_align({block,Bl}) ->
+ {block,remove_trailing_align(Bl)};
+remove_trailing_align({cons,H,{cons,align,nil}}) ->
+ H;
+remove_trailing_align({seq,H,T}) ->
+ {seq,H,remove_trailing_align(T)};
+remove_trailing_align(Imm) -> Imm.
+
+bit_size_propagate(Bin, Type, St) ->
+ case t_range(Type) of
+ any ->
+ St;
+ {Lb,Ub} ->
+ set_type(Bin, t_bitstring({Lb,Ub}), St)
+ end.
+
+byte_size_propagate(Bin, Type, St) ->
+ case t_range(Type) of
+ any ->
+ St;
+ {Lb,Ub} ->
+ set_type(Bin, t_binary({Lb*8,Ub*8}), St)
+ end.
+
+char_propagate(Dst, T, NumBits, St) ->
+ case t_range(T) of
+ any ->
+ St;
+ {Sz,Sz} when Sz*NumBits rem 8 =:= 0 ->
+ Bits = Sz*NumBits,
+ set_type(Dst, t_binary({Bits,Bits}), St);
+ {Lb,Ub} ->
+ Range = {Lb*NumBits,Ub*NumBits},
+ case NumBits rem 8 of
+ 0 ->
+ set_type(Dst, t_binary(Range), St);
+ _ ->
+ set_type(Dst, t_bitstring(Range), St)
+ end
+ end.
+
+length_propagate(List, Type, St) ->
+ set_type(List, t_list(t_range(Type)), St).
+
+enc_opt_cond_1([{Cond,{error,_}=Imm,_}|T], St, Acc) ->
+ enc_opt_cond_1(T, St, [{Cond,Imm}|Acc]);
+enc_opt_cond_1([{Cond,Imm,Curr0}|T], Curr1, Acc) ->
+ Curr = t_join(Curr0, Curr1),
+ enc_opt_cond_1(T, Curr, [{Cond,Imm}|Acc]);
+enc_opt_cond_1([], St, Acc) ->
+ {lists:reverse(Acc),St}.
+
+enc_opt_cs([{Cond,Imm0}|T], St0) ->
+ case eo_eval_cond(Cond, St0) of
+ false ->
+ enc_opt_cs(T, St0);
+ true ->
+ {Imm,#ost{t=Type}} = enc_opt(Imm0, St0),
+ [{'_',Imm,Type}];
+ maybe ->
+ St = update_type_info(Cond, St0),
+ {Imm,#ost{t=Type}} = enc_opt(Imm0, St),
+ [{Cond,Imm,Type}|enc_opt_cs(T, St0)]
+ end;
+enc_opt_cs([], _) -> [].
+
+eo_eval_cond('_', _) ->
+ true;
+eo_eval_cond({Op,{var,_}=Var,Val}, St) ->
+ Type = get_type(Var, St),
+ case t_range(Type) of
+ any -> maybe;
+ {_,_}=Range -> eval_cond_range(Op, Range, Val)
+ end;
+eo_eval_cond({_Op,{expr,_},_Val}, _St) -> maybe.
+
+eval_cond_range(lt, {Lb,Ub}, Val) ->
+ if
+ Ub < Val -> true;
+ Val =< Lb -> false;
+ true -> maybe
+ end;
+eval_cond_range(_Op, _Range, _Val) -> maybe.
+
+update_type_info({ult,{var,_}=Var,Val}, St) ->
+ Int = t_integer({0,Val-1}),
+ Type = t_meet(get_type(Var, St), Int),
+ set_type(Var, Type, St);
+update_type_info({lt,{var,_}=Var,Val}, St) ->
+ Int = t_integer({0,Val-1}),
+ Type = t_meet(get_type(Var, St), Int),
+ set_type(Var, Type, St);
+update_type_info({eq,{var,_}=Var,Val}, St) when is_integer(Val) ->
+ Int = t_integer(Val),
+ Type = t_meet(get_type(Var, St), Int),
+ set_type(Var, Type, St);
+update_type_info({eq,_,_}, St) ->
+ St;
+update_type_info({ge,_,_}, St) -> St.
+
+subst_list(As, St) ->
+ [subst(A, St) || A <- As].
+
+subst({var,_}=Var, St) ->
+ Type = get_type(Var, St),
+ case t_type(Type) of
+ integer ->
+ case t_range(Type) of
+ any -> Var;
+ {Val,Val} -> Val;
+ {_,_} -> Var
+ end;
+ _ ->
+ Var
+ end;
+subst(V, _St) -> V.
+
+set_type({var,Var}, {_,_}=Type, #ost{sym=Sym0}=St0) ->
+ Sym1 = gb_trees:enter(Var, Type, Sym0),
+ case gb_trees:lookup({propagate,Var}, Sym1) of
+ none ->
+ St0#ost{sym=Sym1};
+ {value,Propagate} ->
+ Sym = gb_trees:delete({propagate,Var}, Sym1),
+ St = St0#ost{sym=Sym},
+ Propagate(Type, St)
+ end.
+
+get_type({var,V}, #ost{sym=Sym}) ->
+ case gb_trees:lookup(V, Sym) of
+ none -> t_any();
+ {value,T} -> T
+ end.
+
+propagate({var,Var}, Propagate, #ost{sym=Sym0}=St) when is_function(Propagate, 2) ->
+ Sym = gb_trees:enter({propagate,Var}, Propagate, Sym0),
+ St#ost{sym=Sym}.
+
+%%%
+%%% A simple type system.
+%%%
+%%% Each type descriptions is a tuple {Type,Range}.
+%%% Type is one of the following atoms:
+%%%
+%%% Type name Description
+%%% --------- -----------
+%%% any Anything.
+%%%
+%%% align Basically iodata, but the list may contain bitstrings
+%%% and the the atom 'align'. Can be passed to complete/1
+%%% to construct a binary. Only used for aligned PER (per).
+%%%
+%%% bitstring An Erlang bitstring.
+%%%
+%%% bitlist A list that may be passed to list_to_bitstring/1 to
+%%% construct a bitstring.
+%%% NOTE: When analysing aligned PER (per), the number
+%%% of bits in the bitlist is always divisible by 8 (if
+%%% not, the type will be 'align' instead).
+%%%
+%%% binary An Erlang binary (the number of bits is divisible by 8).
+%%%
+%%% iolist An Erlang iolist.
+%%%
+%%% nil []
+%%%
+%%% integer An integer.
+%%%
+%%%
+%%% Range is one of:
+%%%
+%%% any
+%%% {LowerBound,UpperBound}
+%%%
+%%%
+
+t_align(Range) ->
+ {align,t__range(Range)}.
+
+t_any() ->
+ {any,any}.
+
+t_binary() ->
+ {binary,any}.
+
+t_binary(Range) ->
+ {binary,t__range(Range)}.
+
+t_bitlist() ->
+ {bitlist,any}.
+
+t_bitstring() ->
+ {bitstring,any}.
+
+t_bitstring(Range0) ->
+ case t__range(Range0) of
+ {Bits,Bits}=Range when Bits rem 8 =:= 0 ->
+ {binary,Range};
+ Range ->
+ {bitstring,Range}
+ end.
+
+t_add({integer,{Lb,Ub}}, N) ->
+ {integer,{Lb+N,Ub+N}}.
+
+t_cons({_,_}=T1, {_,_}=T2) ->
+ T = case {t__cons_type(T1),t__cons_type(T2)} of
+ {_,any} -> any;
+ {any,_} -> any;
+ {align,_} -> align;
+ {_,align} -> align;
+ {binary,binary} -> iolist;
+ {binary,bitstring} -> bitlist;
+ {bitstring,binary} -> bitlist;
+ {bitstring,bitstring} -> bitlist
+ end,
+ {T,t__cons_ranges(t__cons_range(T1), t__cons_range(T2))}.
+
+t_integer() ->
+ {integer,any}.
+
+t_integer(Range) ->
+ {integer,t__range(Range)}.
+
+t_iolist() ->
+ {iolist,any}.
+
+t_list(Range) ->
+ {list,t__range(Range)}.
+
+t_nil() ->
+ {nil,{0,0}}.
+
+t_meet({T1,Range1}, {T2,Range2}) ->
+ {t_meet_types(T1, T2),t_meet_ranges(Range1, Range2)}.
+
+t_meet_types(integer, integer) -> integer;
+t_meet_types(any, integer) -> integer.
+
+t_meet_ranges(any, Range) ->
+ Range;
+t_meet_ranges({Lb1,Ub1}, {Lb2,Ub2}) ->
+ if
+ Lb1 =< Ub2, Lb2 =< Ub1 ->
+ {max(Lb1, Lb2),Ub1};
+ Lb2 =< Ub1, Lb1 =< Ub2 ->
+ {max(Lb1, Lb2),Ub2}
+ end.
+
+t_join({T1,Range1}, {T2,Range2}) ->
+ T = t_join_types(lists:sort([T1,T2])),
+ Range = t_join_ranges(Range1, Range2),
+ {T,Range}.
+
+t_join_ranges({Lb1,Ub1}, {Lb2,Ub2}) ->
+ {min(Lb1, Lb2),max(Ub1, Ub2)};
+t_join_ranges(any, _) -> any;
+t_join_ranges(_, any) -> any.
+
+t_join_types([T,T]) -> T;
+t_join_types([align,any]) -> any;
+t_join_types([align,_]) -> align;
+t_join_types([any,_]) -> any;
+t_join_types([bitlist,bitstring]) -> any;
+t_join_types([bitlist,integer]) -> any;
+t_join_types([bitlist,iolist]) -> bitlist;
+t_join_types([bitlist,nil]) -> bitlist;
+t_join_types([binary,bitlist]) -> bitlist;
+t_join_types([binary,bitstring]) -> bitstring;
+t_join_types([binary,integer]) -> binary;
+t_join_types([binary,iolist]) -> iolist;
+t_join_types([binary,nil]) -> iolist;
+t_join_types([bitstring,integer]) -> any;
+t_join_types([bitstring,iolist]) -> any;
+t_join_types([bitstring,nil]) -> any;
+t_join_types([integer,_]) -> any;
+t_join_types([iolist,nil]) -> iolist.
+
+t_type({T,_}) -> T.
+
+t_range({_,Range}) -> Range.
+
+t__cons_type({align,_}) -> align;
+t__cons_type({any,_}) -> any;
+t__cons_type({binary,_}) -> binary;
+t__cons_type({bitstring,_}) -> bitstring;
+t__cons_type({bitlist,_}) -> bitstring;
+t__cons_type({integer,_}) -> binary;
+t__cons_type({iolist,_}) -> binary;
+t__cons_type({nil,_}) -> binary.
+
+t__cons_range({integer,_}) -> {8,8};
+t__cons_range({_,Range}) -> Range.
+
+t__cons_ranges({Lb1,Ub1}, {Lb2,Ub2}) ->
+ {Lb1+Lb2,Ub1+Ub2};
+t__cons_ranges(any, _) -> any;
+t__cons_ranges(_, any) -> any.
+
+t__range({Lb,Ub}=Range) when is_integer(Lb), is_integer(Ub) ->
+ Range;
+t__range(any) ->
+ any;
+t__range(Val) when is_integer(Val) ->
+ {Val,Val}.
+
%%%
%%% Code generation for encoding.
@@ -1702,19 +2206,10 @@ enc_cg(align) ->
enc_cg({apply,F0,As0}) ->
As = enc_call_args(As0, ""),
case F0 of
- {M,F} ->
- emit([{asis,M},":",{asis,F},"(",As,")"]);
- F when is_atom(F) ->
- emit([{asis,F},"(",As,")"])
- end;
-enc_cg({apply,F0,As0,Dst}) ->
- As = enc_call_args(As0, ""),
- emit([mk_val(Dst)," = "]),
- case F0 of
- {M,F} ->
- emit([{asis,M},":",{asis,F},"(",As,")"]);
- F when is_atom(F) ->
- emit([{asis,F},"(",As,")"])
+ {local,F,_} when is_atom(F) ->
+ emit([{asis,F},"(",As,")"]);
+ {M,F,_} ->
+ emit([{asis,M},":",{asis,F},"(",As,")"])
end;
enc_cg({assign,Dst0,Expr}) ->
Dst = mk_val(Dst0),
@@ -1728,15 +2223,11 @@ enc_cg({call,M,F,As0,Dst}) ->
As = [mk_val(A) || A <- As0],
emit([mk_val(Dst)," = "]),
asn1ct_func:call(M, F, As);
-enc_cg({call_gen,Prefix,Key,Gen,As0}) ->
+enc_cg({call_gen,Prefix,Key,Gen,_,As0}) ->
As = [mk_val(A) || A <- As0],
asn1ct_func:call_gen(Prefix, Key, Gen, As);
enc_cg({'cond',Cs}) ->
enc_cg_cond(Cs);
-enc_cg({'cond',Cs,Dst0}) ->
- Dst = mk_val(Dst0),
- emit([Dst," = "]),
- enc_cg_cond(Cs);
enc_cg({error,Error}) when is_function(Error, 0) ->
Error();
enc_cg({error,Var0}) ->
@@ -1752,12 +2243,17 @@ enc_cg({lc,Body,Var,List,Dst}) ->
emit([mk_val(Dst)," = ["]),
enc_cg(Body),
emit([" || ",mk_val(Var)," <- ",mk_val(List),"]"]);
+enc_cg({list,List,Dst}) ->
+ emit([mk_val(Dst)," = "]),
+ enc_cg(List);
enc_cg(nil) ->
emit("[]");
enc_cg({sub,Src0,Int,Dst0}) ->
Src = mk_val(Src0),
Dst = mk_val(Dst0),
emit([Dst," = ",Src," - ",Int]);
+enc_cg({set,{var,Src},{var,Dst}}) ->
+ emit([Dst," = ",Src]);
enc_cg({'try',Try,{P,Succ},Else,Dst}) ->
emit([mk_val(Dst)," = try "]),
enc_cg(Try),
@@ -1792,8 +2288,6 @@ enc_call_args([A|As], Sep) ->
[Sep,mk_val(A)|enc_call_args(As, ", ")];
enc_call_args([], _) -> [].
-enc_cg_cond([{'_',Action}]) ->
- enc_cg(Action);
enc_cg_cond(Cs) ->
emit("if "),
enc_cg_cond(Cs, ""),
@@ -1849,7 +2343,7 @@ mk_val(Other) -> {asis,Other}.
bit_string_name2pos_fun(NNL, Src) ->
{call_gen,"bit_string_name2pos_",NNL,
- fun(Fd, Name) -> gen_name2pos(Fd, Name, NNL) end,[Src]}.
+ fun(Fd, Name) -> gen_name2pos(Fd, Name, NNL) end,[],[Src]}.
gen_name2pos(Fd, Name, Names) ->
Cs0 = gen_name2pos_cs(Names, Name),
@@ -1978,19 +2472,12 @@ enc_opt_al(Imm0) ->
{Imm,_} = enc_opt_al_1(Imm0, unknown),
Imm.
-enc_opt_al_1([{'cond',Cs0,Dst},{call,per,complete,[Dst],Bin}|T0], Al0) ->
- {Cs1,{M,F}} = enc_opt_al_prepare_cond(Cs0),
- {Cs,_} = enc_opt_al_cond(Cs1, 0),
- {T,Al} = enc_opt_al_1([{call,M,F,[Dst],Bin}|T0], Al0),
- {[{'cond',Cs,Dst}|T],Al};
enc_opt_al_1([H0|T0], Al0) ->
{H,Al1} = enc_opt_al(H0, Al0),
{T,Al} = enc_opt_al_1(T0, Al1),
{H++T,Al};
enc_opt_al_1([], Al) -> {[],Al}.
-enc_opt_al({apply,_,_,_}=Imm, Al) ->
- {[Imm],Al};
enc_opt_al({assign,_,_}=Imm, Al) ->
{[Imm],Al};
enc_opt_al({block,Bl0}, Al0) ->
@@ -2012,6 +2499,10 @@ enc_opt_al({'cond',Cs0}, Al0) ->
{[{'cond',Cs}],Al};
enc_opt_al({error,_}=Imm, Al) ->
{[Imm],Al};
+enc_opt_al({list,Imm0,Dst}, Al) ->
+ Imm1 = enc_opt_hoist_align(Imm0),
+ {Imm,_} = enc_opt_al_1(Imm1, 0),
+ {[{list,Imm,Dst}],Al};
enc_opt_al({put_bits,V,N,[U,align]}, Al0) when Al0 rem 8 =:= 0 ->
Al = if
is_integer(N) -> N*U;
@@ -2038,8 +2529,12 @@ enc_opt_al({put_bits,_,N,[U]}=PutBits, Al) when is_integer(N), is_integer(Al) ->
{[PutBits],Al+N*U};
enc_opt_al({put_bits,_,binary,[U]}=PutBits, Al) when U rem 8 =:= 0 ->
{[PutBits],Al};
+enc_opt_al({set,_,_}=Imm, Al) ->
+ {[Imm],Al};
enc_opt_al({sub,_,_,_}=Imm, Al) ->
{[Imm],Al};
+enc_opt_al({'try',_,_,_,_}=Imm, Al) ->
+ {[Imm],Al};
enc_opt_al(Imm, _) ->
{[Imm],unknown}.
@@ -2063,29 +2558,25 @@ enc_opt_al_cond_1([], _, CAcc, AAcc) ->
end,
{lists:reverse(CAcc),Al}.
-enc_opt_al_prepare_cond(Cs0) ->
- try enc_opt_al_prepare_cond_1(Cs0) of
- Cs ->
- {Cs,{erlang,iolist_to_binary}}
+enc_opt_hoist_align([{'cond',Cs0},{put_bits,0,0,[1,align]}]=Imm) ->
+ try
+ Cs = [insert_align_last(C) || C <- Cs0],
+ [{'cond',Cs}]
catch
throw:impossible ->
- {Cs0,{per,complete}}
- end.
-
-enc_opt_al_prepare_cond_1(Cs) ->
- [[C|enc_opt_al_prepare_cond_2(Act)] || [C|Act] <- Cs].
-
-enc_opt_al_prepare_cond_2([{put_bits,_,binary,[U|_]}|_]) when U rem 8 =/= 0 ->
- throw(impossible);
-enc_opt_al_prepare_cond_2([{put_bits,_,_,_}=H|T]) ->
- [H|enc_opt_al_prepare_cond_2(T)];
-enc_opt_al_prepare_cond_2([{call,per_common,encode_fragmented,_}=H|T]) ->
- [H|enc_opt_al_prepare_cond_2(T)];
-enc_opt_al_prepare_cond_2([_|_]) ->
- throw(impossible);
-enc_opt_al_prepare_cond_2([]) ->
- [{put_bits,0,0,[1,align]}].
+ Imm
+ end;
+enc_opt_hoist_align(Imm) -> Imm.
+insert_align_last([_,{error,_}]=C) ->
+ C;
+insert_align_last([H|T]) ->
+ case lists:last(T) of
+ {put_bits,_,_,_} ->
+ [H|T ++ [{put_bits,0,0,[1,align]}]];
+ _ ->
+ throw(impossible)
+ end.
%%%
%%% For the aligned PER format, fix up the intermediate format
@@ -2095,8 +2586,6 @@ enc_opt_al_prepare_cond_2([]) ->
per_fixup([{apply,_,_}=H|T]) ->
[H|per_fixup(T)];
-per_fixup([{apply,_,_,_}=H|T]) ->
- [H|per_fixup(T)];
per_fixup([{block,Block}|T]) ->
[{block,per_fixup(Block)}|per_fixup(T)];
per_fixup([{'assign',_,_}=H|T]) ->
@@ -2104,14 +2593,11 @@ per_fixup([{'assign',_,_}=H|T]) ->
per_fixup([{'cond',Cs0}|T]) ->
Cs = [[C|per_fixup(Act)] || [C|Act] <- Cs0],
[{'cond',Cs}|per_fixup(T)];
-per_fixup([{'cond',Cs0,Dst}|T]) ->
- Cs = [[C|per_fixup(Act)] || [C|Act] <- Cs0],
- [{'cond',Cs,Dst}|per_fixup(T)];
per_fixup([{call,_,_,_}=H|T]) ->
[H|per_fixup(T)];
per_fixup([{call,_,_,_,_}=H|T]) ->
[H|per_fixup(T)];
-per_fixup([{call_gen,_,_,_,_}=H|T]) ->
+per_fixup([{call_gen,_,_,_,_,_}=H|T]) ->
[H|per_fixup(T)];
per_fixup([{error,_}=H|T]) ->
[H|per_fixup(T)];
@@ -2119,6 +2605,10 @@ per_fixup([{lc,B,V,L}|T]) ->
[{lc,per_fixup(B),V,L}|per_fixup(T)];
per_fixup([{lc,B,V,L,Dst}|T]) ->
[{lc,per_fixup(B),V,L,Dst}|per_fixup(T)];
+per_fixup([{list,Imm,Dst}|T]) ->
+ [{list,per_fixup(Imm),Dst}|per_fixup(T)];
+per_fixup([{set,_,_}=H|T]) ->
+ [H|per_fixup(T)];
per_fixup([{sub,_,_,_}=H|T]) ->
[H|per_fixup(T)];
per_fixup([{'try',Try0,{P,Succ0},Else0,Dst}|T]) ->
diff --git a/lib/asn1/test/asn1_SUITE_data/SeqPrim.asn1 b/lib/asn1/test/asn1_SUITE_data/SeqPrim.asn1
index 20c4126c0b..7068674647 100644
--- a/lib/asn1/test/asn1_SUITE_data/SeqPrim.asn1
+++ b/lib/asn1/test/asn1_SUITE_data/SeqPrim.asn1
@@ -16,4 +16,11 @@ Seq ::= SEQUENCE
Empty ::= SEQUENCE {}
+Big ::= SEQUENCE {
+ ...,
+ os1 [1] OCTET STRING (SIZE (120..130)) OPTIONAL,
+ os2 [2] OCTET STRING (SIZE (128..256)) OPTIONAL,
+ os3 [3] OCTET STRING (SIZE (17000..30000)) OPTIONAL
+}
+
END
diff --git a/lib/asn1/test/testSeqPrim.erl b/lib/asn1/test/testSeqPrim.erl
index eb21d50a37..46bac77910 100644
--- a/lib/asn1/test/testSeqPrim.erl
+++ b/lib/asn1/test/testSeqPrim.erl
@@ -25,6 +25,7 @@
-record('Seq',{bool, boolCon, boolPri, boolApp, boolExpCon, boolExpPri, boolExpApp}).
-record('Empty',{}).
+-record('Big', {os1,os2,os3}).
main(_Rules) ->
roundtrip('Seq', #'Seq'{bool=true,boolCon=true,boolPri=true,boolApp=true,
@@ -35,6 +36,9 @@ main(_Rules) ->
roundtrip('Seq', #'Seq'{bool=false,boolCon=true,boolPri=false,boolApp=true,
boolExpCon=false,boolExpPri=true,boolExpApp=false}),
roundtrip('Empty', #'Empty'{}),
+ roundtrip('Big', #'Big'{os1=lists:duplicate(120, 16#A5),
+ os2=lists:duplicate(128, 16#A7),
+ os3=lists:duplicate(17777, 16#F5)}),
ok.
roundtrip(Type, Value) ->
diff --git a/lib/asn1/test/test_compile_options.erl b/lib/asn1/test/test_compile_options.erl
index 179299c78d..7f358e863c 100644
--- a/lib/asn1/test/test_compile_options.erl
+++ b/lib/asn1/test/test_compile_options.erl
@@ -123,7 +123,7 @@ verbose(Config) when is_list(Config) ->
?line ok = asn1ct:compile(Asn1File, [{i,DataDir},{outdir,OutDir},noobj,verbose]),
?line test_server:capture_stop(),
?line [Line0|_] = test_server:capture_get(),
- ?line true = lists:prefix("Erlang ASN.1 version", Line0),
+ ?line true = lists:prefix("Erlang ASN.1 compiler", Line0),
%% Test non-verbose compile
?line test_server:capture_start(),
diff --git a/lib/common_test/doc/src/run_test_chapter.xml b/lib/common_test/doc/src/run_test_chapter.xml
index 44fe73d24f..a4a77ee400 100644
--- a/lib/common_test/doc/src/run_test_chapter.xml
+++ b/lib/common_test/doc/src/run_test_chapter.xml
@@ -215,7 +215,7 @@
<pre>-exit_status ignore_config</pre>
<p>For more information about the <c>ct_run</c> program, see the
- <seealso marker="ct_run#top">Reference Manual</seealso> and the
+ <seealso marker="ct_run">Reference Manual</seealso> and the
<seealso marker="install_chapter#general">Installation</seealso> chapter.
</p>
</section>
diff --git a/lib/compiler/doc/src/compile.xml b/lib/compiler/doc/src/compile.xml
index 73d75851cf..1459f696a0 100644
--- a/lib/compiler/doc/src/compile.xml
+++ b/lib/compiler/doc/src/compile.xml
@@ -350,12 +350,18 @@ module.beam: module.erl \
parsed code before the code is checked for errors.</p>
</item>
- <tag><c>asm</c></tag>
+ <tag><c>from_asm</c></tag>
<item>
<p>The input file is expected to be assembler code (default
file suffix ".S"). Note that the format of assembler files
- is not documented, and may change between releases - this
- option is primarily for internal debugging use.</p>
+ is not documented, and may change between releases.</p>
+ </item>
+
+ <tag><c>from_core</c></tag>
+ <item>
+ <p>The input file is expected to be core code (default
+ file suffix ".core"). Note that the format of core files
+ is not documented, and may change between releases.</p>
</item>
<tag><c>no_strict_record_tests</c></tag>
diff --git a/lib/compiler/src/beam_block.erl b/lib/compiler/src/beam_block.erl
index cf5244e1ce..402fbe2e2e 100644
--- a/lib/compiler/src/beam_block.erl
+++ b/lib/compiler/src/beam_block.erl
@@ -123,15 +123,24 @@ is_last_bool([], _) -> false.
collect_block(Is) ->
collect_block(Is, []).
+collect_block([{allocate,N,R}|Is0], Acc) ->
+ {Inits,Is} = lists:splitwith(fun ({init,{y,_}}) -> true;
+ (_) -> false
+ end, Is0),
+ collect_block(Is, [{set,[],[],{alloc,R,{nozero,N,0,Inits}}}|Acc]);
collect_block([{allocate_zero,Ns,R},{test_heap,Nh,R}|Is], Acc) ->
- collect_block(Is, [{set,[],[],{alloc,R,{no_opt,Ns,Nh,[]}}}|Acc]);
+ collect_block(Is, [{set,[],[],{alloc,R,{zero,Ns,Nh,[]}}}|Acc]);
collect_block([I|Is]=Is0, Acc) ->
case collect(I) of
error -> {reverse(Acc),Is0};
Instr -> collect_block(Is, [Instr|Acc])
end.
+collect({allocate,N,R}) -> {set,[],[],{alloc,R,{nozero,N,0,[]}}};
collect({allocate_zero,N,R}) -> {set,[],[],{alloc,R,{zero,N,0,[]}}};
+collect({allocate_heap,Ns,Nh,R}) -> {set,[],[],{alloc,R,{nozero,Ns,Nh,[]}}};
+collect({allocate_heap_zero,Ns,Nh,R}) -> {set,[],[],{alloc,R,{zero,Ns,Nh,[]}}};
+collect({init,D}) -> {set,[D],[],init};
collect({test_heap,N,R}) -> {set,[],[],{alloc,R,{nozero,nostack,N,[]}}};
collect({bif,N,F,As,D}) -> {set,[D],As,{bif,N,F}};
collect({gc_bif,N,F,R,As,D}) -> {set,[D],As,{alloc,R,{gc_bif,N,F}}};
@@ -144,6 +153,10 @@ collect({set_tuple_element,S,D,I}) -> {set,[],[S,D],{set_tuple_element,I}};
collect({get_list,S,D1,D2}) -> {set,[D1,D2],[S],get_list};
collect(remove_message) -> {set,[],[],remove_message};
collect({'catch',R,L}) -> {set,[R],[],{'catch',L}};
+collect(fclearerror) -> {set,[],[],fclearerror};
+collect({fcheckerror,{f,0}}) -> {set,[],[],fcheckerror};
+collect({fmove,S,D}) -> {set,[D],[S],fmove};
+collect({fconv,S,D}) -> {set,[D],[S],fconv};
collect(_) -> error.
%% embed_lines([Instruction]) -> [Instruction]
diff --git a/lib/compiler/src/beam_except.erl b/lib/compiler/src/beam_except.erl
index e5ec1bd904..d261809765 100644
--- a/lib/compiler/src/beam_except.erl
+++ b/lib/compiler/src/beam_except.erl
@@ -131,9 +131,13 @@ translate_exception(_, _, _, _) -> no.
fix_block(Is, 0) ->
reverse(Is);
-fix_block(Is0, Words) ->
- [{set,[],[],{alloc,Live,{F1,F2,Needed,F3}}}|Is] = reverse(Is0),
- [{set,[],[],{alloc,Live,{F1,F2,Needed-Words,F3}}}|Is].
+fix_block(Is, Words) ->
+ fix_block_1(reverse(Is), Words).
+
+fix_block_1([{set,[],[],{alloc,Live,{F1,F2,Needed,F3}}}|Is], Words) ->
+ [{set,[],[],{alloc,Live,{F1,F2,Needed-Words,F3}}}|Is];
+fix_block_1([I|Is], Words) ->
+ [I|fix_block_1(Is, Words)].
dig_out_block_fc([{set,[],[],{alloc,Live,_}}|Bl]) ->
case dig_out_fc(Bl, Live-1, nil) of
diff --git a/lib/compiler/src/beam_flatten.erl b/lib/compiler/src/beam_flatten.erl
index 25428c0c10..5603a677e8 100644
--- a/lib/compiler/src/beam_flatten.erl
+++ b/lib/compiler/src/beam_flatten.erl
@@ -51,6 +51,7 @@ norm_block([], Acc) -> Acc.
norm({set,[D],As,{bif,N,F}}) -> {bif,N,F,As,D};
norm({set,[D],As,{alloc,R,{gc_bif,N,F}}}) -> {gc_bif,N,F,R,As,D};
+norm({set,[D],[],init}) -> {init,D};
norm({set,[D],[S],move}) -> {move,S,D};
norm({set,[D],[S],fmove}) -> {fmove,S,D};
norm({set,[D],[S],fconv}) -> {fconv,S,D};
diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl
index b29a3565e4..d57fb80ac2 100644
--- a/lib/compiler/src/beam_jump.erl
+++ b/lib/compiler/src/beam_jump.erl
@@ -202,19 +202,19 @@ is_label(_) -> false.
move(Is) ->
move_1(Is, [], []).
-move_1([I|Is], End0, Acc0) ->
+move_1([I|Is], Ends, Acc0) ->
case is_exit_instruction(I) of
false ->
- move_1(Is, End0, [I|Acc0]);
+ move_1(Is, Ends, [I|Acc0]);
true ->
- case extract_seq(Acc0, [I|End0]) of
+ case extract_seq(Acc0, [I]) of
no ->
- move_1(Is, End0, [I|Acc0]);
+ move_1(Is, Ends, [I|Acc0]);
{yes,End,Acc} ->
- move_1(Is, End, Acc)
+ move_1(Is, [End|Ends], Acc)
end
end;
-move_1([], End, Acc) -> reverse(Acc, End).
+move_1([], Ends, Acc) -> reverse(Acc, lists:append(reverse(Ends))).
extract_seq([{line,_}=Line|Is], Acc) ->
extract_seq(Is, [Line|Acc]);
diff --git a/lib/compiler/src/beam_type.erl b/lib/compiler/src/beam_type.erl
index 3ec57a67da..58c0f765ae 100644
--- a/lib/compiler/src/beam_type.erl
+++ b/lib/compiler/src/beam_type.erl
@@ -142,6 +142,12 @@ simplify_float(Is0, Ts0) ->
throw:not_possible -> not_possible
end.
+simplify_float_1([{set,[],[],fclearerror}|Is], Ts, Rs, Acc) ->
+ simplify_float_1(Is, Ts, Rs, clearerror(Acc));
+simplify_float_1([{set,[],[],fcheckerror}|Is], Ts, Rs, Acc) ->
+ simplify_float_1(Is, Ts, Rs, checkerror(Acc));
+simplify_float_1([{set,[{fr,_}],_,_}=I|Is], Ts, Rs, Acc) ->
+ simplify_float_1(Is, Ts, Rs, [I|Acc]);
simplify_float_1([{set,[D0],[A0],{alloc,_,{gc_bif,'-',{f,0}}}}=I|Is]=Is0,
Ts0, Rs0, Acc0) ->
case tdb_find(A0, Ts0) of
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl
index e9911fefd9..36f3200d11 100644
--- a/lib/compiler/src/beam_utils.erl
+++ b/lib/compiler/src/beam_utils.erl
@@ -759,6 +759,12 @@ live_opt([{allocate,_,Live}=I|Is], _, D, Acc) ->
live_opt(Is, live_call(Live), D, [I|Acc]);
live_opt([{allocate_heap,_,_,Live}=I|Is], _, D, Acc) ->
live_opt(Is, live_call(Live), D, [I|Acc]);
+live_opt([{'%',_}=I|Is], Regs, D, Acc) ->
+ live_opt(Is, Regs, D, [I|Acc]);
+live_opt([{recv_set,_}=I|Is], Regs, D, Acc) ->
+ live_opt(Is, Regs, D, [I|Acc]);
+live_opt([{recv_mark,_}=I|Is], Regs, D, Acc) ->
+ live_opt(Is, Regs, D, [I|Acc]);
live_opt([], _, _, Acc) -> Acc.
diff --git a/lib/compiler/src/compile.erl b/lib/compiler/src/compile.erl
index 47d446273b..3db7ffc4d2 100644
--- a/lib/compiler/src/compile.erl
+++ b/lib/compiler/src/compile.erl
@@ -417,6 +417,10 @@ pass(from_core) ->
pass(from_asm) ->
{".S",[?pass(beam_consult_asm)|asm_passes()]};
pass(asm) ->
+ %% TODO: remove 'asm' in R18
+ io:format("compile:file/2 option 'asm' has been deprecated and will be "
+ "removed in R18.~n"
+ "Use 'from_asm' instead.~n"),
pass(from_asm);
pass(from_beam) ->
{".beam",[?pass(read_beam_file)|binary_passes()]};
@@ -608,7 +612,7 @@ core_passes() ->
?pass(core_fold_module),
{core_inline_module,fun test_core_inliner/1,fun core_inline_module/1},
{iff,dinline,{listing,"inline"}},
- {core_fold_after_inline,fun test_core_inliner/1,fun core_fold_module/1},
+ {core_fold_after_inlining,fun test_core_inliner/1,fun core_fold_module_after_inlining/1},
?pass(core_transforms)]},
{iff,dcopt,{listing,"copt"}},
{iff,'to_core',{done,"core"}}]}
@@ -1130,6 +1134,12 @@ core_fold_module(#compile{code=Code0,options=Opts,warnings=Warns}=St) ->
{ok,Code,Ws} = sys_core_fold:module(Code0, Opts),
{ok,St#compile{code=Code,warnings=Warns ++ Ws}}.
+core_fold_module_after_inlining(#compile{code=Code0,options=Opts}=St) ->
+ %% Inlining may produce code that generates spurious warnings.
+ %% Ignore all warnings.
+ {ok,Code,_Ws} = sys_core_fold:module(Code0, Opts),
+ {ok,St#compile{code=Code}}.
+
test_old_inliner(#compile{options=Opts}) ->
%% The point of this test is to avoid loading the old inliner
%% if we know that it will not be used.
@@ -1613,7 +1623,7 @@ compile_beam(File0, _OutFile, Opts) ->
compile_asm(File0, _OutFile, Opts) ->
File = shorten_filename(File0),
- case file(File, [asm|make_erl_options(Opts)]) of
+ case file(File, [from_asm|make_erl_options(Opts)]) of
{ok,_Mod} -> ok;
Other -> Other
end.
diff --git a/lib/compiler/src/sys_core_fold.erl b/lib/compiler/src/sys_core_fold.erl
index 6b0ae87172..a388960312 100644
--- a/lib/compiler/src/sys_core_fold.erl
+++ b/lib/compiler/src/sys_core_fold.erl
@@ -70,7 +70,7 @@
-export([module/2,format_error/1]).
-import(lists, [map/2,foldl/3,foldr/3,mapfoldl/3,all/2,any/2,
- reverse/1,reverse/2,member/2,nth/2,flatten/1]).
+ reverse/1,reverse/2,member/2,nth/2,flatten/1,unzip/1]).
-import(cerl, [ann_c_cons/3,ann_c_tuple/2]).
@@ -302,18 +302,49 @@ expr(#c_letrec{defs=Fs0,body=B0}=Letrec, Ctxt, Sub) ->
B1 = body(B0, value, Sub),
Letrec#c_letrec{defs=Fs1,body=B1};
expr(#c_case{}=Case0, Ctxt, Sub) ->
+ %% Ideally, the compiler should only emit warnings when there is
+ %% a real mistake in the code being compiled. We use the follow
+ %% heuristics in an attempt to approach that ideal:
+ %%
+ %% * If the guard for a clause always fails, we will emit a
+ %% warning.
+ %%
+ %% * If a case expression is a literal, we will emit no warnings
+ %% for clauses that will not match or for clauses that are
+ %% shadowed after a clause that will always match. That means
+ %% that code such as:
+ %%
+ %% case ?DEBUG of
+ %% false -> ok;
+ %% true -> ...
+ %% end
+ %%
+ %% (where ?DEBUG expands to either 'true' or 'false') will not
+ %% produce any warnings.
+ %%
+ %% * If the case expression is not literal, warnings will be
+ %% emitted for every clause that don't match and for all
+ %% clauses following a clause that will always match.
+ %%
+ %% * If no clause will ever match, there will be a warning
+ %% (in addition to any warnings that may have been emitted
+ %% according to the rules above).
+ %%
case opt_bool_case(Case0) of
#c_case{arg=Arg0,clauses=Cs0}=Case1 ->
Arg1 = body(Arg0, value, Sub),
- {Arg2,Cs1} = case_opt(Arg1, Cs0),
- Cs2 = clauses(Arg2, Cs1, Case1, Ctxt, Sub),
- Case = eval_case(Case1#c_case{arg=Arg2,clauses=Cs2}, Sub),
- bsm_an(Case);
+ LitExpr = cerl:is_literal(Arg1),
+ {Arg2,Cs1} = case_opt(Arg1, Cs0, Sub),
+ Cs2 = clauses(Arg2, Cs1, Ctxt, Sub, LitExpr),
+ Case = Case1#c_case{arg=Arg2,clauses=Cs2},
+ warn_no_clause_match(Case1, Case),
+ Expr = eval_case(Case, Sub),
+ bsm_an(Expr);
Other ->
expr(Other, Ctxt, Sub)
end;
expr(#c_receive{clauses=Cs0,timeout=T0,action=A0}=Recv, Ctxt, Sub) ->
- Cs1 = clauses(#c_var{name='_'}, Cs0, Recv, Ctxt, Sub), %This is all we know
+ Cs1 = clauses(#c_var{name='_'}, Cs0, Ctxt, Sub, false),
T1 = expr(T0, value, Sub),
A1 = body(A0, Ctxt, Sub),
Recv#c_receive{clauses=Cs1,timeout=T1,action=A1};
@@ -1452,14 +1483,14 @@ let_subst_list([], [], _) -> {[],[],[]}.
%%pattern(Pat, Sub) -> pattern(Pat, Sub, Sub).
-pattern(#c_var{name=V0}=Pat, Isub, Osub) ->
+pattern(#c_var{}=Pat, Isub, Osub) ->
case sub_is_val(Pat, Isub) of
true ->
V1 = make_var_name(),
Pat1 = #c_var{name=V1},
{Pat1,sub_set_var(Pat, Pat1, scope_add([V1], Osub))};
false ->
- {Pat,sub_del_var(Pat, scope_add([V0], Osub))}
+ {Pat,sub_del_var(Pat, Osub)}
end;
pattern(#c_literal{}=Pat, _, Osub) -> {Pat,Osub};
pattern(#c_cons{anno=Anno,hd=H0,tl=T0}, Isub, Osub0) ->
@@ -1522,6 +1553,9 @@ is_subst(_) -> false.
%% chains so we never have to search more than once. Use orddict so
%% we know the format.
%%
+%% In addition to the list of substitutions, we also keep track of
+%% all variable currently live (the scope).
+%%
%% sub_subst_scope/1 adds dummy substitutions for all variables
%% in the scope in order to force renaming if variables in the
%% scope occurs as pattern variables.
@@ -1548,8 +1582,17 @@ sub_set_name(V, Val, #sub{v=S,s=Scope,t=Tdb0}=Sub) ->
Tdb = copy_type(V, Val, Tdb1),
Sub#sub{v=orddict:store(V, Val, S),s=gb_sets:add(V, Scope),t=Tdb}.
-sub_del_var(#c_var{name=V}, #sub{v=S,t=Tdb}=Sub) ->
- Sub#sub{v=orddict:erase(V, S),t=kill_types(V, Tdb)}.
+sub_del_var(#c_var{name=V}, #sub{v=S,s=Scope,t=Tdb}=Sub) ->
+ %% Profiling shows that for programs with many record operations,
+ %% sub_del_var/2 is a bottleneck. Since the scope contains all
+ %% variables that are live, we know that V cannot be present in S
+ %% if it is not in the scope.
+ case gb_sets:is_member(V, Scope) of
+ false ->
+ Sub#sub{s=gb_sets:insert(V, Scope)};
+ true ->
+ Sub#sub{v=orddict:erase(V, S),t=kill_types(V, Tdb)}
+ end.
sub_subst_var(#c_var{name=V}, Val, #sub{v=S0}) ->
%% Fold chained substitutions.
@@ -1559,47 +1602,50 @@ sub_subst_scope(#sub{v=S0,s=Scope}=Sub) ->
S = [{-1,#c_var{name=Sv}} || Sv <- gb_sets:to_list(Scope)]++S0,
Sub#sub{v=S}.
-sub_is_val(#c_var{name=V}, #sub{v=S}) ->
- v_is_value(V, S).
-
-v_is_value(Var, Sub) ->
- any(fun ({_,#c_var{name=Val}}) when Val =:= Var -> true;
- (_) -> false
- end, Sub).
-
-%% clauses(E, [Clause], TopLevel, Context, Sub) -> [Clause].
-%% Trim the clauses by removing all clauses AFTER the first one which
-%% is guaranteed to match. Also remove all trivially false clauses.
-
-clauses(E, Cs0, TopLevel, Ctxt, Sub) ->
- Cs = clauses_1(E, Cs0, Ctxt, Sub),
-
- %% Here we want to warn if no clauses whatsoever will ever
- %% match, because that is probably a mistake.
- case all(fun is_compiler_generated/1, Cs) andalso
- any(fun(C) -> not is_compiler_generated(C) end, Cs0) of
+sub_is_val(#c_var{name=V}, #sub{v=S,s=Scope}) ->
+ %% When the bottleneck in sub_del_var/2 was eliminated, this
+ %% became the new bottleneck. Since the scope contains all
+ %% live variables, a variable V can only be the target for
+ %% a substitution if it is in the scope.
+ gb_sets:is_member(V, Scope) andalso v_is_value(V, S).
+
+v_is_value(Var, [{_,#c_var{name=Var}}|_]) -> true;
+v_is_value(Var, [_|T]) -> v_is_value(Var, T);
+v_is_value(_, []) -> false.
+
+%% warn_no_clause_match(CaseOrig, CaseOpt) -> ok
+%% Generate a warning if none of the user-specified clauses
+%% will match.
+
+warn_no_clause_match(CaseOrig, CaseOpt) ->
+ OrigCs = cerl:case_clauses(CaseOrig),
+ OptCs = cerl:case_clauses(CaseOpt),
+ case any(fun(C) -> not is_compiler_generated(C) end, OrigCs) andalso
+ all(fun is_compiler_generated/1, OptCs) of
true ->
%% The original list of clauses did contain at least one
%% user-specified clause, but none of them will match.
%% That is probably a mistake.
- add_warning(TopLevel, no_clause_match);
+ add_warning(CaseOrig, no_clause_match);
false ->
%% Either there were user-specified clauses left in
%% the transformed clauses, or else none of the original
%% clauses were user-specified to begin with (as in 'andalso').
ok
- end,
+ end.
- Cs.
+%% clauses(E, [Clause], TopLevel, Context, Sub) -> [Clause].
+%% Trim the clauses by removing all clauses AFTER the first one which
+%% is guaranteed to match. Also remove all trivially false clauses.
-clauses_1(E, [C0|Cs], Ctxt, Sub) ->
+clauses(E, [C0|Cs], Ctxt, Sub, LitExpr) ->
#c_clause{pats=Ps,guard=G} = C1 = clause(C0, E, Ctxt, Sub),
%%ok = io:fwrite("~w: ~p~n", [?LINE,{E,Ps}]),
case {will_match(E, Ps),will_succeed(G)} of
{yes,yes} ->
- Line = get_line(core_lib:get_anno(C1)),
- case core_lib:is_literal(E) of
+ case LitExpr of
false ->
+ Line = get_line(core_lib:get_anno(C1)),
shadow_warning(Cs, Line);
true ->
%% If the case expression is a literal,
@@ -1608,15 +1654,13 @@ clauses_1(E, [C0|Cs], Ctxt, Sub) ->
ok
end,
[C1]; %Skip the rest
- {no,_Suc} ->
- clauses_1(E, Cs, Ctxt, Sub); %Skip this clause
- {_Mat,no} ->
+ {_Mat,no} -> %Guard fails.
add_warning(C1, nomatch_guard),
- clauses_1(E, Cs, Ctxt, Sub); %Skip this clause
+ clauses(E, Cs, Ctxt, Sub, LitExpr); %Skip this clause
{_Mat,_Suc} ->
- [C1|clauses_1(E, Cs, Ctxt, Sub)]
+ [C1|clauses(E, Cs, Ctxt, Sub, LitExpr)]
end;
-clauses_1(_, [], _, _) -> [].
+clauses(_, [], _, _, _) -> [].
shadow_warning([C|Cs], none) ->
add_warning(C, nomatch_shadow),
@@ -1634,69 +1678,18 @@ will_succeed(#c_literal{val=true}) -> yes;
will_succeed(#c_literal{val=false}) -> no;
will_succeed(_Guard) -> maybe.
-%% will_match(Expr, [Pattern]) -> yes | maybe | no.
-%% Test if we know whether a match will succeed/fail or just don't
-%% know. Be conservative.
+%% will_match(Expr, [Pattern]) -> yes | maybe.
+%% We KNOW that this function is only used after optimizations
+%% in case_opt/4. Therefore clauses that can definitely not match
+%% have already been pruned.
will_match(#c_values{es=Es}, Ps) ->
- will_match_list(Es, Ps, yes);
+ will_match_1(cerl_clauses:match_list(Ps, Es));
will_match(E, [P]) ->
- will_match_1(E, P).
-
-will_match_1(_E, #c_var{}) -> yes; %Will always match
-will_match_1(E, #c_alias{pat=P}) -> %Pattern decides
- will_match_1(E, P);
-will_match_1(#c_var{}, _P) -> maybe;
-will_match_1(#c_tuple{es=Es}, #c_tuple{es=Ps}) ->
- will_match_list(Es, Ps, yes);
-will_match_1(#c_literal{val=Lit}, P) ->
- will_match_lit(Lit, P);
-will_match_1(_, _) -> maybe.
-
-will_match_list([E|Es], [P|Ps], M) ->
- case will_match_1(E, P) of
- yes -> will_match_list(Es, Ps, M);
- maybe -> will_match_list(Es, Ps, maybe);
- no -> no
- end;
-will_match_list([], [], M) -> M.
-
-will_match_lit(Cons, #c_cons{hd=Hp,tl=Tp}) ->
- case Cons of
- [H|T] ->
- case will_match_lit(H, Hp) of
- yes -> will_match_lit(T, Tp);
- Other -> Other
- end;
- _ ->
- no
- end;
-will_match_lit(Tuple, #c_tuple{es=Es}) ->
- case is_tuple(Tuple) andalso tuple_size(Tuple) =:= length(Es) of
- true -> will_match_lit_list(tuple_to_list(Tuple), Es);
- false -> no
- end;
-will_match_lit(Bin, #c_binary{}) ->
- case is_bitstring(Bin) of
- true -> maybe;
- false -> no
- end;
-will_match_lit(_, #c_var{}) ->
- yes;
-will_match_lit(Lit, #c_alias{pat=P}) ->
- will_match_lit(Lit, P);
-will_match_lit(Lit1, #c_literal{val=Lit2}) ->
- case Lit1 =:= Lit2 of
- true -> yes;
- false -> no
- end.
+ will_match_1(cerl_clauses:match(P, E)).
-will_match_lit_list([H|T], [P|Ps]) ->
- case will_match_lit(H, P) of
- yes -> will_match_lit_list(T, Ps);
- Other -> Other
- end;
-will_match_lit_list([], []) -> yes.
+will_match_1({false,_}) -> maybe;
+will_match_1({true,_}) -> yes.
%% opt_bool_case(CoreExpr) - CoreExpr'.
%% Do various optimizations to case statement that has a
@@ -1895,166 +1888,243 @@ opt_bool_case_guard(Arg, [#c_clause{pats=[#c_literal{val=false}]}=Fc,Tc]) ->
%% last clause is guaranteed to match so if there is only one clause
%% with a pattern containing only variables then rewrite to a let.
-eval_case(#c_case{arg=#c_var{name=V},
- clauses=[#c_clause{pats=[P],guard=G,body=B}|_]}=Case,
- #sub{t=Tdb}=Sub) ->
- case orddict:find(V, Tdb) of
- {ok,Type} ->
- case {will_match_type(P, Type),will_succeed(G)} of
- {yes,yes} ->
- {Ps,Es} = remove_non_vars(P, Type),
- expr(#c_let{vars=Ps,arg=#c_values{es=Es},body=B},
- sub_new(Sub));
- {_,_} ->
- eval_case_1(Case, Sub)
- end;
- error -> eval_case_1(Case, Sub)
- end;
-eval_case(Case, Sub) -> eval_case_1(Case, Sub).
-
-eval_case_1(#c_case{arg=E,clauses=[#c_clause{pats=Ps,body=B}]}=Case, Sub) ->
- case is_var_pat(Ps) of
- true -> expr(#c_let{vars=Ps,arg=E,body=B}, sub_new(Sub));
- false -> eval_case_2(E, Ps, B, Case)
- end;
-eval_case_1(Case, _) -> Case.
-
-eval_case_2(E, [P], B, Case) ->
- %% Recall that there is only one clause and that it is guaranteed to match.
- %% If E and P are literals, they must be the same literal and the body
- %% can be used directly as there are no variables that need to be bound.
- %% Otherwise, P could be an alias meaning that two or more variables
- %% would be bound to E. We don't bother to optimize that case as it
- %% is rather uncommon.
- case core_lib:is_literal(E) andalso core_lib:is_literal(P) of
- false -> Case;
- true -> B
- end;
-eval_case_2(_, _, _, Case) -> Case.
-
-is_var_pat(Ps) ->
- all(fun (#c_var{}) -> true;
- (_Pat) -> false
- end, Ps).
-
-will_match_type(#c_tuple{es=Es}, #c_tuple{es=Ps}) ->
- will_match_list_type(Es, Ps);
-will_match_type(#c_literal{val=Atom}, #c_literal{val=Atom}) -> yes;
-will_match_type(#c_var{}, #c_var{}) -> yes;
-will_match_type(#c_var{}, #c_alias{}) -> yes;
-will_match_type(_, _) -> no.
-
-will_match_list_type([E|Es], [P|Ps]) ->
- case will_match_type(E, P) of
- yes -> will_match_list_type(Es, Ps);
- no -> no
- end;
-will_match_list_type([], []) -> yes;
-will_match_list_type(_, _) -> no. %Different length
-
-remove_non_vars(Ps0, Es0) ->
- {Ps,Es} = remove_non_vars(Ps0, Es0, [], []),
- {reverse(Ps),reverse(Es)}.
-
-remove_non_vars(#c_tuple{es=Ps}, #c_tuple{es=Es}, Pacc, Eacc) ->
- remove_non_vars_list(Ps, Es, Pacc, Eacc);
-remove_non_vars(#c_var{}=Var, #c_alias{var=Evar}, Pacc, Eacc) ->
- {[Var|Pacc],[Evar|Eacc]};
-remove_non_vars(#c_var{}=Var, #c_var{}=Evar, Pacc, Eacc) ->
- {[Var|Pacc],[Evar|Eacc]};
-remove_non_vars(P, E, Pacc, Eacc) ->
- true = core_lib:is_literal(P) andalso core_lib:is_literal(E), %Assertion.
- {Pacc,Eacc}.
-
-remove_non_vars_list([P|Ps], [E|Es], Pacc0, Eacc0) ->
- {Pacc,Eacc} = remove_non_vars(P, E, Pacc0, Eacc0),
- remove_non_vars_list(Ps, Es, Pacc, Eacc);
-remove_non_vars_list([], [], Pacc, Eacc) ->
- {Pacc,Eacc}.
+eval_case(#c_case{arg=E,clauses=[#c_clause{pats=Ps0,body=B}]}, Sub) ->
+ Es = case cerl:is_c_values(E) of
+ true -> cerl:values_es(E);
+ false -> [E]
+ end,
+ {true,Bs} = cerl_clauses:match_list(Ps0, Es),
+ {Ps,As} = unzip(Bs),
+ expr(#c_let{vars=Ps,arg=core_lib:make_values(As),body=B}, sub_new(Sub));
+eval_case(Case, _) -> Case.
%% case_opt(CaseArg, [Clause]) -> {CaseArg,[Clause]}.
-%% Try and optimise case by avoid building a tuple in
-%% the case expression. Instead of building a tuple
-%% in the case expression, combine the elements into
-%% multiple "values". If a clause refers to the tuple
-%% in the case expression (that was not built), introduce
-%% a let into the guard and/or body to build the tuple.
+%% Try and optimise a case by avoid building tuples or lists
+%% in the case expression. Instead combine the variable parts
+%% of the case expression to multiple "values". If a clause
+%% refers to the constructed term in the case expression (which
+%% was not built), introduce a let into the guard and/or body to
+%% build the term.
%%
-%% case {Expr1,Expr2} of case <Expr1,Expr2> of
-%% {P1,P2} -> ... <P1,P2> -> ...
+%% case {ok,[Expr1,Expr2]} of case <Expr1,Expr2> of
+%% {ok,[P1,P2]} -> ... <P1,P2> -> ...
%% . ==> .
%% . .
%% . .
-%% Var -> <Var1,Var2> ->
-%% ... Var ... let <Var> = {Var1,Var2}
-%% in ... Var ...
+%% Var -> <Var1,Var2> ->
+%% ... Var ... let <Var> = {ok,[Var1,Var2]}
+%% in ... Var ...
%% . .
%% . .
%% . .
-%% end. end.
+%% end. end.
%%
-case_opt(#c_tuple{anno=A,es=Es}, Cs0) ->
- Cs1 = case_opt_cs(Cs0, length(Es)),
- {core_lib:set_anno(core_lib:make_values(Es), A),Cs1};
-case_opt(Arg, Cs) -> {Arg,Cs}.
-
-case_opt_cs([#c_clause{pats=Ps0,guard=G,body=B}=C|Cs], Arity) ->
- case case_tuple_pat(Ps0, Arity) of
- {ok,Ps1,Avs} ->
- Flet = fun ({V,Pat}, Body) -> letify(V, Pat, Body) end,
- [C#c_clause{pats=Ps1,
- guard=foldl(Flet, G, Avs),
- body=foldl(Flet, B, Avs)}|case_opt_cs(Cs, Arity)];
- error -> %Can't match
- add_warning(C, nomatch_clause_type),
- case_opt_cs(Cs, Arity)
+case_opt(Arg, Cs0, Sub) ->
+ Cs1 = [{cerl:clause_pats(C),C,[],[]} || C <- Cs0],
+ Args0 = case cerl:is_c_values(Arg) of
+ false -> [Arg];
+ true -> cerl:values_es(Arg)
+ end,
+ LitExpr = cerl:is_literal(Arg),
+ {Args,Cs2} = case_opt_args(Args0, Cs1, Sub, LitExpr, []),
+ Cs = [cerl:update_c_clause(C,
+ reverse(Ps),
+ letify(Bs, cerl:clause_guard(C)),
+ letify(Bs, cerl:clause_body(C))) ||
+ {[],C,Ps,Bs} <- Cs2],
+ {core_lib:make_values(Args),Cs}.
+
+case_opt_args([A0|As0], Cs0, Sub, LitExpr, Acc) ->
+ case case_opt_arg(A0, Sub, Cs0, LitExpr) of
+ error ->
+ %% Nothing to be done. Move on to the next argument.
+ Cs = [{Ps,C,[P|PsAcc],Bs} || {[P|Ps],C,PsAcc,Bs} <- Cs0],
+ case_opt_args(As0, Cs, Sub, LitExpr, [A0|Acc]);
+ {ok,As1,Cs} ->
+ %% The argument was either expanded (from tuple/list) or
+ %% removed (literal).
+ case_opt_args(As1++As0, Cs, Sub, LitExpr, Acc)
+ end;
+case_opt_args([], Cs, _Sub, _LitExpr, Acc) ->
+ {reverse(Acc),Cs}.
+
+%% case_opt_arg(Expr, Sub, Clauses0, LitExpr) ->
+%% {ok,Args,Clauses} | error
+%% Try to expand one argument to several arguments (if tuple/list)
+%% or to remove a literal argument.
+%%
+case_opt_arg(E0, Sub, Cs, LitExpr) ->
+ E = maybe_replace_var(E0, Sub),
+ case cerl:is_data(E) of
+ false ->
+ error;
+ true ->
+ case cerl:data_type(E) of
+ {atomic,_} ->
+ case_opt_lit(E, Cs, LitExpr);
+ _ ->
+ case_opt_data(E, Cs, LitExpr)
+ end
+ end.
+
+%% maybe_replace_var(Expr0, Sub) -> Expr
+%% If Expr0 is a variable that has been previously matched and
+%% is known to be a tuple, return the tuple instead. Otherwise
+%% return Expr0 unchanged.
+%%
+maybe_replace_var(E, Sub) ->
+ case cerl:is_c_var(E) of
+ false -> E;
+ true -> maybe_replace_var_1(E, Sub)
+ end.
+
+maybe_replace_var_1(E, #sub{t=Tdb}) ->
+ case orddict:find(cerl:var_name(E), Tdb) of
+ {ok,T0} ->
+ case cerl:is_c_tuple(T0) of
+ false ->
+ E;
+ true ->
+ cerl_trees:map(fun(C) ->
+ case cerl:is_c_alias(C) of
+ false -> C;
+ true -> cerl:alias_pat(C)
+ end
+ end, T0)
+ end;
+ error ->
+ E
+ end.
+
+%% case_opt_lit(Literal, Clauses0, LitExpr) ->
+%% {ok,[],Clauses} | error
+%% The current part of the case expression is a literal. That
+%% means that we will know at compile-time whether a clause
+%% will match, and we can remove the corresponding pattern from
+%% each clause.
+%%
+%% The only complication is if the literal is a binary. Binary
+%% pattern matching is tricky, so we will give up in that case.
+
+case_opt_lit(Lit, Cs0, LitExpr) ->
+ try case_opt_lit_1(Cs0, Lit, LitExpr) of
+ Cs ->
+ {ok,[],Cs}
+ catch
+ throw:impossible ->
+ error
+ end.
+
+case_opt_lit_1([{[P|Ps],C,PsAcc,Bs0}|Cs], E, LitExpr) ->
+ case cerl_clauses:match(P, E) of
+ none ->
+ %% The pattern will not match the literal. Remove the clause.
+ %% Unless the entire case expression is a literal, also
+ %% emit a warning.
+ case LitExpr of
+ false -> add_warning(C, nomatch_clause_type);
+ true -> ok
+ end,
+ case_opt_lit_1(Cs, E, LitExpr);
+ {true,Bs} ->
+ %% The pattern matches the literal. Remove the pattern
+ %% and update the bindings.
+ [{Ps,C,PsAcc,Bs++Bs0}|case_opt_lit_1(Cs, E, LitExpr)];
+ {false,_} ->
+ %% Binary literal and pattern. We are not sure whether
+ %% the pattern will match.
+ throw(impossible)
end;
-case_opt_cs([], _) -> [].
+case_opt_lit_1([], _, _) -> [].
-%% case_tuple_pat([Pattern], Arity) -> {ok,[Pattern],[{AliasVar,Pat}]} | error.
+%% case_opt_data(Expr, Clauses0, LitExpr) -> {ok,Exprs,Clauses}
+
+case_opt_data(E, Cs0, LitExpr) ->
+ Es = cerl:data_es(E),
+ Cs = case_opt_data_1(Cs0, Es,
+ {cerl:data_type(E),cerl:data_arity(E)},
+ LitExpr),
+ {ok,Es,Cs}.
+
+case_opt_data_1([{[P|Ps0],C,PsAcc,Bs0}|Cs], Es, TypeSig, LitExpr) ->
+ case case_data_pat(P, TypeSig) of
+ {ok,Ps1,Bs1} ->
+ [{Ps1++Ps0,C,PsAcc,Bs1++Bs0}|
+ case_opt_data_1(Cs, Es, TypeSig,LitExpr)];
+ error ->
+ case LitExpr of
+ false -> add_warning(C, nomatch_clause_type);
+ true -> ok
+ end,
+ case_opt_data_1(Cs, Es, TypeSig, LitExpr)
+ end;
+case_opt_data_1([], _, _, _) -> [].
-case_tuple_pat([#c_tuple{es=Ps}], Arity) when length(Ps) =:= Arity ->
- {ok,Ps,[]};
-case_tuple_pat([#c_literal{val=T}], Arity) when tuple_size(T) =:= Arity ->
- Ps = [#c_literal{val=E} || E <- tuple_to_list(T)],
- {ok,Ps,[]};
-case_tuple_pat([#c_var{anno=Anno0}=V], Arity) ->
- Vars = make_vars(Anno0, 1, Arity),
+%% case_data_pat(Pattern, Type, Arity) -> {ok,[Pattern],[{AliasVar,Pat}]} | error.
+case_data_pat(P, TypeSig) ->
+ case cerl:is_data(P) of
+ false ->
+ case_data_pat_var(P, TypeSig);
+ true ->
+ case {cerl:data_type(P),cerl:data_arity(P)} of
+ TypeSig ->
+ {ok,cerl:data_es(P),[]};
+ {_,_} ->
+ error
+ end
+ end.
+
+%% case_data_pat_var(Pattern, {DataType,ArityType}) ->
+%% {ok,[Pattern],[{AliasVar,Pat}]}
+
+case_data_pat_var(P, {Type,Arity}=TypeSig) ->
%% If the entire case statement is evaluated in an effect
%% context (e.g. "case {A,B} of ... end, ok"), there will
%% be a warning that a term is constructed but never used.
- %% To avoid that warning, we must annotate the tuple as
- %% compiler generated.
-
- Anno = [compiler_generated|Anno0],
- {ok,Vars,[{V,#c_tuple{anno=Anno,es=Vars}}]};
-case_tuple_pat([#c_alias{var=V,pat=P}], Arity) ->
- case case_tuple_pat([P], Arity) of
- {ok,Ps,Avs} ->
- Anno0 = core_lib:get_anno(P),
- Anno = [compiler_generated|Anno0],
- {ok,Ps,[{V,#c_tuple{anno=Anno,es=unalias_pat_list(Ps)}}|Avs]};
- error ->
+ %% To avoid that warning, we must annotate the data
+ %% constructor as compiler generated.
+ Ann = [compiler_generated|cerl:get_ann(P)],
+ case cerl:type(P) of
+ var ->
+ Vars = make_vars(cerl:get_ann(P), Arity),
+ {ok,Vars,[{P,cerl:ann_make_data(Ann, Type, Vars)}]};
+ alias ->
+ V = cerl:alias_var(P),
+ Apat = cerl:alias_pat(P),
+ case case_data_pat(Apat, TypeSig) of
+ {ok,Ps,Bs} ->
+ {ok,Ps,[{V,cerl:ann_make_data(Ann, Type, unalias_pat_list(Ps))}|Bs]};
+ error ->
+ error
+ end;
+ _ ->
error
- end;
-case_tuple_pat(_, _) -> error.
+ end.
%% unalias_pat(Pattern) -> Pattern.
%% Remove all the aliases in a pattern but using the alias variables
%% instead of the values. We KNOW they will be bound.
-unalias_pat(#c_alias{var=V}) -> V;
-unalias_pat(#c_cons{anno=Anno,hd=H0,tl=T0}) ->
- H1 = unalias_pat(H0),
- T1 = unalias_pat(T0),
- ann_c_cons(Anno, H1, T1);
-unalias_pat(#c_tuple{anno=Anno,es=Ps}) ->
- ann_c_tuple(Anno, unalias_pat_list(Ps));
-unalias_pat(Atomic) -> Atomic.
+unalias_pat(P) ->
+ case cerl:is_c_alias(P) of
+ true ->
+ cerl:alias_var(P);
+ false ->
+ case cerl:is_data(P) of
+ false ->
+ P;
+ true ->
+ Es = unalias_pat_list(cerl:data_es(P)),
+ cerl:update_data(P, cerl:data_type(P), Es)
+ end
+ end.
unalias_pat_list(Ps) -> [unalias_pat(P) || P <- Ps].
+make_vars(A, Max) ->
+ make_vars(A, 1, Max).
+
make_vars(A, I, Max) when I =< Max ->
[make_var(A)|make_vars(A, I+1, Max)];
make_vars(_, _, _) -> [].
@@ -2067,6 +2137,11 @@ make_var_name() ->
put(new_var_num, N+1),
list_to_atom("fol"++integer_to_list(N)).
+letify(Bs, Body) ->
+ foldr(fun({V,Val}, B) ->
+ letify(V, Val, B)
+ end, Body, Bs).
+
letify(#c_var{name=Vname}=Var, Val, Body) ->
case core_lib:is_var_used(Vname, Body) of
true ->
@@ -2087,7 +2162,7 @@ opt_case_in_let_0([#c_var{name=V}], Arg,
case is_simple_case_arg(Arg) andalso
not core_lib:is_var_used(V, Case#c_case{arg=#c_literal{val=nil}}) of
true ->
- opt_bool_case(Case#c_case{arg=Arg});
+ expr(opt_bool_case(Case#c_case{arg=Arg,clauses=Cs}), sub_new());
false ->
Let
end;
diff --git a/lib/compiler/src/v3_codegen.erl b/lib/compiler/src/v3_codegen.erl
index 6a13495523..f534500671 100644
--- a/lib/compiler/src/v3_codegen.erl
+++ b/lib/compiler/src/v3_codegen.erl
@@ -1466,10 +1466,11 @@ set_cg([{var,R}], Con, Le, Vdb, Bef, St) ->
cg_binary([{bs_put_binary,Fail,{atom,all},U,_Flags,Src}|PutCode],
Target, Temp, Fail, MaxRegs, Anno) ->
+ Line = line(Anno),
Live = cg_live(Target, MaxRegs),
SzCode = cg_bitstr_size(PutCode, Target, Temp, Fail, Live),
BinFlags = {field_flags,[]},
- Code = SzCode ++
+ Code = [Line|SzCode] ++
[case member(single_use, Anno) of
true ->
{bs_private_append,Fail,Target,U,Src,BinFlags,Target};
diff --git a/lib/compiler/src/v3_core.erl b/lib/compiler/src/v3_core.erl
index 321cf7af1c..a5f31f3844 100644
--- a/lib/compiler/src/v3_core.erl
+++ b/lib/compiler/src/v3_core.erl
@@ -563,7 +563,8 @@ expr({'try',L,Es0,[],[],As0}, St0) ->
guard=[#c_literal{val=true}],
body=As1}],
fc=Fc},
- App = #iapply{anno=Lanno,op=#c_var{anno=LA,name={Name,0}},args=[]},
+ App = #iapply{anno=#a{anno=[compiler_generated|LA]},
+ op=#c_var{anno=LA,name={Name,0}},args=[]},
{Evs,Hs,St5} = try_after([App], St4),
Try = #itry{anno=Lanno,args=Es1,vars=[V],body=[App,V],evars=Evs,handler=Hs},
Letrec = #iletrec{anno=Lanno,defs=[{{Name,0},Fun}],
diff --git a/lib/compiler/test/andor_SUITE.erl b/lib/compiler/test/andor_SUITE.erl
index 4ffbe07e32..7bef0aa27c 100644
--- a/lib/compiler/test/andor_SUITE.erl
+++ b/lib/compiler/test/andor_SUITE.erl
@@ -194,6 +194,9 @@ t_andalso(Config) when is_list(Config) ->
?line false = id(false) andalso not id(glurf),
?line false = false andalso not id(glurf),
+ true = begin (X1 = true) andalso X1, X1 end,
+ false = false = begin (X2 = false) andalso X2, X2 end,
+
ok.
t_orelse(Config) when is_list(Config) ->
@@ -224,6 +227,9 @@ t_orelse(Config) when is_list(Config) ->
?line true = id(true) orelse not id(glurf),
?line true = true orelse not id(glurf),
+ true = begin (X1 = true) orelse X1, X1 end,
+ false = begin (X2 = false) orelse X2, X2 end,
+
ok.
t_andalso_1({X,Y}) ->
diff --git a/lib/compiler/test/beam_except_SUITE.erl b/lib/compiler/test/beam_except_SUITE.erl
index bf67eedd5f..d088863c5c 100644
--- a/lib/compiler/test/beam_except_SUITE.erl
+++ b/lib/compiler/test/beam_except_SUITE.erl
@@ -57,6 +57,11 @@ coverage(_) ->
{'EXIT',{undef,[{erlang,error,[a,b,c],_}|_]}} =
(catch erlang:error(a, b, c)),
+
+ {'EXIT',{badarith,[{?MODULE,bar,1,[File,{line,9}]}|_]}} =
+ (catch bar(x)),
+ {'EXIT',{{case_clause,{1}},[{?MODULE,bar,1,[File,{line,9}]}|_]}} =
+ (catch bar(0)),
ok.
-file("fake.erl", 1).
@@ -65,3 +70,8 @@ fc(a) -> %Line 2
fc(L) when length(L) > 2 -> %Line 4
%% Not the same as a "real" function_clause error.
error(function_clause, [L]). %Line 6
+%% Would crash the compiler.
+bar(X) -> %Line 8
+ case {X+1} of %Line 9
+ 1 -> ok %Line 10
+ end. %Line 11
diff --git a/lib/compiler/test/compilation_SUITE.erl b/lib/compiler/test/compilation_SUITE.erl
index d517029b1b..f7b1dbdddf 100644
--- a/lib/compiler/test/compilation_SUITE.erl
+++ b/lib/compiler/test/compilation_SUITE.erl
@@ -196,7 +196,7 @@ redundant_case_1(_) -> d.
failure(Module, Conf) ->
?line Src = filename:join(?config(data_dir, Conf), atom_to_list(Module)),
?line Out = ?config(priv_dir,Conf),
- ?line io:format("Compiling: ~s\n", [Src]),
+ ?line io:format("Compiling: ~ts\n", [Src]),
?line CompRc = compile:file(Src, [{outdir,Out},return,time]),
?line io:format("Result: ~p\n",[CompRc]),
?line case CompRc of
@@ -278,6 +278,16 @@ try_it(StartNode, Module, Conf) ->
?line ok = rpc:call(Node, ?MODULE, load_and_call, [Out, Module]),
?line test_server:timetrap_cancel(LastDog),
+ AsmDog = test_server:timetrap(test_server:minutes(10)),
+ io:format("Compiling (from assembly): ~s\n", [Src]),
+ {ok,_} = compile:file(Src, [to_asm,{outdir,Out},report|OtherOpts]),
+ Asm = filename:join(Out, lists:concat([Module, ".S"])),
+ CompRc3 = compile:file(Asm, [from_asm,{outdir,Out},report|OtherOpts]),
+ io:format("Result: ~p\n",[CompRc3]),
+ {ok,_} = CompRc3,
+ ok = rpc:call(Node, ?MODULE, load_and_call, [Out, Module]),
+ test_server:timetrap_cancel(AsmDog),
+
case StartNode of
false -> ok;
true -> ?line test_server:stop_node(Node)
@@ -466,8 +476,8 @@ self_compile_node(CompilerDir, OutDir, Version, Opts) ->
ok.
compile_compiler(Files, OutDir, Version, InlineOpts) ->
- io:format("~s", [code:which(compile)]),
- io:format("Compiling ~s into ~s", [Version,OutDir]),
+ io:format("~ts", [code:which(compile)]),
+ io:format("Compiling ~s into ~ts", [Version,OutDir]),
Opts = [report,
bin_opt_info,
{outdir,OutDir},
diff --git a/lib/compiler/test/compile_SUITE.erl b/lib/compiler/test/compile_SUITE.erl
index 66ce6c00ab..4ec75d015e 100644
--- a/lib/compiler/test/compile_SUITE.erl
+++ b/lib/compiler/test/compile_SUITE.erl
@@ -769,8 +769,8 @@ do_core({M,A}, Outdir) ->
error
end.
-%% Compile to Beam assembly language (.S) and the try to
-%% run .S throught the compiler again.
+%% Compile to Beam assembly language (.S) and then try to
+%% run .S through the compiler again.
asm(Config) when is_list(Config) ->
?line Dog = test_server:timetrap(test_server:minutes(20)),
@@ -794,7 +794,7 @@ do_asm(Beam, Outdir) ->
{ok,Fd} = file:open(AsmFile, [write,{encoding,utf8}]),
beam_listing:module(Fd, Asm),
ok = file:close(Fd),
- case compile:file(AsmFile, [from_asm,no_postopt,binary,report]) of
+ case compile:file(AsmFile, [from_asm,binary,report]) of
{ok,M,_} ->
ok = file:delete(AsmFile);
Other ->
diff --git a/lib/compiler/test/core_fold_SUITE.erl b/lib/compiler/test/core_fold_SUITE.erl
index a5a4e62a42..69f61a046f 100644
--- a/lib/compiler/test/core_fold_SUITE.erl
+++ b/lib/compiler/test/core_fold_SUITE.erl
@@ -249,6 +249,12 @@ coverage(Config) when is_list(Config) ->
case list_to_pid("<0.42.0>") of
Pid when is_pid(Pid) -> ok
end,
+
+ %% Cover the non-variable case in bsm_do_an/4.
+ ok = bsm_an_inlined(<<1>>, Config),
+ error = bsm_an_inlined(<<1,2,3>>, Config),
+ error = bsm_an_inlined([], Config),
+
ok.
cover_will_match_list_type(A) ->
@@ -290,6 +296,9 @@ cover_is_safe_bool_expr(X) ->
false
end.
+bsm_an_inlined(<<_:8>>, _) -> ok;
+bsm_an_inlined(_, _) -> error.
+
id(I) -> I.
unused_multiple_values_error(Config) when is_list(Config) ->
diff --git a/lib/compiler/test/warnings_SUITE.erl b/lib/compiler/test/warnings_SUITE.erl
index 810b2b48c9..7186956603 100644
--- a/lib/compiler/test/warnings_SUITE.erl
+++ b/lib/compiler/test/warnings_SUITE.erl
@@ -117,6 +117,7 @@ pattern2(Config) when is_list(Config) ->
Source,
[nowarn_unused_vars],
{warnings,[{2,sys_core_fold,{nomatch_shadow,1}},
+ {4,sys_core_fold,no_clause_match},
{5,sys_core_fold,nomatch_clause_type},
{6,sys_core_fold,nomatch_clause_type}]}}],
?line [] = run(Config, Ts),
diff --git a/lib/crypto/c_src/crypto.c b/lib/crypto/c_src/crypto.c
index 7567a08894..925ad0c091 100644
--- a/lib/crypto/c_src/crypto.c
+++ b/lib/crypto/c_src/crypto.c
@@ -384,100 +384,6 @@ static ErlNifFunc nif_funcs[] = {
{"ecdh_compute_key_nif", 3, ecdh_compute_key_nif}
};
-#if defined(HAVE_EC)
-struct nid_map {
- char *name;
- int nid;
- ERL_NIF_TERM atom;
-};
-
-static struct nid_map ec_curves[] = {
- /* prime field curves */
- /* secg curves */
- { "secp112r1", NID_secp112r1 },
- { "secp112r2", NID_secp112r2 },
- { "secp128r1", NID_secp128r1 },
- { "secp128r2", NID_secp128r2 },
- { "secp160k1", NID_secp160k1 },
- { "secp160r1", NID_secp160r1 },
- { "secp160r2", NID_secp160r2 },
- /* SECG secp192r1 is the same as X9.62 prime192v1 */
- { "secp192r1", NID_X9_62_prime192v1 },
- { "secp192k1", NID_secp192k1 },
- { "secp224k1", NID_secp224k1 },
- { "secp224r1", NID_secp224r1 },
- { "secp256k1", NID_secp256k1 },
- /* SECG secp256r1 is the same as X9.62 prime256v1 */
- { "secp256r1", NID_X9_62_prime256v1 },
- { "secp384r1", NID_secp384r1 },
- { "secp521r1", NID_secp521r1 },
- /* X9.62 curves */
- { "prime192v1", NID_X9_62_prime192v1 },
- { "prime192v2", NID_X9_62_prime192v2 },
- { "prime192v3", NID_X9_62_prime192v3 },
- { "prime239v1", NID_X9_62_prime239v1 },
- { "prime239v2", NID_X9_62_prime239v2 },
- { "prime239v3", NID_X9_62_prime239v3 },
- { "prime256v1", NID_X9_62_prime256v1 },
- /* characteristic two field curves */
- /* NIST/SECG curves */
- { "sect113r1", NID_sect113r1 },
- { "sect113r2", NID_sect113r2 },
- { "sect131r1", NID_sect131r1 },
- { "sect131r2", NID_sect131r2 },
- { "sect163k1", NID_sect163k1 },
- { "sect163r1", NID_sect163r1 },
- { "sect163r2", NID_sect163r2 },
- { "sect193r1", NID_sect193r1 },
- { "sect193r2", NID_sect193r2 },
- { "sect233k1", NID_sect233k1 },
- { "sect233r1", NID_sect233r1 },
- { "sect239k1", NID_sect239k1 },
- { "sect283k1", NID_sect283k1 },
- { "sect283r1", NID_sect283r1 },
- { "sect409k1", NID_sect409k1 },
- { "sect409r1", NID_sect409r1 },
- { "sect571k1", NID_sect571k1 },
- { "sect571r1", NID_sect571r1 },
- /* X9.62 curves */
- { "c2pnb163v1", NID_X9_62_c2pnb163v1 },
- { "c2pnb163v2", NID_X9_62_c2pnb163v2 },
- { "c2pnb163v3", NID_X9_62_c2pnb163v3 },
- { "c2pnb176v1", NID_X9_62_c2pnb176v1 },
- { "c2tnb191v1", NID_X9_62_c2tnb191v1 },
- { "c2tnb191v2", NID_X9_62_c2tnb191v2 },
- { "c2tnb191v3", NID_X9_62_c2tnb191v3 },
- { "c2pnb208w1", NID_X9_62_c2pnb208w1 },
- { "c2tnb239v1", NID_X9_62_c2tnb239v1 },
- { "c2tnb239v2", NID_X9_62_c2tnb239v2 },
- { "c2tnb239v3", NID_X9_62_c2tnb239v3 },
- { "c2pnb272w1", NID_X9_62_c2pnb272w1 },
- { "c2pnb304w1", NID_X9_62_c2pnb304w1 },
- { "c2tnb359v1", NID_X9_62_c2tnb359v1 },
- { "c2pnb368w1", NID_X9_62_c2pnb368w1 },
- { "c2tnb431r1", NID_X9_62_c2tnb431r1 },
- /* the WAP/WTLS curves
- * [unlike SECG, spec has its own OIDs for curves from X9.62] */
- { "wtls1", NID_wap_wsg_idm_ecid_wtls1 },
- { "wtls3", NID_wap_wsg_idm_ecid_wtls3 },
- { "wtls4", NID_wap_wsg_idm_ecid_wtls4 },
- { "wtls5", NID_wap_wsg_idm_ecid_wtls5 },
- { "wtls6", NID_wap_wsg_idm_ecid_wtls6 },
- { "wtls7", NID_wap_wsg_idm_ecid_wtls7 },
- { "wtls8", NID_wap_wsg_idm_ecid_wtls8 },
- { "wtls9", NID_wap_wsg_idm_ecid_wtls9 },
- { "wtls10", NID_wap_wsg_idm_ecid_wtls10 },
- { "wtls11", NID_wap_wsg_idm_ecid_wtls11 },
- { "wtls12", NID_wap_wsg_idm_ecid_wtls12 },
- /* IPSec curves */
- { "ipsec3", NID_ipsec3 },
- { "ipsec4", NID_ipsec4 }
-};
-
-#define EC_CURVES_CNT (sizeof(ec_curves)/sizeof(struct nid_map))
-
-#endif /* HAVE_EC */
-
ERL_NIF_INIT(crypto,nif_funcs,load,NULL,upgrade,unload)
@@ -632,12 +538,6 @@ static int init(ErlNifEnv* env, ERL_NIF_TERM load_info)
atom_tpbasis = enif_make_atom(env,"tpbasis");
atom_ppbasis = enif_make_atom(env,"ppbasis");
atom_onbasis = enif_make_atom(env,"onbasis");
-
- {
- int i;
- for (i = 0; i < EC_CURVES_CNT; i++)
- ec_curves[i].atom = enif_make_atom(env,ec_curves[i].name);
- }
#endif
init_digest_types(env);
@@ -725,7 +625,7 @@ static void unload(ErlNifEnv* env, void* priv_data)
static int algo_hash_cnt;
static ERL_NIF_TERM algo_hash[8]; /* increase when extending the list */
static int algo_pubkey_cnt;
-static ERL_NIF_TERM algo_pubkey[2]; /* increase when extending the list */
+static ERL_NIF_TERM algo_pubkey[3]; /* increase when extending the list */
static int algo_cipher_cnt;
static ERL_NIF_TERM algo_cipher[2]; /* increase when extending the list */
@@ -751,6 +651,9 @@ static void init_algorithms_types(ErlNifEnv* env)
algo_pubkey_cnt = 0;
#if defined(HAVE_EC)
+#if !defined(OPENSSL_NO_EC2M)
+ algo_pubkey[algo_pubkey_cnt++] = enif_make_atom(env,"ec_gf2m");
+#endif
algo_pubkey[algo_pubkey_cnt++] = enif_make_atom(env,"ecdsa");
algo_pubkey[algo_pubkey_cnt++] = enif_make_atom(env,"ecdh");
#endif
@@ -1824,7 +1727,7 @@ static ERL_NIF_TERM rand_uniform_nif(ErlNifEnv* env, int argc, const ERL_NIF_TER
static ERL_NIF_TERM mod_exp_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (Base,Exponent,Modulo,bin_hdr) */
- BIGNUM *bn_base=NULL, *bn_exponent=NULL, *bn_modulo, *bn_result;
+ BIGNUM *bn_base=NULL, *bn_exponent=NULL, *bn_modulo=NULL, *bn_result;
BN_CTX *bn_ctx;
unsigned char* ptr;
unsigned dlen;
@@ -1839,6 +1742,7 @@ static ERL_NIF_TERM mod_exp_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM arg
if (bn_base) BN_free(bn_base);
if (bn_exponent) BN_free(bn_exponent);
+ if (bn_modulo) BN_free(bn_modulo);
return enif_make_badarg(env);
}
bn_result = BN_new();
@@ -2674,7 +2578,7 @@ static ERL_NIF_TERM dh_compute_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_T
static ERL_NIF_TERM srp_value_B_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{/* (Multiplier, Verifier, Generator, Exponent, Prime) */
BIGNUM *bn_verifier = NULL;
- BIGNUM *bn_exponent, *bn_generator, *bn_prime, *bn_multiplier, *bn_result;
+ BIGNUM *bn_exponent = NULL, *bn_generator = NULL, *bn_prime = NULL, *bn_multiplier = NULL, *bn_result;
BN_CTX *bn_ctx;
unsigned char* ptr;
unsigned dlen;
@@ -2687,9 +2591,9 @@ static ERL_NIF_TERM srp_value_B_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
|| !get_bn_from_bin(env, argv[4], &bn_prime)) {
if (bn_multiplier) BN_free(bn_multiplier);
if (bn_verifier) BN_free(bn_verifier);
- if (bn_verifier) BN_free(bn_generator);
- if (bn_verifier) BN_free(bn_exponent);
- if (bn_verifier) BN_free(bn_prime);
+ if (bn_generator) BN_free(bn_generator);
+ if (bn_exponent) BN_free(bn_exponent);
+ if (bn_prime) BN_free(bn_prime);
return enif_make_badarg(env);
}
@@ -2813,7 +2717,7 @@ static ERL_NIF_TERM srp_host_secret_nif(ErlNifEnv* env, int argc, const ERL_NIF_
<premaster secret> = (A * v^u) ^ b % N
*/
BIGNUM *bn_b = NULL, *bn_verifier = NULL;
- BIGNUM *bn_prime, *bn_A, *bn_u, *bn_base, *bn_result;
+ BIGNUM *bn_prime = NULL, *bn_A = NULL, *bn_u = NULL, *bn_base, *bn_result;
BN_CTX *bn_ctx;
unsigned char* ptr;
unsigned dlen;
@@ -2961,21 +2865,9 @@ static ERL_NIF_TERM blowfish_ofb64_encrypt(ErlNifEnv* env, int argc, const ERL_N
}
#if defined(HAVE_EC)
-static int term2curve_id(ERL_NIF_TERM nid)
-{
- int i;
-
- for (i = 0; i < EC_CURVES_CNT; i++)
- if (ec_curves[i].atom == nid)
- return ec_curves[i].nid;
-
- return 0;
-}
-
static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg)
{
EC_KEY *key = NULL;
- int nid = 0;
int c_arity = -1;
const ERL_NIF_TERM* curve;
ErlNifBinary seed;
@@ -2987,18 +2879,12 @@ static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg)
EC_GROUP *group = NULL;
EC_POINT *point = NULL;
- if (enif_is_atom(env, curve_arg)) {
- nid = term2curve_id(curve_arg);
- if (nid == 0)
- return NULL;
- key = EC_KEY_new_by_curve_name(nid);
- }
- else if (enif_is_tuple(env, curve_arg)
- && enif_get_tuple(env,curve_arg,&c_arity,&curve)
- && c_arity == 5
- && get_bn_from_bin(env, curve[3], &bn_order)
- && (curve[4] != atom_none && get_bn_from_bin(env, curve[4], &cofactor))) {
- /* {Field, Prime, Point, Order, CoFactor} = Curve */
+ /* {Field, Prime, Point, Order, CoFactor} = Curve */
+ if (enif_is_tuple(env, curve_arg)
+ && enif_get_tuple(env,curve_arg,&c_arity,&curve)
+ && c_arity == 5
+ && get_bn_from_bin(env, curve[3], &bn_order)
+ && (curve[4] != atom_none && get_bn_from_bin(env, curve[4], &cofactor))) {
int f_arity = -1;
const ERL_NIF_TERM* field;
@@ -3032,6 +2918,8 @@ static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg)
/* create the EC_GROUP structure */
group = EC_GROUP_new_curve_GFp(p, a, b, NULL);
+#if !defined(OPENSSL_NO_EC2M)
+
} else if (f_arity == 3 && field[0] == atom_characteristic_two_field) {
/* {characteristic_two_field, M, Basis} */
@@ -3090,6 +2978,7 @@ static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg)
goto out_err;
group = EC_GROUP_new_curve_GF2m(p, a, b, NULL);
+#endif
} else
goto out_err;
diff --git a/lib/crypto/doc/src/crypto.xml b/lib/crypto/doc/src/crypto.xml
index 406fd5e59a..40f829e704 100644
--- a/lib/crypto/doc/src/crypto.xml
+++ b/lib/crypto/doc/src/crypto.xml
@@ -99,7 +99,9 @@
<p><code>ecdh_private() = key_value() </code></p>
- <p><code>ecdh_params() = ec_named_curve() |
+ <p><code>ecdh_params() = ec_named_curve() | ec_explicit_curve()</code></p>
+
+ <p><code>ec_explicit_curve() =
{ec_field(), Prime :: key_value(), Point :: key_value(), Order :: integer(), CoFactor :: none | integer()} </code></p>
<p><code>ec_field() = {prime_field, Prime :: integer()} |
@@ -114,7 +116,15 @@
secp192k1| secp160r2| secp128r2| secp128r1| sect233r1| sect233k1| sect193r2| sect193r1|
sect131r2| sect131r1| sect283r1| sect283k1| sect163r2| secp256k1| secp160k1| secp160r1|
secp112r2| secp112r1| sect113r2| sect113r1| sect239k1| sect163r1| sect163k1| secp256r1|
- secp192r1 </code></p>
+ secp192r1|
+ brainpoolP160r1| brainpoolP160t1| brainpoolP192r1| brainpoolP192t1| brainpoolP224r1|
+ brainpoolP224t1| brainpoolP256r1| brainpoolP256t1| brainpoolP320r1| brainpoolP320t1|
+ brainpoolP384r1| brainpoolP384t1| brainpoolP512r1| brainpoolP512t1
+ </code>
+ Note that the <em>sect</em> curves are GF2m (characteristic two) curves and are only supported if the
+ underlying OpenSSL has support for them.
+ See also <seealso marker="#supports-0">crypto:supports/0</seealso>
+ </p>
<p><code>stream_cipher() = rc4 | aes_ctr </code></p>
@@ -143,8 +153,11 @@
</p>
<p><code> cipher_algorithms() = des_cbc | des_cfb | des3_cbc | des3_cbf | des_ede3 |
blowfish_cbc | blowfish_cfb64 | aes_cbc128 | aes_cfb128| aes_cbc256 | aes_ige256 | rc2_cbc | aes_ctr| rc4 </code> </p>
- <p><code> public_key_algorithms() = rsa |dss | ecdsa | dh | ecdh </code> </p>
-
+ <p><code> public_key_algorithms() = rsa |dss | ecdsa | dh | ecdh | ec_gf2m</code>
+ Note that ec_gf2m is not strictly a public key algorithm, but a restriction on what curves are supported
+ with ecdsa and ecdh.
+ </p>
+
</section>
<funcs>
@@ -439,17 +452,17 @@
</func>
<func>
- <name>private_decrypt(Type, ChipherText, PrivateKey, Padding) -> PlainText</name>
- <fsummary>Decrypts ChipherText using the private Key.</fsummary>
+ <name>private_decrypt(Type, CipherText, PrivateKey, Padding) -> PlainText</name>
+ <fsummary>Decrypts CipherText using the private Key.</fsummary>
<type>
<v>Type = rsa</v>
- <v>ChipherText = binary()</v>
+ <v>CipherText = binary()</v>
<v>PrivateKey = rsa_private()</v>
<v>Padding = rsa_pkcs1_padding | rsa_pkcs1_oaep_padding | rsa_no_padding</v>
<v>PlainText = binary()</v>
</type>
<desc>
- <p>Decrypts the <c>ChipherText</c>, encrypted with
+ <p>Decrypts the <c>CipherText</c>, encrypted with
<seealso marker="#public_encrypt-4">public_encrypt/4</seealso> (or equivalent function)
using the <c>PrivateKey</c>, and returns the
plaintext (message digest). This is a low level signature verification operation
@@ -460,7 +473,7 @@
</func>
<func>
- <name>private_encrypt(Type, PlainText, PrivateKey, Padding) -> ChipherText</name>
+ <name>private_encrypt(Type, PlainText, PrivateKey, Padding) -> CipherText</name>
<fsummary>Encrypts PlainText using the private Key.</fsummary>
<type>
<v>Type = rsa</v>
@@ -471,7 +484,7 @@
used, where N is public modulus of the RSA key.</d>
<v>PrivateKey = rsa_private()</v>
<v>Padding = rsa_pkcs1_padding | rsa_no_padding</v>
- <v>ChipherText = binary()</v>
+ <v>CipherText = binary()</v>
</type>
<desc>
<p>Encrypts the <c>PlainText</c> using the <c>PrivateKey</c>
@@ -483,17 +496,17 @@
</desc>
</func>
<func>
- <name>public_decrypt(Type, ChipherText, PublicKey, Padding) -> PlainText</name>
- <fsummary>Decrypts ChipherText using the public Key.</fsummary>
+ <name>public_decrypt(Type, CipherText, PublicKey, Padding) -> PlainText</name>
+ <fsummary>Decrypts CipherText using the public Key.</fsummary>
<type>
<v>Type = rsa</v>
- <v>ChipherText = binary()</v>
+ <v>CipherText = binary()</v>
<v>PublicKey = rsa_public() </v>
<v>Padding = rsa_pkcs1_padding | rsa_no_padding</v>
<v>PlainText = binary()</v>
</type>
<desc>
- <p>Decrypts the <c>ChipherText</c>, encrypted with
+ <p>Decrypts the <c>CipherText</c>, encrypted with
<seealso marker="#private_encrypt-4">private_encrypt/4</seealso>(or equivalent function)
using the <c>PrivateKey</c>, and returns the
plaintext (message digest). This is a low level signature verification operation
@@ -504,7 +517,7 @@
</func>
<func>
- <name>public_encrypt(Type, PlainText, PublicKey, Padding) -> ChipherText</name>
+ <name>public_encrypt(Type, PlainText, PublicKey, Padding) -> CipherText</name>
<fsummary>Encrypts PlainText using the public Key.</fsummary>
<type>
<v>Type = rsa</v>
@@ -515,7 +528,7 @@
used, where N is public modulus of the RSA key.</d>
<v>PublicKey = rsa_public()</v>
<v>Padding = rsa_pkcs1_padding | rsa_pkcs1_oaep_padding | rsa_no_padding</v>
- <v>ChipherText = binary()</v>
+ <v>CipherText = binary()</v>
</type>
<desc>
<p>Encrypts the <c>PlainText</c> (message digest) using the <c>PublicKey</c>
@@ -680,7 +693,29 @@
</desc>
</func>
-
+ <func>
+ <name>ec_curves() -> EllipticCurveList </name>
+ <fsummary>Provide a list of available named elliptic curves.</fsummary>
+ <type>
+ <v>EllipticCurveList = [ec_named_curve()]</v>
+ </type>
+ <desc>
+ <p>Can be used to determine which named elliptic curves are supported.</p>
+ </desc>
+ </func>
+
+ <func>
+ <name>ec_curve(NamedCurve) -> EllipticCurve </name>
+ <fsummary>Get the defining parameters of a elliptic curve.</fsummary>
+ <type>
+ <v>NamedCurve = ec_named_curve()</v>
+ <v>EllipticCurve = ec_explicit_curve()</v>
+ </type>
+ <desc>
+ <p>Return the defining parameters of a elliptic curve.</p>
+ </desc>
+ </func>
+
<func>
<name>verify(Algorithm, DigestType, Msg, Signature, Key) -> boolean()</name>
<fsummary>Verifies a digital signature.</fsummary>
diff --git a/lib/crypto/src/Makefile b/lib/crypto/src/Makefile
index 574c2076f2..c185c159e5 100644
--- a/lib/crypto/src/Makefile
+++ b/lib/crypto/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1999-2013. All Rights Reserved.
+# Copyright Ericsson AB 1999-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -35,10 +35,8 @@ RELSYSDIR = $(RELEASE_PATH)/lib/crypto-$(VSN)
# ----------------------------------------------------
MODULES= \
- crypto_app \
crypto \
- crypto_server \
- crypto_sup
+ crypto_ec_curves
HRL_FILES=
diff --git a/lib/crypto/src/crypto.app.src b/lib/crypto/src/crypto.app.src
index 5548b6a1b5..d3084ff336 100644
--- a/lib/crypto/src/crypto.app.src
+++ b/lib/crypto/src/crypto.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -17,15 +17,12 @@
%% %CopyrightEnd%
%%
{application, crypto,
- [{description, "CRYPTO version 2"},
+ [{description, "CRYPTO"},
{vsn, "%VSN%"},
{modules, [crypto,
- crypto_app,
- crypto_sup,
- crypto_server]},
- {registered, [crypto_sup, crypto_server]},
+ crypto_ec_curves]},
+ {registered, []},
{applications, [kernel, stdlib]},
- {env, []},
- {mod, {crypto_app, []}}]}.
+ {env, []}]}.
diff --git a/lib/crypto/src/crypto.erl b/lib/crypto/src/crypto.erl
index 12ff060bf9..d953bd3bca 100644
--- a/lib/crypto/src/crypto.erl
+++ b/lib/crypto/src/crypto.erl
@@ -34,6 +34,7 @@
-export([public_encrypt/4, private_decrypt/4]).
-export([private_encrypt/4, public_decrypt/4]).
-export([dh_generate_parameters/2, dh_check/1]). %% Testing see
+-export([ec_curve/1, ec_curves/0]).
%% DEPRECATED
%% Replaced by hash_*
@@ -557,7 +558,7 @@ generate_key(srp, {user, [Generator, Prime, Version]}, PrivateArg)
user_srp_gen_key(Private, Generator, Prime);
generate_key(ecdh, Curve, undefined) ->
- ec_key_generate(Curve).
+ ec_key_generate(nif_curve_params(Curve)).
compute_key(dh, OthersPublicKey, MyPrivateKey, DHParameters) ->
@@ -1502,21 +1503,27 @@ ec_key_generate(_Key) -> ?nif_stub.
ecdh_compute_key_nif(_Others, _Curve, _My) -> ?nif_stub.
+ec_curves() ->
+ crypto_ec_curves:curves().
+
+ec_curve(X) ->
+ crypto_ec_curves:curve(X).
+
%%
%% EC
%%
term_to_nif_prime({prime_field, Prime}) ->
- {prime_field, int_to_bin(Prime)};
+ {prime_field, ensure_int_as_bin(Prime)};
term_to_nif_prime(PrimeField) ->
PrimeField.
term_to_nif_curve({A, B, Seed}) ->
{ensure_int_as_bin(A), ensure_int_as_bin(B), Seed}.
nif_curve_params({PrimeField, Curve, BasePoint, Order, CoFactor}) ->
- {term_to_nif_prime(PrimeField), term_to_nif_curve(Curve), ensure_int_as_bin(BasePoint), int_to_bin(Order), int_to_bin(CoFactor)};
+ {term_to_nif_prime(PrimeField), term_to_nif_curve(Curve), ensure_int_as_bin(BasePoint), ensure_int_as_bin(Order), ensure_int_as_bin(CoFactor)};
nif_curve_params(Curve) when is_atom(Curve) ->
%% named curve
- Curve.
+ crypto_ec_curves:curve(Curve).
%% MISC --------------------------------------------------------------------
diff --git a/lib/crypto/src/crypto_app.erl b/lib/crypto/src/crypto_app.erl
deleted file mode 100644
index f1ea1406e4..0000000000
--- a/lib/crypto/src/crypto_app.erl
+++ /dev/null
@@ -1,39 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%% Purpose : Application master for CRYPTO.
-
--module(crypto_app).
-
--behaviour(application).
-
--export([start/2, stop/1]).
-
-%% start/2(Type, StartArgs) -> {ok, Pid} | {ok, Pid, State} |
-%% {error, Reason}
-%%
-start(_Type, _StartArgs) ->
- crypto_sup:start_link().
-
-%% stop(State) -> void()
-%%
-stop(_State) ->
- ok.
-
-
diff --git a/lib/crypto/src/crypto_ec_curves.erl b/lib/crypto/src/crypto_ec_curves.erl
new file mode 100644
index 0000000000..fe17643d96
--- /dev/null
+++ b/lib/crypto/src/crypto_ec_curves.erl
@@ -0,0 +1,1215 @@
+-module(crypto_ec_curves).
+
+-export([curve/1, curves/0]).
+
+curves() ->
+ CryptoSupport = crypto:supports(),
+ HasGF2m = proplists:get_bool(ec_gf2m, proplists:get_value(public_keys, CryptoSupport)),
+ prime_curves() ++ characteristic_two_curves(HasGF2m).
+
+
+prime_curves() ->
+ [secp112r1,secp112r2,secp128r1,secp128r2,secp160k1,secp160r1,secp160r2,
+ secp192r1,secp192k1,secp224k1,secp224r1,secp256k1,secp256r1,secp384r1,
+ secp521r1,prime192v1,prime192v2,prime192v3,prime239v1,prime239v2,prime239v3,
+ prime256v1,wtls6,wtls7,wtls8,wtls9,wtls12,
+ brainpoolP160r1,brainpoolP160t1,brainpoolP192r1,brainpoolP192t1,
+ brainpoolP224r1,brainpoolP224t1,brainpoolP256r1,brainpoolP256t1,
+ brainpoolP320r1,brainpoolP320t1,brainpoolP384r1,brainpoolP384t1,
+ brainpoolP512r1,brainpoolP512t1].
+
+characteristic_two_curves(true) ->
+ [sect113r1,sect113r2,sect131r1,sect131r2,sect163k1,sect163r1,
+ sect163r2,sect193r1,sect193r2,sect233k1,sect233r1,sect239k1,sect283k1,
+ sect283r1,sect409k1,sect409r1,sect571k1,sect571r1,c2pnb163v1,c2pnb163v2,
+ c2pnb163v3,c2pnb176v1,c2tnb191v1,c2tnb191v2,c2tnb191v3,c2pnb208w1,c2tnb239v1,
+ c2tnb239v2,c2tnb239v3,c2pnb272w1,c2pnb304w1,c2tnb359v1,c2pnb368w1,c2tnb431r1,
+ wtls1,wtls3,wtls4,wtls5,wtls10,wtls11,ipsec3,ipsec4];
+characteristic_two_curves(_) ->
+ [].
+
+curve(secp112r1) ->
+ {
+ {prime_field, <<16#DB7C2ABF62E35E668076BEAD208B:112>>}, %% Prime
+ {<<16#DB7C2ABF62E35E668076BEAD2088:112>>, %% A
+ <<16#659EF8BA043916EEDE8911702B22:112>>, %% B
+ <<16#00F50B028E4D696E676875615175290472783FB1:160>>}, %% Seed
+ <<16#04:8,
+ 16#09487239995A5EE76B55F9C2F098:112, %% X(p0)
+ 16#A89CE5AF8724C0A23E0E0FF77500:112>>, %% Y(p0)
+ <<16#DB7C2ABF62E35E7628DFAC6561C5:112>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp112r2) ->
+ {
+ {prime_field, <<16#DB7C2ABF62E35E668076BEAD208B:112>>}, %% Prime
+ {<<16#6127C24C05F38A0AAAF65C0EF02C:112>>, %% A
+ <<16#51DEF1815DB5ED74FCC34C85D709:112>>, %% B
+ <<16#002757A1114D696E6768756151755316C05E0BD4:160>>}, %% Seed
+ <<16#04:8,
+ 16#4BA30AB5E892B4E1649DD0928643:112, %% X(p0)
+ 16#ADCD46F5882E3747DEF36E956E97:112>>, %% Y(p0)
+ <<16#36DF0AAFD8B8D7597CA10520D04B:112>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(secp128r1) ->
+ {
+ {prime_field, <<16#FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF:128>>}, %% Prime
+ {<<16#FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC:128>>, %% A
+ <<16#E87579C11079F43DD824993C2CEE5ED3:128>>, %% B
+ <<16#000E0D4D696E6768756151750CC03A4473D03679:160>>}, %% Seed
+ <<16#04:8,
+ 16#161FF7528B899B2D0C28607CA52C5B86:128, %% X(p0)
+ 16#CF5AC8395BAFEB13C02DA292DDED7A83:128>>, %% Y(p0)
+ <<16#FFFFFFFE0000000075A30D1B9038A115:128>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp128r2) ->
+ {
+ {prime_field, <<16#FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF:128>>}, %% Prime
+ {<<16#D6031998D1B3BBFEBF59CC9BBFF9AEE1:128>>, %% A
+ <<16#5EEEFCA380D02919DC2C6558BB6D8A5D:128>>, %% B
+ <<16#004D696E67687561517512D8F03431FCE63B88F4:160>>}, %% Seed
+ <<16#04:8,
+ 16#7B6AA5D85E572983E6FB32A7CDEBC140:128, %% X(p0)
+ 16#27B6916A894D3AEE7106FE805FC34B44:128>>, %% Y(p0)
+ <<16#3FFFFFFF7FFFFFFFBE0024720613B5A3:128>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(secp160k1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73:160>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#07:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#3B4C382CE37AA192A4019E763036F4F5DD4D7EBB:160, %% X(p0)
+ 16#938CF935318FDCED6BC28286531733C3F03C4FEE:160>>, %% Y(p0)
+ <<16#0100000000000000000001B8FA16DFAB9ACA16B6B3:168>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp160r1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF:160>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC:160>>, %% A
+ <<16#1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45:160>>, %% B
+ <<16#1053CDE42C14D696E67687561517533BF3F83345:160>>}, %% Seed
+ <<16#04:8,
+ 16#4A96B5688EF573284664698968C38BB913CBFC82:160, %% X(p0)
+ 16#23A628553168947D59DCC912042351377AC5FB32:160>>, %% Y(p0)
+ <<16#0100000000000000000001F4C8F927AED3CA752257:168>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp160r2) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73:160>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70:160>>, %% A
+ <<16#B4E134D3FB59EB8BAB57274904664D5AF50388BA:160>>, %% B
+ <<16#B99B99B099B323E02709A4D696E6768756151751:160>>}, %% Seed
+ <<16#04:8,
+ 16#52DCB034293A117E1F4FF11B30F7199D3144CE6D:160, %% X(p0)
+ 16#FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E:160>>, %% Y(p0)
+ <<16#0100000000000000000000351EE786A818F3A1A16B:168>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp192r1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF:192>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC:192>>, %% A
+ <<16#64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1:192>>, %% B
+ <<16#3045AE6FC8422F64ED579528D38120EAE12196D5:160>>}, %% Seed
+ <<16#04:8,
+ 16#188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012:192, %% X(p0)
+ 16#07192B95FFC8DA78631011ED6B24CDD573F977A11E794811:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp192k1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37:192>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#03:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D:192, %% X(p0)
+ 16#9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp224k1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D:224>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#05:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C:224, %% X(p0)
+ 16#7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5:224>>, %% Y(p0)
+ <<16#010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7:232>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp224r1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001:224>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE:224>>, %% A
+ <<16#B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4:224>>, %% B
+ <<16#BD71344799D5C7FCDC45B59FA3B9AB8F6A948BC5:160>>}, %% Seed
+ <<16#04:8,
+ 16#B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21:224, %% X(p0)
+ 16#BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34:224>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D:224>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp256k1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F:256>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#07:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798:256, %% X(p0)
+ 16#483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8:256>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141:256>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp256r1) ->
+ {
+ {prime_field, <<16#FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF:256>>}, %% Prime
+ {<<16#FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC:256>>, %% A
+ <<16#5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B:256>>, %% B
+ <<16#C49D360886E704936A6678E1139D26B7819F7E90:160>>}, %% Seed
+ <<16#04:8,
+ 16#6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296:256, %% X(p0)
+ 16#4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5:256>>, %% Y(p0)
+ <<16#FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551:256>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp384r1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE:256, %% Prime
+ 16#FFFFFFFF0000000000000000FFFFFFFF:128>>},
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE:256, %% A
+ 16#FFFFFFFF0000000000000000FFFFFFFC:128>>,
+ <<16#B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875A:256, %% B
+ 16#C656398D8A2ED19D2A85C8EDD3EC2AEF:128>>,
+ <<16#A335926AA319A27A1D00896A6773A4827ACDAC73:160>>}, %% Seed
+ <<16#04:8,
+ 16#AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A38:256, %% X(p0)
+ 16#5502F25DBF55296C3A545E3872760AB7:128,
+ 16#3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C0:256, %% Y(p0)
+ 16#0A60B1CE1D7E819D7A431D7C90EA0E5F:128>>,
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF:256, %% Order
+ 16#581A0DB248B0A77AECEC196ACCC52973:128>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(secp521r1) ->
+ {
+ {prime_field, <<16#01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256, %% Prime
+ 16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256,
+ 16#FFFF:16>>},
+ {<<16#01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256, %% A
+ 16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256,
+ 16#FFFC:16>>,
+ <<16#51953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109:256, %% B
+ 16#E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F:256,
+ 16#00:8>>,
+ <<16#D09E8800291CB85396CC6717393284AAA0DA64BA:160>>}, %% Seed
+ <<16#04:8,
+ 16#00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D:256, %% X(p0)
+ 16#3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5:256,
+ 16#BD66:16,
+ 16#011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E:256, %% Y(p0)
+ 16#662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD1:256,
+ 16#6650:16>>,
+ <<16#01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256, %% Order
+ 16#FFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E9138:256,
+ 16#6409:16>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime192v1) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF:192>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC:192>>, %% A
+ <<16#64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1:192>>, %% B
+ <<16#3045AE6FC8422F64ED579528D38120EAE12196D5:160>>}, %% Seed
+ <<16#04:8,
+ 16#188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012:192, %% X(p0)
+ 16#07192B95FFC8DA78631011ED6B24CDD573F977A11E794811:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime192v2) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF:192>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC:192>>, %% A
+ <<16#CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953:192>>, %% B
+ <<16#31A92EE2029FD10D901B113E990710F0D21AC6B6:160>>}, %% Seed
+ <<16#04:8,
+ 16#EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A:192, %% X(p0)
+ 16#6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime192v3) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF:192>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC:192>>, %% A
+ <<16#22123DC2395A05CAA7423DAECCC94760A7D462256BD56916:192>>, %% B
+ <<16#C469684435DEB378C4B65CA9591E2A5763059A2E:160>>}, %% Seed
+ <<16#04:8,
+ 16#7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896:192, %% X(p0)
+ 16#38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime239v1) ->
+ {
+ {prime_field, <<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF:240>>}, %% Prime
+ {<<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC:240>>, %% A
+ <<16#6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A:240>>, %% B
+ <<16#E43BB460F0B80CC0C0B075798E948060F8321B7D:160>>}, %% Seed
+ <<16#04:8,
+ 16#0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF:240, %% X(p0)
+ 16#7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE:240>>, %% Y(p0)
+ <<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B:240>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime239v2) ->
+ {
+ {prime_field, <<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF:240>>}, %% Prime
+ {<<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC:240>>, %% A
+ <<16#617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C:240>>, %% B
+ <<16#E8B4011604095303CA3B8099982BE09FCB9AE616:160>>}, %% Seed
+ <<16#04:8,
+ 16#38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7:240, %% X(p0)
+ 16#5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA:240>>, %% Y(p0)
+ <<16#7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063:240>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime239v3) ->
+ {
+ {prime_field, <<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF:240>>}, %% Prime
+ {<<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC:240>>, %% A
+ <<16#255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E:240>>, %% B
+ <<16#7D7374168FFE3471B60A857686A19475D3BFA2FF:160>>}, %% Seed
+ <<16#04:8,
+ 16#6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A:240, %% X(p0)
+ 16#1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3:240>>, %% Y(p0)
+ <<16#7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551:240>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(prime256v1) ->
+ {
+ {prime_field, <<16#FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF:256>>}, %% Prime
+ {<<16#FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC:256>>, %% A
+ <<16#5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B:256>>, %% B
+ <<16#C49D360886E704936A6678E1139D26B7819F7E90:160>>}, %% Seed
+ <<16#04:8,
+ 16#6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296:256, %% X(p0)
+ 16#4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5:256>>, %% Y(p0)
+ <<16#FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551:256>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(sect113r1) ->
+ {
+ {characteristic_two_field, 113, {tpbasis,9}},
+ {<<16#3088250CA6E7C7FE649CE85820F7:112>>, %% A
+ <<16#E8BEE4D3E2260744188BE0E9C723:112>>, %% B
+ <<16#10E723AB14D696E6768756151756FEBF8FCB49A9:160>>}, %% Seed
+ <<16#04:8,
+ 16#009D73616F35F4AB1407D73562C10F:120, %% X(p0)
+ 16#00A52830277958EE84D1315ED31886:120>>, %% Y(p0)
+ <<16#0100000000000000D9CCEC8A39E56F:120>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect113r2) ->
+ {
+ {characteristic_two_field, 113, {tpbasis,9}},
+ {<<16#689918DBEC7E5A0DD6DFC0AA55C7:112>>, %% A
+ <<16#95E9A9EC9B297BD4BF36E059184F:112>>, %% B
+ <<16#10C0FB15760860DEF1EEF4D696E676875615175D:160>>}, %% Seed
+ <<16#04:8,
+ 16#01A57A6A7B26CA5EF52FCDB8164797:120, %% X(p0)
+ 16#00B3ADC94ED1FE674C06E695BABA1D:120>>, %% Y(p0)
+ <<16#010000000000000108789B2496AF93:120>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect131r1) ->
+ {
+ {characteristic_two_field, 131, {ppbasis,2,3,8}},
+ {<<16#07A11B09A76B562144418FF3FF8C2570B8:136>>, %% A
+ <<16#0217C05610884B63B9C6C7291678F9D341:136>>, %% B
+ <<16#4D696E676875615175985BD3ADBADA21B43A97E2:160>>}, %% Seed
+ <<16#04:8,
+ 16#0081BAF91FDF9833C40F9C181343638399:136, %% X(p0)
+ 16#078C6E7EA38C001F73C8134B1B4EF9E150:136>>, %% Y(p0)
+ <<16#0400000000000000023123953A9464B54D:136>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect131r2) ->
+ {
+ {characteristic_two_field, 131, {ppbasis,2,3,8}},
+ {<<16#03E5A88919D7CAFCBF415F07C2176573B2:136>>, %% A
+ <<16#04B8266A46C55657AC734CE38F018F2192:136>>, %% B
+ <<16#985BD3ADBAD4D696E676875615175A21B43A97E3:160>>}, %% Seed
+ <<16#04:8,
+ 16#0356DCD8F2F95031AD652D23951BB366A8:136, %% X(p0)
+ 16#0648F06D867940A5366D9E265DE9EB240F:136>>, %% Y(p0)
+ <<16#0400000000000000016954A233049BA98F:136>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect163k1) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,3,6,7}},
+ {<<16#01:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8:168, %% X(p0)
+ 16#0289070FB05D38FF58321F2E800536D538CCDAA3D9:168>>, %% Y(p0)
+ <<16#04000000000000000000020108A2E0CC0D99F8A5EF:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect163r1) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,3,6,7}},
+ {<<16#07B6882CAAEFA84F9554FF8428BD88E246D2782AE2:168>>, %% A
+ <<16#0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9:168>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0369979697AB43897789566789567F787A7876A654:168, %% X(p0)
+ 16#00435EDB42EFAFB2989D51FEFCE3C80988F41FF883:168>>, %% Y(p0)
+ <<16#03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect163r2) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,3,6,7}},
+ {<<16#01:8>>, %% A
+ <<16#020A601907B8C953CA1481EB10512F78744A3205FD:168>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#03F0EBA16286A2D57EA0991168D4994637E8343E36:168, %% X(p0)
+ 16#00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1:168>>, %% Y(p0)
+ <<16#040000000000000000000292FE77E70C12A4234C33:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect193r1) ->
+ {
+ {characteristic_two_field, 193, {tpbasis,15}},
+ {<<16#17858FEB7A98975169E171F77B4087DE098AC8A911DF7B01:192>>, %% A
+ <<16#FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814:192>>, %% B
+ <<16#103FAEC74D696E676875615175777FC5B191EF30:160>>}, %% Seed
+ <<16#04:8,
+ 16#01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1:200, %% X(p0)
+ 16#0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05:200>>, %% Y(p0)
+ <<16#01000000000000000000000000C7F34A778F443ACC920EBA49:200>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect193r2) ->
+ {
+ {characteristic_two_field, 193, {tpbasis,15}},
+ {<<16#0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B:200>>, %% A
+ <<16#C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE:192>>, %% B
+ <<16#10B7B4D696E676875615175137C8A16FD0DA2211:160>>}, %% Seed
+ <<16#04:8,
+ 16#00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F:200, %% X(p0)
+ 16#01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C:200>>, %% Y(p0)
+ <<16#010000000000000000000000015AAB561B005413CCD4EE99D5:200>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect233k1) ->
+ {
+ {characteristic_two_field, 233, {tpbasis,74}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126:240, %% X(p0)
+ 16#01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3:240>>, %% Y(p0)
+ <<16#8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF:232>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(sect233r1) ->
+ {
+ {characteristic_two_field, 233, {tpbasis,74}},
+ {<<16#01:8>>, %% A
+ <<16#66647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD:232>>, %% B
+ <<16#74D59FF07F6B413D0EA14B344B20A2DB049B50C3:160>>}, %% Seed
+ <<16#04:8,
+ 16#00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B:240, %% X(p0)
+ 16#01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052:240>>, %% Y(p0)
+ <<16#01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7:240>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect239k1) ->
+ {
+ {characteristic_two_field, 239, {tpbasis,158}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC:240, %% X(p0)
+ 16#76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA:240>>, %% Y(p0)
+ <<16#2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5:240>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(sect283k1) ->
+ {
+ {characteristic_two_field, 283, {ppbasis,5,7,12}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC24:256, %% X(p0)
+ 16#58492836:32,
+ 16#01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E341161:256, %% Y(p0)
+ 16#77DD2259:32>>,
+ <<16#01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E06:256, %% Order
+ 16#1E163C61:32>>,
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(sect283r1) ->
+ {
+ {characteristic_two_field, 283, {ppbasis,5,7,12}},
+ {<<16#01:8>>, %% A
+ <<16#027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E31:256, %% B
+ 16#3B79A2F5:32>>,
+ <<16#77E2B07370EB0F832A6DD5B62DFC88CD06BB84BE:160>>}, %% Seed
+ <<16#04:8,
+ 16#05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD:256, %% X(p0)
+ 16#86B12053:32,
+ 16#03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45:256, %% Y(p0)
+ 16#BE8112F4:32>>,
+ <<16#03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7C:256, %% Order
+ 16#EFADB307:32>>,
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect409k1) ->
+ {
+ {characteristic_two_field, 409, {tpbasis,87}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2:256, %% X(p0)
+ 16#C460189EB5AAAA62EE222EB1B35540CFE9023746:160,
+ 16#01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3:256, %% Y(p0)
+ 16#DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B:160>>,
+ <<16#7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F83B2D4EA20:256, %% Order
+ 16#400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF:152>>,
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(sect409r1) ->
+ {
+ {characteristic_two_field, 409, {tpbasis,87}},
+ {<<16#01:8>>, %% A
+ <<16#21A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9:256, %% B
+ 16#A197B272822F6CD57A55AA4F50AE317B13545F:152>>,
+ <<16#4099B5A457F9D69F79213D094C4BCD4D4262210B:160>>}, %% Seed
+ <<16#04:8,
+ 16#015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703:256, %% X(p0)
+ 16#DC255A868A1180515603AEAB60794E54BB7996A7:160,
+ 16#0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F:256, %% Y(p0)
+ 16#38514F1FDF4B4F40D2181B3681C364BA0273C706:160>>,
+ <<16#010000000000000000000000000000000000000000000000000001E2AAD6A612:256, %% Order
+ 16#F33307BE5FA47C3C9E052F838164CD37D9A21173:160>>,
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(sect571k1) ->
+ {
+ {characteristic_two_field, 571, {ppbasis,2,5,10}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA4:256, %% X(p0)
+ 16#4370958493B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7:256,
+ 16#E2945283A01C8972:64,
+ 16#0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C:256, %% Y(p0)
+ 16#9D4979C0AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F6:256,
+ 16#01CD4C143EF1C7A3:64>>,
+ <<16#0200000000000000000000000000000000000000000000000000000000000000:256, %% Order
+ 16#00000000131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB4:256,
+ 16#5CFE778F637C1001:64>>,
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(sect571r1) ->
+ {
+ {characteristic_two_field, 571, {ppbasis,2,5,10}},
+ {<<16#01:8>>, %% A
+ <<16#02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD:256, %% B
+ 16#84FFABBD8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C:256,
+ 16#7FFEFF7F2955727A:64>>,
+ <<16#2AA058F73A0E33AB486B0F610410C53A7F132310:160>>}, %% Seed
+ <<16#04:8,
+ 16#0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABD:256, %% X(p0)
+ 16#BDE53950F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927:256,
+ 16#E1E7769C8EEC2D19:64,
+ 16#037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A6:256, %% Y(p0)
+ 16#84423E43BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C:256,
+ 16#1A4827AF1B8AC15B:64>>,
+ <<16#03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF:256, %% Order
+ 16#FFFFFFFFE661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E:256,
+ 16#8382E9BB2FE84E47:64>>,
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(c2pnb163v1) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,1,2,8}},
+ {<<16#072546B5435234A422E0789675F432C89435DE5242:168>>, %% A
+ <<16#C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9:160>>, %% B
+ <<16#D2C0FB15760860DEF1EEF4D696E6768756151754:160>>}, %% Seed
+ <<16#04:8,
+ 16#07AF69989546103D79329FCC3D74880F33BBE803CB:168, %% X(p0)
+ 16#01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F:168>>, %% Y(p0)
+ <<16#0400000000000000000001E60FC8821CC74DAEAFC1:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(c2pnb163v2) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,1,2,8}},
+ {<<16#0108B39E77C4B108BED981ED0E890E117C511CF072:168>>, %% A
+ <<16#0667ACEB38AF4E488C407433FFAE4F1C811638DF20:168>>, %% B
+ <<16#53814C050D44D696E67687561517580CA4E29FFD:160>>}, %% Seed
+ <<16#04:8,
+ 16#0024266E4EB5106D0A964D92C4860E2671DB9B6CC5:168, %% X(p0)
+ 16#079F684DDF6684C5CD258B3890021B2386DFD19FC5:168>>, %% Y(p0)
+ <<16#03FFFFFFFFFFFFFFFFFFFDF64DE1151ADBB78F10A7:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(c2pnb163v3) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,1,2,8}},
+ {<<16#07A526C63D3E25A256A007699F5447E32AE456B50E:168>>, %% A
+ <<16#03F7061798EB99E238FD6F1BF95B48FEEB4854252B:168>>, %% B
+ <<16#50CBF1D95CA94D696E676875615175F16A36A3B8:160>>}, %% Seed
+ <<16#04:8,
+ 16#02F9F87B7C574D0BDECF8A22E6524775F98CDEBDCB:168, %% X(p0)
+ 16#05B935590C155E17EA48EB3FF3718B893DF59A05D0:168>>, %% Y(p0)
+ <<16#03FFFFFFFFFFFFFFFFFFFE1AEE140F110AFF961309:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(c2pnb176v1) ->
+ {
+ {characteristic_two_field, 176, {ppbasis,1,2,43}},
+ {<<16#E4E6DB2995065C407D9D39B8D0967B96704BA8E9C90B:176>>, %% A
+ <<16#5DDA470ABE6414DE8EC133AE28E9BBD7FCEC0AE0FFF2:176>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#8D16C2866798B600F9F08BB4A8E860F3298CE04A5798:176, %% X(p0)
+ 16#6FA4539C2DADDDD6BAB5167D61B436E1D92BB16A562C:176>>, %% Y(p0)
+ <<16#010092537397ECA4F6145799D62B0A19CE06FE26AD:168>>, %% Order
+ <<16#FF6E:16>> %% CoFactor
+ };
+
+curve(c2tnb191v1) ->
+ {
+ {characteristic_two_field, 191, {tpbasis,9}},
+ {<<16#2866537B676752636A68F56554E12640276B649EF7526267:192>>, %% A
+ <<16#2E45EF571F00786F67B0081B9495A3D95462F5DE0AA185EC:192>>, %% B
+ <<16#4E13CA542744D696E67687561517552F279A8C84:160>>}, %% Seed
+ <<16#04:8,
+ 16#36B3DAF8A23206F9C4F299D7B21A9C369137F2C84AE1AA0D:192, %% X(p0)
+ 16#765BE73433B3F95E332932E70EA245CA2418EA0EF98018FB:192>>, %% Y(p0)
+ <<16#40000000000000000000000004A20E90C39067C893BBB9A5:192>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(c2tnb191v2) ->
+ {
+ {characteristic_two_field, 191, {tpbasis,9}},
+ {<<16#401028774D7777C7B7666D1366EA432071274F89FF01E718:192>>, %% A
+ <<16#0620048D28BCBD03B6249C99182B7C8CD19700C362C46A01:192>>, %% B
+ <<16#0871EF2FEF24D696E6768756151758BEE0D95C15:160>>}, %% Seed
+ <<16#04:8,
+ 16#3809B2B7CC1B28CC5A87926AAD83FD28789E81E2C9E3BF10:192, %% X(p0)
+ 16#17434386626D14F3DBF01760D9213A3E1CF37AEC437D668A:192>>, %% Y(p0)
+ <<16#20000000000000000000000050508CB89F652824E06B8173:192>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(c2tnb191v3) ->
+ {
+ {characteristic_two_field, 191, {tpbasis,9}},
+ {<<16#6C01074756099122221056911C77D77E77A777E7E7E77FCB:192>>, %% A
+ <<16#71FE1AF926CF847989EFEF8DB459F66394D90F32AD3F15E8:192>>, %% B
+ <<16#E053512DC684D696E676875615175067AE786D1F:160>>}, %% Seed
+ <<16#04:8,
+ 16#375D4CE24FDE434489DE8746E71786015009E66E38A926DD:192, %% X(p0)
+ 16#545A39176196575D985999366E6AD34CE0A77CD7127B06BE:192>>, %% Y(p0)
+ <<16#155555555555555555555555610C0B196812BFB6288A3EA3:192>>, %% Order
+ <<16#06:8>> %% CoFactor
+ };
+
+curve(c2pnb208w1) ->
+ {
+ {characteristic_two_field, 208, {ppbasis,1,2,83}},
+ {<<16#00:8>>, %% A
+ <<16#C8619ED45A62E6212E1160349E2BFA844439FAFC2A3FD1638F9E:208>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#89FDFBE4ABE193DF9559ECF07AC0CE78554E2784EB8C1ED1A57A:208, %% X(p0)
+ 16#0F55B51A06E78E9AC38A035FF520D8B01781BEB1A6BB08617DE3:208>>, %% Y(p0)
+ <<16#0101BAF95C9723C57B6C21DA2EFF2D5ED588BDD5717E212F9D:200>>, %% Order
+ <<16#FE48:16>> %% CoFactor
+ };
+
+curve(c2tnb239v1) ->
+ {
+ {characteristic_two_field, 239, {tpbasis,36}},
+ {<<16#32010857077C5431123A46B808906756F543423E8D27877578125778AC76:240>>, %% A
+ <<16#790408F2EEDAF392B012EDEFB3392F30F4327C0CA3F31FC383C422AA8C16:240>>, %% B
+ <<16#D34B9A4D696E676875615175CA71B920BFEFB05D:160>>}, %% Seed
+ <<16#04:8,
+ 16#57927098FA932E7C0A96D3FD5B706EF7E5F5C156E16B7E7C86038552E91D:240, %% X(p0)
+ 16#61D8EE5077C33FECF6F1A16B268DE469C3C7744EA9A971649FC7A9616305:240>>, %% Y(p0)
+ <<16#2000000000000000000000000000000F4D42FFE1492A4993F1CAD666E447:240>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(c2tnb239v2) ->
+ {
+ {characteristic_two_field, 239, {tpbasis,36}},
+ {<<16#4230017757A767FAE42398569B746325D45313AF0766266479B75654E65F:240>>, %% A
+ <<16#5037EA654196CFF0CD82B2C14A2FCF2E3FF8775285B545722F03EACDB74B:240>>, %% B
+ <<16#2AA6982FDFA4D696E676875615175D266727277D:160>>}, %% Seed
+ <<16#04:8,
+ 16#28F9D04E900069C8DC47A08534FE76D2B900B7D7EF31F5709F200C4CA205:240, %% X(p0)
+ 16#5667334C45AFF3B5A03BAD9DD75E2C71A99362567D5453F7FA6E227EC833:240>>, %% Y(p0)
+ <<16#1555555555555555555555555555553C6F2885259C31E3FCDF154624522D:240>>, %% Order
+ <<16#06:8>> %% CoFactor
+ };
+
+curve(c2tnb239v3) ->
+ {
+ {characteristic_two_field, 239, {tpbasis,36}},
+ {<<16#01238774666A67766D6676F778E676B66999176666E687666D8766C66A9F:240>>, %% A
+ <<16#6A941977BA9F6A435199ACFC51067ED587F519C5ECB541B8E44111DE1D40:240>>, %% B
+ <<16#9E076F4D696E676875615175E11E9FDD77F92041:160>>}, %% Seed
+ <<16#04:8,
+ 16#70F6E9D04D289C4E89913CE3530BFDE903977D42B146D539BF1BDE4E9C92:240, %% X(p0)
+ 16#2E5A0EAF6E5E1305B9004DCE5C0ED7FE59A35608F33837C816D80B79F461:240>>, %% Y(p0)
+ <<16#0CCCCCCCCCCCCCCCCCCCCCCCCCCCCCAC4912D2D9DF903EF9888B8A0E4CFF:240>>, %% Order
+ <<16#0A:8>> %% CoFactor
+ };
+
+curve(c2pnb272w1) ->
+ {
+ {characteristic_two_field, 272, {ppbasis,1,3,56}},
+ {<<16#91A091F03B5FBA4AB2CCF49C4EDD220FB028712D42BE752B2C40094DBACDB586:256, %% A
+ 16#FB20:16>>,
+ <<16#7167EFC92BB2E3CE7C8AAAFF34E12A9C557003D7C73A6FAF003F99F6CC8482E5:256, %% B
+ 16#40F7:16>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#6108BABB2CEEBCF787058A056CBE0CFE622D7723A289E08A07AE13EF0D10D171:256, %% X(p0)
+ 16#DD8D:16,
+ 16#10C7695716851EEF6BA7F6872E6142FBD241B830FF5EFCACECCAB05E02005DDE:256, %% Y(p0)
+ 16#9D23:16>>,
+ <<16#0100FAF51354E0E39E4892DF6E319C72C8161603FA45AA7B998A167B8F1E6295:256, %% Order
+ 16#21:8>>,
+ <<16#FF06:16>> %% CoFactor
+ };
+
+curve(c2pnb304w1) ->
+ {
+ {characteristic_two_field, 304, {ppbasis,1,2,11}},
+ {<<16#FD0D693149A118F651E6DCE6802085377E5F882D1B510B44160074C128807836:256, %% A
+ 16#5A0396C8E681:48>>,
+ <<16#BDDB97E555A50A908E43B01C798EA5DAA6788F1EA2794EFCF57166B8C1403960:256, %% B
+ 16#1E55827340BE:48>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#197B07845E9BE2D96ADB0F5F3C7F2CFFBD7A3EB8B6FEC35C7FD67F26DDF6285A:256, %% X(p0)
+ 16#644F740A2614:48,
+ 16#E19FBEB76E0DA171517ECF401B50289BF014103288527A9B416A105E80260B54:256, %% Y(p0)
+ 16#9FDC1B92C03B:48>>,
+ <<16#0101D556572AABAC800101D556572AABAC8001022D5C91DD173F8FB561DA6899:256, %% Order
+ 16#164443051D:40>>,
+ <<16#FE2E:16>> %% CoFactor
+ };
+
+curve(c2tnb359v1) ->
+ {
+ {characteristic_two_field, 359, {tpbasis,68}},
+ {<<16#5667676A654B20754F356EA92017D946567C46675556F19556A04616B567D223:256, %% A
+ 16#A5E05656FB549016A96656A557:104>>,
+ <<16#2472E2D0197C49363F1FE7F5B6DB075D52B6947D135D8CA445805D39BC345626:256, %% B
+ 16#089687742B6329E70680231988:104>>,
+ <<16#2B354920B724D696E67687561517585BA1332DC6:160>>}, %% Seed
+ <<16#04:8,
+ 16#3C258EF3047767E7EDE0F1FDAA79DAEE3841366A132E163ACED4ED2401DF9C6B:256, %% X(p0)
+ 16#DCDE98E8E707C07A2239B1B097:104,
+ 16#53D7E08529547048121E9C95F3791DD804963948F34FAE7BF44EA82365DC7868:256, %% Y(p0)
+ 16#FE57E4AE2DE211305A407104BD:104>>,
+ <<16#01AF286BCA1AF286BCA1AF286BCA1AF286BCA1AF286BC9FB8F6B85C556892C20:256, %% Order
+ 16#A7EB964FE7719E74F490758D3B:104>>,
+ <<16#4C:8>> %% CoFactor
+ };
+
+curve(c2pnb368w1) ->
+ {
+ {characteristic_two_field, 368, {ppbasis,1,2,85}},
+ {<<16#E0D2EE25095206F5E2A4F9ED229F1F256E79A0E2B455970D8D0D865BD94778C5:256, %% A
+ 16#76D62F0AB7519CCD2A1A906AE30D:112>>,
+ <<16#FC1217D4320A90452C760A58EDCD30C8DD069B3C34453837A34ED50CB54917E1:256, %% B
+ 16#C2112D84D164F444F8F74786046A:112>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#1085E2755381DCCCE3C1557AFA10C2F0C0C2825646C5B34A394CBCFA8BC16B22:256, %% X(p0)
+ 16#E7E789E927BE216F02E1FB136A5F:112,
+ 16#7B3EB1BDDCBA62D5D8B2059B525797FC73822C59059C623A45FF3843CEE8F87C:256, %% Y(p0)
+ 16#D1855ADAA81E2A0750B80FDA2310:112>>,
+ <<16#010090512DA9AF72B08349D98A5DD4C7B0532ECA51CE03E2D10F3B7AC579BD87:256, %% Order
+ 16#E909AE40A6F131E9CFCE5BD967:104>>,
+ <<16#FF70:16>> %% CoFactor
+ };
+
+curve(c2tnb431r1) ->
+ {
+ {characteristic_two_field, 431, {tpbasis,120}},
+ {<<16#1A827EF00DD6FC0E234CAF046C6A5D8A85395B236CC4AD2CF32A0CADBDC9DDF6:256, %% A
+ 16#20B0EB9906D0957F6C6FEACD615468DF104DE296CD8F:176>>,
+ <<16#10D9B4A3D9047D8B154359ABFB1B7F5485B04CEB868237DDC9DEDA982A679A5A:256, %% B
+ 16#919B626D4E50A8DD731B107A9962381FB5D807BF2618:176>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#120FC05D3C67A99DE161D2F4092622FECA701BE4F50F4758714E8A87BBF2A658:256, %% X(p0)
+ 16#EF8C21E7C5EFE965361F6C2999C0C247B0DBD70CE6B7:176,
+ 16#20D0AF8903A96F8D5FA2C255745D3C451B302C9346D9B7E485E7BCE41F6B591F:256, %% Y(p0)
+ 16#3E8F6ADDCBB0BC4C2F947A7DE1A89B625D6A598B3760:176>>,
+ <<16#0340340340340340340340340340340340340340340340340340340323C313FA:256, %% Order
+ 16#B50589703B5EC68D3587FEC60D161CC149C1AD4A91:168>>,
+ <<16#2760:16>> %% CoFactor
+ };
+
+curve(wtls1) ->
+ {
+ {characteristic_two_field, 113, {tpbasis,9}},
+ {<<16#01:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#01667979A40BA497E5D5C270780617:120, %% X(p0)
+ 16#00F44B4AF1ECC2630E08785CEBCC15:120>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFDBF91AF6DEA73:112>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(wtls3) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,3,6,7}},
+ {<<16#01:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8:168, %% X(p0)
+ 16#0289070FB05D38FF58321F2E800536D538CCDAA3D9:168>>, %% Y(p0)
+ <<16#04000000000000000000020108A2E0CC0D99F8A5EF:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(wtls4) ->
+ {
+ {characteristic_two_field, 113, {tpbasis,9}},
+ {<<16#3088250CA6E7C7FE649CE85820F7:112>>, %% A
+ <<16#E8BEE4D3E2260744188BE0E9C723:112>>, %% B
+ <<16#10E723AB14D696E6768756151756FEBF8FCB49A9:160>>}, %% Seed
+ <<16#04:8,
+ 16#009D73616F35F4AB1407D73562C10F:120, %% X(p0)
+ 16#00A52830277958EE84D1315ED31886:120>>, %% Y(p0)
+ <<16#0100000000000000D9CCEC8A39E56F:120>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(wtls5) ->
+ {
+ {characteristic_two_field, 163, {ppbasis,1,2,8}},
+ {<<16#072546B5435234A422E0789675F432C89435DE5242:168>>, %% A
+ <<16#C9517D06D5240D3CFF38C74B20B6CD4D6F9DD4D9:160>>, %% B
+ <<16#D2C0FB15760860DEF1EEF4D696E6768756151754:160>>}, %% Seed
+ <<16#04:8,
+ 16#07AF69989546103D79329FCC3D74880F33BBE803CB:168, %% X(p0)
+ 16#01EC23211B5966ADEA1D3F87F7EA5848AEF0B7CA9F:168>>, %% Y(p0)
+ <<16#0400000000000000000001E60FC8821CC74DAEAFC1:168>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(wtls6) ->
+ {
+ {prime_field, <<16#DB7C2ABF62E35E668076BEAD208B:112>>}, %% Prime
+ {<<16#DB7C2ABF62E35E668076BEAD2088:112>>, %% A
+ <<16#659EF8BA043916EEDE8911702B22:112>>, %% B
+ <<16#00F50B028E4D696E676875615175290472783FB1:160>>}, %% Seed
+ <<16#04:8,
+ 16#09487239995A5EE76B55F9C2F098:112, %% X(p0)
+ 16#A89CE5AF8724C0A23E0E0FF77500:112>>, %% Y(p0)
+ <<16#DB7C2ABF62E35E7628DFAC6561C5:112>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(wtls7) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73:160>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70:160>>, %% A
+ <<16#B4E134D3FB59EB8BAB57274904664D5AF50388BA:160>>, %% B
+ <<16#B99B99B099B323E02709A4D696E6768756151751:160>>}, %% Seed
+ <<16#04:8,
+ 16#52DCB034293A117E1F4FF11B30F7199D3144CE6D:160, %% X(p0)
+ 16#FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E:160>>, %% Y(p0)
+ <<16#0100000000000000000000351EE786A818F3A1A16B:168>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(wtls8) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFDE7:112>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#03:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0000000000000000000000000001:112, %% X(p0)
+ 16#0000000000000000000000000002:112>>, %% Y(p0)
+ <<16#0100000000000001ECEA551AD837E9:120>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(wtls9) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC808F:160>>}, %% Prime
+ {<<16#00:8>>, %% A
+ <<16#03:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0000000000000000000000000000000000000001:160, %% X(p0)
+ 16#0000000000000000000000000000000000000002:160>>, %% Y(p0)
+ <<16#0100000000000000000001CDC98AE0E2DE574ABF33:168>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(wtls10) ->
+ {
+ {characteristic_two_field, 233, {tpbasis,74}},
+ {<<16#00:8>>, %% A
+ <<16#01:8>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126:240, %% X(p0)
+ 16#01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3:240>>, %% Y(p0)
+ <<16#8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF:232>>, %% Order
+ <<16#04:8>> %% CoFactor
+ };
+
+curve(wtls11) ->
+ {
+ {characteristic_two_field, 233, {tpbasis,74}},
+ {<<16#01:8>>, %% A
+ <<16#66647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD:232>>, %% B
+ <<16#74D59FF07F6B413D0EA14B344B20A2DB049B50C3:160>>}, %% Seed
+ <<16#04:8,
+ 16#00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B:240, %% X(p0)
+ 16#01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052:240>>, %% Y(p0)
+ <<16#01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7:240>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(wtls12) ->
+ {
+ {prime_field, <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001:224>>}, %% Prime
+ {<<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE:224>>, %% A
+ <<16#B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4:224>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21:224, %% X(p0)
+ 16#BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34:224>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D:224>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(ipsec3) ->
+ {
+ {characteristic_two_field, 155, {tpbasis,62}},
+ {<<16#00:8>>, %% A
+ <<16#07338F:24>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#000000000000000000000000000000000000007B:160, %% X(p0)
+ 16#00000000000000000000000000000000000001C8:160>>, %% Y(p0)
+ <<16#02AAAAAAAAAAAAAAAAAAC7F3C7881BD0868FA86C:160>>, %% Order
+ <<16#03:8>> %% CoFactor
+ };
+
+curve(ipsec4) ->
+ {
+ {characteristic_two_field, 185, {tpbasis,69}},
+ {<<16#00:8>>, %% A
+ <<16#1EE9:16>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#000000000000000000000000000000000000000000000018:192, %% X(p0)
+ 16#00000000000000000000000000000000000000000000000D:192>>, %% Y(p0)
+ <<16#FFFFFFFFFFFFFFFFFFFFFFEDF97C44DB9F2420BAFCA75E:184>>, %% Order
+ <<16#02:8>> %% CoFactor
+ };
+
+curve(brainpoolP160r1) ->
+ {
+ {prime_field, <<16#E95E4A5F737059DC60DFC7AD95B3D8139515620F:160>>}, %% Prime
+ {<<16#340E7BE2A280EB74E2BE61BADA745D97E8F7C300:160>>, %% A
+ <<16#1E589A8595423412134FAA2DBDEC95C8D8675E58:160>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3:160, %% X(p0)
+ 16#1667CB477A1A8EC338F94741669C976316DA6321:160>>, %% Y(p0)
+ <<16#E95E4A5F737059DC60DF5991D45029409E60FC09:160>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP160t1) ->
+ {
+ {prime_field, <<16#E95E4A5F737059DC60DFC7AD95B3D8139515620F:160>>}, %% Prime
+ {<<16#E95E4A5F737059DC60DFC7AD95B3D8139515620C:160>>, %% A
+ <<16#7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380:160>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#B199B13B9B34EFC1397E64BAEB05ACC265FF2378:160, %% X(p0)
+ 16#ADD6718B7C7C1961F0991B842443772152C9E0AD:160>>, %% Y(p0)
+ <<16#E95E4A5F737059DC60DF5991D45029409E60FC09:160>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP192r1) ->
+ {
+ {prime_field, <<16#C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297:192>>}, %% Prime
+ {<<16#6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF:192>>, %% A
+ <<16#469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9:192>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6:192, %% X(p0)
+ 16#14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F:192>>, %% Y(p0)
+ <<16#C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP192t1) ->
+ {
+ {prime_field, <<16#C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297:192>>}, %% Prime
+ {<<16#C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294:192>>, %% A
+ <<16#13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79:192>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129:192, %% X(p0)
+ 16#097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9:192>>, %% Y(p0)
+ <<16#C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1:192>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP224r1) ->
+ {
+ {prime_field, <<16#D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF:224>>}, %% Prime
+ {<<16#68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43:224>>, %% A
+ <<16#2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B:224>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D:224, %% X(p0)
+ 16#58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD:224>>, %% Y(p0)
+ <<16#D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F:224>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP224t1) ->
+ {
+ {prime_field, <<16#D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF:224>>}, %% Prime
+ {<<16#D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC:224>>, %% A
+ <<16#4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D:224>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580:224, %% X(p0)
+ 16#0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C:224>>, %% Y(p0)
+ <<16#D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F:224>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP256r1) ->
+ {
+ {prime_field, <<16#A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377:256>>}, %% Prime
+ {<<16#7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9:256>>, %% A
+ <<16#26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6:256>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262:256, %% X(p0)
+ 16#547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997:256>>, %% Y(p0)
+ <<16#A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7:256>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP256t1) ->
+ {
+ {prime_field, <<16#A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377:256>>}, %% Prime
+ {<<16#A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374:256>>, %% A
+ <<16#662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04:256>>, %% B
+ none}, %% Seed
+ <<16#04:8,
+ 16#A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4:256, %% X(p0)
+ 16#2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE:256>>, %% Y(p0)
+ <<16#A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7:256>>, %% Order
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP320r1) ->
+ {
+ {prime_field, <<16#D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28:256, %% Prime
+ 16#FCD412B1F1B32E27:64>>},
+ {<<16#3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F4:256, %% A
+ 16#92F375A97D860EB4:64>>,
+ <<16#520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD88453981:256, %% B
+ 16#6F5EB4AC8FB1F1A6:64>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C7:256, %% X(p0)
+ 16#10AF8D0D39E20611:64,
+ 16#14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7:256, %% Y(p0)
+ 16#D35245D1692E8EE1:64>>,
+ <<16#D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E9:256, %% Order
+ 16#8691555B44C59311:64>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP320t1) ->
+ {
+ {prime_field, <<16#D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28:256, %% Prime
+ 16#FCD412B1F1B32E27:64>>},
+ {<<16#D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28:256, %% A
+ 16#FCD412B1F1B32E24:64>>,
+ <<16#A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CE:256, %% B
+ 16#B5B4FEF422340353:64>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF:256, %% X(p0)
+ 16#3357F624A21BED52:64,
+ 16#63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B:256, %% Y(p0)
+ 16#1B9BC0455FB0D2C3:64>>,
+ <<16#D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D482EC7EE8658E9:256, %% Order
+ 16#8691555B44C59311:64>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP384r1) ->
+ {
+ {prime_field, <<16#8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123:256, %% Prime
+ 16#ACD3A729901D1A71874700133107EC53:128>>},
+ {<<16#7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F:256, %% A
+ 16#8AA5814A503AD4EB04A8C7DD22CE2826:128>>,
+ <<16#04A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D5:256, %% B
+ 16#7CB4390295DBC9943AB78696FA504C11:128>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8:256, %% X(p0)
+ 16#E826E03436D646AAEF87B2E247D4AF1E:128,
+ 16#8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF9912928:256, %% Y(p0)
+ 16#0E4646217791811142820341263C5315:128>>,
+ <<16#8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7:256, %% Order
+ 16#CF3AB6AF6B7FC3103B883202E9046565:128>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP384t1) ->
+ {
+ {prime_field, <<16#8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123:256, %% Prime
+ 16#ACD3A729901D1A71874700133107EC53:128>>},
+ {<<16#8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123:256, %% A
+ 16#ACD3A729901D1A71874700133107EC50:128>>,
+ <<16#7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D:256, %% B
+ 16#2074AA263B88805CED70355A33B471EE:128>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFF:256, %% X(p0)
+ 16#C4FF191B946A5F54D8D0AA2F418808CC:128,
+ 16#25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE:256, %% Y(p0)
+ 16#469408584DC2B2912675BF5B9E582928:128>>,
+ <<16#8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7:256, %% Order
+ 16#CF3AB6AF6B7FC3103B883202E9046565:128>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP512r1) ->
+ {
+ {prime_field, <<16#AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330871:256, %% Prime
+ 16#7D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3:256>>},
+ {<<16#7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC:256, %% A
+ 16#2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA:256>>,
+ <<16#3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A7:256, %% B
+ 16#2BF2C7B9E7C1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723:256>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098E:256, %% X(p0)
+ 16#FF3B1F78E2D0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822:256,
+ 16#7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111:256, %% Y(p0)
+ 16#B2DCDE494A5F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892:256>>,
+ <<16#AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870:256, %% Order
+ 16#553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069:256>>,
+ <<16#01:8>> %% CoFactor
+ };
+
+curve(brainpoolP512t1) ->
+ {
+ {prime_field, <<16#AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330871:256, %% Prime
+ 16#7D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3:256>>},
+ {<<16#AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330871:256, %% A
+ 16#7D4D9B009BC66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0:256>>,
+ <<16#7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A6:256, %% B
+ 16#2BCDFA2304976540F6450085F2DAE145C22553B465763689180EA2571867423E:256>>,
+ none}, %% Seed
+ <<16#04:8,
+ 16#640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D:256, %% X(p0)
+ 16#82BA51735CDB3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA:256,
+ 16#5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9:256, %% Y(p0)
+ 16#D9932184BEEF216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332:256>>,
+ <<16#AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870:256, %% Order
+ 16#553E5C414CA92619418661197FAC10471DB1D381085DDADDB58796829CA90069:256>>,
+ <<16#01:8>> %% CoFactor
+ }.
diff --git a/lib/crypto/src/crypto_server.erl b/lib/crypto/src/crypto_server.erl
deleted file mode 100644
index 89650a9f06..0000000000
--- a/lib/crypto/src/crypto_server.erl
+++ /dev/null
@@ -1,68 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%% Purpose: Provide cryptographic algorithms.
-
--module(crypto_server).
-
--behaviour(gen_server).
-
--export([start_link/0]).
-
-%% Internal exports, call-back functions.
--export([init/1,handle_call/3,handle_cast/2,handle_info/2,code_change/3,
- terminate/2]).
-
-
-%%% --------------------------------------------------------
-%%% Interface Functions.
-%%% --------------------------------------------------------
-
-start_link() ->
- gen_server:start_link({local, crypto_server}, crypto_server, [], []).
-
-init([]) ->
- {ok,[]}.
-
-
-
-%%% --------------------------------------------------------
-%%% The call-back functions.
-%%% --------------------------------------------------------
-
-handle_call(_, _, State) ->
- {noreply, State}.
-
-handle_cast(_, State) ->
- {noreply, State}.
-
-handle_info(_, State) ->
- {noreply, State}.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-terminate(_Reason, _State) ->
- [].
-
-
-
-
-
-
diff --git a/lib/crypto/src/crypto_sup.erl b/lib/crypto/src/crypto_sup.erl
deleted file mode 100644
index 8ef58777ab..0000000000
--- a/lib/crypto/src/crypto_sup.erl
+++ /dev/null
@@ -1,39 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1999-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%% Purpose: Main supervisor in CRYPTO application.
-
--module(crypto_sup).
-
--behaviour(supervisor).
-
--export([start_link/0, init/1]).
-
-start_link() ->
- supervisor:start_link({local, crypto_sup}, crypto_sup, []).
-
-
-%% init([])
-%% Returns: {ok, {SupFlags, [ChildSpec]}}
-%%
-init([]) ->
- Child = {crypto_server, {crypto_server, start_link, []},
- permanent, 2000, worker, [crypto_server]},
- {ok, {{one_for_all, 10, 3600}, [Child]}}.
-
diff --git a/lib/crypto/test/crypto_SUITE.erl b/lib/crypto/test/crypto_SUITE.erl
index 42e200fcf0..d1be7cea68 100644
--- a/lib/crypto/test/crypto_SUITE.erl
+++ b/lib/crypto/test/crypto_SUITE.erl
@@ -437,7 +437,7 @@ do_generate_compute({dh, P, G}) ->
SharedSecret = crypto:compute_key(dh, UserPub, HostPriv, [P, G]).
do_compute({ecdh = Type, Pub, Priv, Curve, SharedSecret}) ->
- Secret = crypto:bytes_to_integer(crypto:compute_key(Type, Pub, Priv, Curve)),
+ Secret = crypto:compute_key(Type, Pub, Priv, Curve),
case Secret of
SharedSecret ->
ok;
@@ -445,6 +445,9 @@ do_compute({ecdh = Type, Pub, Priv, Curve, SharedSecret}) ->
ct:fail({{crypto, compute_key, [Type, Pub, Priv, Curve]}, {expected, SharedSecret}, {got, Other}})
end.
+hexstr2point(X, Y) ->
+ <<4:8, (hexstr2bin(X))/binary, (hexstr2bin(Y))/binary>>.
+
hexstr2bin(S) ->
list_to_binary(hexstr2list(S)).
@@ -668,7 +671,7 @@ group_config(srp, Config) ->
GenerateCompute = [srp3(), srp6(), srp6a()],
[{generate_compute, GenerateCompute} | Config];
group_config(ecdh, Config) ->
- Compute = [ecdh()],
+ Compute = ecdh(),
[{compute, Compute} | Config];
group_config(dh, Config) ->
GenerateCompute = [dh()],
@@ -1498,9 +1501,89 @@ srp(ClientPrivate, Generator, Prime, Version, Verifier, ServerPublic, ServerPriv
{host, [Verifier, Prime, Version, Scrambler]},
SessionKey}.
ecdh() ->
- {ecdh, 10053111454769593468622878414300213417816614162107065345116848162553478019161427871683337786549966,
- 1373339791687564785573162818422814591820885704654,
- secp160r1, 990333295438215762119481641129490894973766052278}.
+ %% http://csrc.nist.gov/groups/STM/cavp/
+ [{ecdh, hexstr2point("42ea6dd9969dd2a61fea1aac7f8e98edcc896c6e55857cc0", "dfbe5d7c61fac88b11811bde328e8a0d12bf01a9d204b523"),
+ hexstr2bin("f17d3fea367b74d340851ca4270dcb24c271f445bed9d527"),
+ secp192r1,
+ hexstr2bin("803d8ab2e5b6e6fca715737c3a82f7ce3c783124f6d51cd0")},
+ {ecdh, hexstr2point("deb5712fa027ac8d2f22c455ccb73a91e17b6512b5e030e7", "7e2690a02cc9b28708431a29fb54b87b1f0c14e011ac2125"),
+ hexstr2bin("56e853349d96fe4c442448dacb7cf92bb7a95dcf574a9bd5"),
+ secp192r1,
+ hexstr2bin("c208847568b98835d7312cef1f97f7aa298283152313c29d")},
+ {ecdh, hexstr2point("af33cd0629bc7e996320a3f40368f74de8704fa37b8fab69abaae280", "882092ccbba7930f419a8a4f9bb16978bbc3838729992559a6f2e2d7"),
+ hexstr2bin("8346a60fc6f293ca5a0d2af68ba71d1dd389e5e40837942df3e43cbd"),
+ secp224r1,
+ hexstr2bin("7d96f9a3bd3c05cf5cc37feb8b9d5209d5c2597464dec3e9983743e8")},
+ {ecdh, hexstr2point("13bfcd4f8e9442393cab8fb46b9f0566c226b22b37076976f0617a46", "eeb2427529b288c63c2f8963c1e473df2fca6caa90d52e2f8db56dd4"),
+ hexstr2bin("043cb216f4b72cdf7629d63720a54aee0c99eb32d74477dac0c2f73d"),
+ secp224r1,
+ hexstr2bin("ee93ce06b89ff72009e858c68eb708e7bc79ee0300f73bed69bbca09")},
+ {ecdh, hexstr2point("700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287", "db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac"),
+ hexstr2bin("7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534"),
+ secp256r1,
+ hexstr2bin("46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b")},
+ {ecdh, hexstr2point("809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae", "b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3"),
+ hexstr2bin("38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5"),
+ secp256r1,
+ hexstr2bin("057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67")},
+ {ecdh, hexstr2point("a7c76b970c3b5fe8b05d2838ae04ab47697b9eaf52e764592efda27fe7513272734466b400091adbf2d68c58e0c50066", "ac68f19f2e1cb879aed43a9969b91a0839c4c38a49749b661efedf243451915ed0905a32b060992b468c64766fc8437a"),
+ hexstr2bin("3cc3122a68f0d95027ad38c067916ba0eb8c38894d22e1b15618b6818a661774ad463b205da88cf699ab4d43c9cf98a1"),
+ secp384r1,
+ hexstr2bin("5f9d29dc5e31a163060356213669c8ce132e22f57c9a04f40ba7fcead493b457e5621e766c40a2e3d4d6a04b25e533f1")},
+ {ecdh, hexstr2point("30f43fcf2b6b00de53f624f1543090681839717d53c7c955d1d69efaf0349b7363acb447240101cbb3af6641ce4b88e0", "25e46c0c54f0162a77efcc27b6ea792002ae2ba82714299c860857a68153ab62e525ec0530d81b5aa15897981e858757"),
+ hexstr2bin("92860c21bde06165f8e900c687f8ef0a05d14f290b3f07d8b3a8cc6404366e5d5119cd6d03fb12dc58e89f13df9cd783"),
+ secp384r1,
+ hexstr2bin("a23742a2c267d7425fda94b93f93bbcc24791ac51cd8fd501a238d40812f4cbfc59aac9520d758cf789c76300c69d2ff")},
+ {ecdh, hexstr2point("00685a48e86c79f0f0875f7bc18d25eb5fc8c0b07e5da4f4370f3a9490340854334b1e1b87fa395464c60626124a4e70d0f785601d37c09870ebf176666877a2046d", "01ba52c56fc8776d9e8f5db4f0cc27636d0b741bbe05400697942e80b739884a83bde99e0f6716939e632bc8986fa18dccd443a348b6c3e522497955a4f3c302f676"),
+ hexstr2bin("017eecc07ab4b329068fba65e56a1f8890aa935e57134ae0ffcce802735151f4eac6564f6ee9974c5e6887a1fefee5743ae2241bfeb95d5ce31ddcb6f9edb4d6fc47"),
+ secp521r1,
+ hexstr2bin("005fc70477c3e63bc3954bd0df3ea0d1f41ee21746ed95fc5e1fdf90930d5e136672d72cc770742d1711c3c3a4c334a0ad9759436a4d3c5bf6e74b9578fac148c831")},
+ {ecdh, hexstr2point("01df277c152108349bc34d539ee0cf06b24f5d3500677b4445453ccc21409453aafb8a72a0be9ebe54d12270aa51b3ab7f316aa5e74a951c5e53f74cd95fc29aee7a", "013d52f33a9f3c14384d1587fa8abe7aed74bc33749ad9c570b471776422c7d4505d9b0a96b3bfac041e4c6a6990ae7f700e5b4a6640229112deafa0cd8bb0d089b0"),
+ hexstr2bin("00816f19c1fb10ef94d4a1d81c156ec3d1de08b66761f03f06ee4bb9dcebbbfe1eaa1ed49a6a990838d8ed318c14d74cc872f95d05d07ad50f621ceb620cd905cfb8"),
+ secp521r1,
+ hexstr2bin("000b3920ac830ade812c8f96805da2236e002acbbf13596a9ab254d44d0e91b6255ebf1229f366fb5a05c5884ef46032c26d42189273ca4efa4c3db6bd12a6853759")},
+
+ %% RFC-6954, Appendix A
+ {ecdh, hexstr2point("A9C21A569759DA95E0387041184261440327AFE33141CA04B82DC92E",
+ "98A0F75FBBF61D8E58AE5511B2BCDBE8E549B31E37069A2825F590C1"),
+ hexstr2bin("6060552303899E2140715816C45B57D9B42204FB6A5BF5BEAC10DB00"),
+ brainpoolP224r1,
+ hexstr2bin("1A4BFE705445120C8E3E026699054104510D119757B74D5FE2462C66")},
+ {ecdh, hexstr2point("034A56C550FF88056144E6DD56070F54B0135976B5BF77827313F36B",
+ "75165AD99347DC86CAAB1CBB579E198EAF88DC35F927B358AA683681"),
+ hexstr2bin("39F155483CEE191FBECFE9C81D8AB1A03CDA6790E7184ACE44BCA161"),
+ brainpoolP224r1,
+ hexstr2bin("1A4BFE705445120C8E3E026699054104510D119757B74D5FE2462C66")},
+ {ecdh, hexstr2point("44106E913F92BC02A1705D9953A8414DB95E1AAA49E81D9E85F929A8E3100BE5",
+ "8AB4846F11CACCB73CE49CBDD120F5A900A69FD32C272223F789EF10EB089BDC"),
+ hexstr2bin("55E40BC41E37E3E2AD25C3C6654511FFA8474A91A0032087593852D3E7D76BD3"),
+ brainpoolP256r1,
+ hexstr2bin("89AFC39D41D3B327814B80940B042590F96556EC91E6AE7939BCE31F3A18BF2B")},
+ {ecdh, hexstr2point("8D2D688C6CF93E1160AD04CC4429117DC2C41825E1E9FCA0ADDD34E6F1B39F7B",
+ "990C57520812BE512641E47034832106BC7D3E8DD0E4C7F1136D7006547CEC6A"),
+ hexstr2bin("81DB1EE100150FF2EA338D708271BE38300CB54241D79950F77B063039804F1D"),
+ brainpoolP256r1,
+ hexstr2bin("89AFC39D41D3B327814B80940B042590F96556EC91E6AE7939BCE31F3A18BF2B")},
+ {ecdh, hexstr2point("68B665DD91C195800650CDD363C625F4E742E8134667B767B1B476793588F885AB698C852D4A6E77A252D6380FCAF068",
+ "55BC91A39C9EC01DEE36017B7D673A931236D2F1F5C83942D049E3FA20607493E0D038FF2FD30C2AB67D15C85F7FAA59"),
+ hexstr2bin("032640BC6003C59260F7250C3DB58CE647F98E1260ACCE4ACDA3DD869F74E01F8BA5E0324309DB6A9831497ABAC96670"),
+ brainpoolP384r1,
+ hexstr2bin("0BD9D3A7EA0B3D519D09D8E48D0785FB744A6B355E6304BC51C229FBBCE239BBADF6403715C35D4FB2A5444F575D4F42")},
+ {ecdh, hexstr2point("4D44326F269A597A5B58BBA565DA5556ED7FD9A8A9EB76C25F46DB69D19DC8CE6AD18E404B15738B2086DF37E71D1EB4",
+ "62D692136DE56CBE93BF5FA3188EF58BC8A3A0EC6C1E151A21038A42E9185329B5B275903D192F8D4E1F32FE9CC78C48"),
+ hexstr2bin("1E20F5E048A5886F1F157C74E91BDE2B98C8B52D58E5003D57053FC4B0BD65D6F15EB5D1EE1610DF870795143627D042"),
+ brainpoolP384r1,
+ hexstr2bin("0BD9D3A7EA0B3D519D09D8E48D0785FB744A6B355E6304BC51C229FBBCE239BBADF6403715C35D4FB2A5444F575D4F42")},
+ {ecdh, hexstr2point("0A420517E406AAC0ACDCE90FCD71487718D3B953EFD7FBEC5F7F27E28C6149999397E91E029E06457DB2D3E640668B392C2A7E737A7F0BF04436D11640FD09FD",
+ "72E6882E8DB28AAD36237CD25D580DB23783961C8DC52DFA2EC138AD472A0FCEF3887CF62B623B2A87DE5C588301EA3E5FC269B373B60724F5E82A6AD147FDE7"),
+ hexstr2bin("230E18E1BCC88A362FA54E4EA3902009292F7F8033624FD471B5D8ACE49D12CFABBC19963DAB8E2F1EBA00BFFB29E4D72D13F2224562F405CB80503666B25429"),
+ brainpoolP512r1,
+ hexstr2bin("A7927098655F1F9976FA50A9D566865DC530331846381C87256BAF3226244B76D36403C024D7BBF0AA0803EAFF405D3D24F11A9B5C0BEF679FE1454B21C4CD1F")},
+ {ecdh, hexstr2point("9D45F66DE5D67E2E6DB6E93A59CE0BB48106097FF78A081DE781CDB31FCE8CCBAAEA8DD4320C4119F1E9CD437A2EAB3731FA9668AB268D871DEDA55A5473199F",
+ "2FDC313095BCDD5FB3A91636F07A959C8E86B5636A1E930E8396049CB481961D365CC11453A06C719835475B12CB52FC3C383BCE35E27EF194512B71876285FA"),
+ hexstr2bin("16302FF0DBBB5A8D733DAB7141C1B45ACBC8715939677F6A56850A38BD87BD59B09E80279609FF333EB9D4C061231FB26F92EEB04982A5F1D1764CAD57665422"),
+ brainpoolP512r1,
+ hexstr2bin("A7927098655F1F9976FA50A9D566865DC530331846381C87256BAF3226244B76D36403C024D7BBF0AA0803EAFF405D3D24F11A9B5C0BEF679FE1454B21C4CD1F")}].
dh() ->
{dh, 0087761979513264537414556992123116644042638206717762626089877284926656954974893442000747478454809111207351620687968672207938731607963470779396984752680274820156266685080223616226905101126463253150237669547023934604953898814222890239130021414026118792251620881355456432549881723310342870016961804255746630219, 2}.
diff --git a/lib/debugger/priv/erlang_bug.png b/lib/debugger/priv/erlang_bug.png
index 87c8279654..200f531484 100644
--- a/lib/debugger/priv/erlang_bug.png
+++ b/lib/debugger/priv/erlang_bug.png
Binary files differ
diff --git a/lib/debugger/src/Makefile b/lib/debugger/src/Makefile
index 85754da219..90189dd297 100644
--- a/lib/debugger/src/Makefile
+++ b/lib/debugger/src/Makefile
@@ -45,20 +45,6 @@ MODULES= \
dbg_iload \
dbg_iserver \
dbg_istk \
- dbg_ui_break \
- dbg_ui_break_win \
- dbg_ui_edit \
- dbg_ui_edit_win \
- dbg_ui_filedialog_win \
- dbg_ui_interpret \
- dbg_ui_mon \
- dbg_ui_mon_win \
- dbg_ui_settings \
- dbg_ui_trace \
- dbg_ui_trace_win \
- dbg_ui_view \
- dbg_ui_win \
- dbg_ui_winman \
dbg_wx_break \
dbg_wx_break_win \
dbg_wx_code \
diff --git a/lib/debugger/src/dbg_ieval.erl b/lib/debugger/src/dbg_ieval.erl
index 6ce3262ed2..14a17fe304 100644
--- a/lib/debugger/src/dbg_ieval.erl
+++ b/lib/debugger/src/dbg_ieval.erl
@@ -712,23 +712,25 @@ expr({'if',Line,Cs}, Bs, Ieval) ->
if_clauses(Cs, Bs, Ieval#ieval{line=Line});
%% Andalso/orelse
-expr({'andalso',Line,E1,E2}, Bs, Ieval) ->
- case expr(E1, Bs, Ieval#ieval{line=Line, top=false}) of
- {value,false,_}=Res ->
- Res;
- {value,true,_} ->
- expr(E2, Bs, Ieval#ieval{line=Line, top=false});
- {value,Val,Bs} ->
- exception(error, {badarg,Val}, Bs, Ieval)
+expr({'andalso',Line,E1,E2}, Bs0, Ieval) ->
+ case expr(E1, Bs0, Ieval#ieval{line=Line, top=false}) of
+ {value,false,_}=Res ->
+ Res;
+ {value,true,Bs} ->
+ {value,Val,_} = expr(E2, Bs, Ieval#ieval{line=Line, top=false}),
+ {value,Val,Bs};
+ {value,Val,Bs} ->
+ exception(error, {badarg,Val}, Bs, Ieval)
end;
-expr({'orelse',Line,E1,E2}, Bs, Ieval) ->
- case expr(E1, Bs, Ieval#ieval{line=Line, top=false}) of
- {value,true,_}=Res ->
- Res;
- {value,false,_} ->
- expr(E2, Bs, Ieval#ieval{line=Line, top=false});
- {value,Val,_} ->
- exception(error, {badarg,Val}, Bs, Ieval)
+expr({'orelse',Line,E1,E2}, Bs0, Ieval) ->
+ case expr(E1, Bs0, Ieval#ieval{line=Line, top=false}) of
+ {value,true,_}=Res ->
+ Res;
+ {value,false,Bs} ->
+ {value,Val,_} = expr(E2, Bs, Ieval#ieval{line=Line, top=false}),
+ {value,Val,Bs};
+ {value,Val,Bs} ->
+ exception(error, {badarg,Val}, Bs, Ieval)
end;
%% Matching expression
diff --git a/lib/debugger/src/dbg_ui_break.erl b/lib/debugger/src/dbg_ui_break.erl
deleted file mode 100644
index 8b9a236ce7..0000000000
--- a/lib/debugger/src/dbg_ui_break.erl
+++ /dev/null
@@ -1,98 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_break).
-
-%% External exports
--export([start/3, start/4, start/5]).
-
-%% Internal exports
--export([init/5]).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(GS, Pos, Type)
-%% start(GS, Pos, Type, Module, Line)
-%% GS = graphics system identifier
-%% Pos = {X, Y}
-%% X = Y = integer()
-%% Type = line | conditional | function
-%% Module = atom()
-%% Line = integer()
-%%--------------------------------------------------------------------
-start(GS, Pos, Type) ->
- start(GS, Pos, Type, "", "").
-start(GS, Pos, Type, Mod) ->
- start(GS, Pos, Type, Mod, "").
-start(GS, Pos, Type, Mod, Line) ->
- spawn_link(?MODULE, init, [GS, Pos, Type, Mod, Line]).
-
-
-%%====================================================================
-%% Internal exports
-%%====================================================================
-
-init(GS, Pos, Type, Mod, Line) ->
- Win = dbg_ui_break_win:create_win(GS, Pos, Type, Mod, Line),
- if
- Type==function, is_atom(Mod) ->
- Win2 = gui_cmd({module, Mod}, Win),
- loop(Win2);
- true ->
- loop(Win)
- end.
-
-loop(Win) ->
- receive
-
- %% From the GUI
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd = dbg_ui_break_win:handle_event(GuiEvent, Win),
- Win2 = gui_cmd(Cmd, Win),
- loop(Win2)
- end.
-
-gui_cmd(ignore, Win) ->
- Win;
-gui_cmd(stopped, _Win) ->
- exit(normal);
-gui_cmd({win, Win2}, _Win) ->
- Win2;
-gui_cmd({module, Mod}, Win) ->
- Funcs = int:functions(Mod),
- dbg_ui_break_win:update_functions(Win, Funcs);
-gui_cmd({break, DataL, Action}, _Win) ->
- Fun =
- fun(Data) ->
- case Data of
- [Mod, Line] ->
- int:break(Mod, Line),
- int:action_at_break(Mod, Line, Action);
- [Mod, Line, CMod, CFunc] ->
- int:break(Mod, Line),
- int:test_at_break(Mod, Line, {CMod, CFunc}),
- int:action_at_break(Mod, Line, Action);
- [Mod, Func, Arity] ->
- int:break_in(Mod, Func, Arity)
- end
- end,
- lists:foreach(Fun, DataL),
- exit(normal).
diff --git a/lib/debugger/src/dbg_ui_break_win.erl b/lib/debugger/src/dbg_ui_break_win.erl
deleted file mode 100644
index 11d810ccab..0000000000
--- a/lib/debugger/src/dbg_ui_break_win.erl
+++ /dev/null
@@ -1,314 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_break_win).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,entry,2}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,radiobutton,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-%% External exports
--export([create_win/5,
- update_functions/2,
- handle_event/2]).
-
--record(winInfo, {type, % line | conditional | function
- win, % gsobj()
- packer, % gsobj() | undefined
- entries, % [{atom|integer, GSobj()}]
- trigger, % enable | disable | delete
- ok, % gsobj()
- cancel, % gsobj()
- listbox, % gsobj()
- funcs=[] % [[Name, Arity]]
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% create_win(GS, Pos, Type, Mod, Line) -> #winInfo{}
-%% GS = graphics system identifier
-%% Pos = {X, Y}
-%% X = Y = integer()
-%% Type = line | conditional | function
-%% Mod = atom() | ""
-%% Line = integer() | ""
-%%--------------------------------------------------------------------
-create_win(GS, {X, Y}, function, Mod, _Line) ->
- Pad = 8,
- W = 230,
-
- Font = dbg_ui_win:font(normal),
-
- %% Window
- Win = gs:window(GS, [{title, "Function Break"}, {x, X}, {y, Y},
- {destroy, true}, {configure, true},
- {keypress, true}, {data, window}]),
-
- %% Frame
- Frm = gs:frame(Win, [{x, 0}, {y, 0}, {width, W}, {height, 190},
- {packer_x, [{fixed, 70}, {stretch, 1, W-80},
- {fixed, 10}]},
- {packer_y, [{fixed, 10}, {fixed, 30},
- {stretch, 1, 100}, {fixed, 40}]}]),
-
- %% Create input field (label+entry)
- gs:label(Frm, [{label, {text,"Module:"}}, {font, Font}, {align, e},
- {pack_x, 1}, {pack_y, 2}]),
- Ent = gs:entry(Frm, [{text, Mod},
- {pack_x, 2}, {pack_y, 2},
- {keypress, true}, {setfocus, true},
- {buttonpress, true}]),
- Entries = [{Ent, atom}],
-
- %% Create a listbox containing the functions of the module
- gs:label(Frm, [{label, {text,"Function:"}}, {font, Font}, {align, ne},
- {pack_x, 1}, {pack_y, 3}]),
- Lb = gs:listbox(Frm, [{bw, 2}, {relief, ridge}, {vscroll, right},
- {pack_x, 2}, {pack_y, 3},
- {selectmode, multiple}]),
-
- %% Add OK and Cancel buttons
- {Wbtn, Hbtn} = dbg_ui_win:min_size(["OK","Cancel"], 70, 30),
- Bot = gs:frame(Frm, [{pack_x, {1, 3}}, {pack_y, 4}]),
- OK = gs:button(Bot, [{x, Pad}, {y, Pad},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"OK"}}, {font, Font}]),
- Cancel = gs:button(Bot, [{x, W-Pad-Wbtn}, {y, Pad},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"Cancel"}}, {font, Font}]),
-
- Wfrm = gs:read(Frm, width), Hfrm = gs:read(Frm, height),
- gs:config(Win, [{width, Wfrm}, {height, Hfrm}, {map, true}]),
- #winInfo{type=function, win=Win,
- packer=Frm, entries=Entries, trigger=enable,
- ok=OK, cancel=Cancel, listbox=Lb, funcs=[]};
-create_win(GS, {X, Y}, Type, Mod, Line) ->
- Pad = 8,
- W = 230,
-
- Font = dbg_ui_win:font(normal),
-
- %% Window
- Title = case Type of
- line -> "Line Break";
- conditional -> "Conditional Break"
- end,
- Win = gs:window(GS, [{title, Title}, {x, X}, {y, Y},
- {destroy, true}]),
-
- %% Create input fields (label+entry)
- {Wlbl, Hlbl} = dbg_ui_win:min_size(["C-Function:"], 10, 30),
- Went = W-Wlbl-2*Pad,
- Labels = case Type of
- line ->
- [{atom,"Module:",Mod}, {integer,"Line:",Line}];
- conditional ->
- [{atom,"Module:",Mod}, {integer,"Line:",Line},
- {atom,"C-Module:",""}, {atom,"C-Function:",""}]
- end,
- Fun = fun({DataType, Label, Default}, Yin) ->
- gs:create(label, Win, [{x, Pad}, {y, Yin},
- {width,Wlbl}, {height,Hlbl},
- {label, {text,Label}},
- {font, Font}, {align, e}]),
- Ent = gs:create(entry, Win, [{x, Pad+Wlbl}, {y, Yin},
- {width, Went},
- {height, Hlbl},
- {text, Default},
- {keypress, true}]),
- {{Ent, DataType}, Yin+Hlbl}
- end,
- {Entries, Yacc} = lists:mapfoldl(Fun, Pad, Labels),
- {First, _DataType} = hd(Entries),
- gs:config(First, [{buttonpress, true}, {setfocus, true}]),
-
- %% Add 'trigger action' buttons
- {Wlbl2, Hlbl2} = dbg_ui_win:min_size(["Trigger Action"], 100, 20),
- Wfrm = Wlbl2+8, Hfrm = Hlbl2*4+4,
- Grp = erlang:now(),
- Frm = gs:frame(Win, [{x, W/2-Wfrm/2-2}, {y, Yacc+Pad-2},
- {width, Wfrm}, {height, Hfrm}, {bw, 2}]),
- gs:label(Frm, [{label, {text, "Trigger Action"}}, {font, Font},
- {x, 2}, {y, 0}, {width, Wlbl2}, {height, Hlbl2}]),
- gs:radiobutton(Frm, [{label, {text, "Enable"}}, {font, Font},
- {x, 10}, {y, Hlbl2},
- {width, Wlbl2-10}, {height, Hlbl2},
- {align, w}, {group, Grp},
- {data, {trigger, enable}},
- {select, true}]),
- gs:radiobutton(Frm, [{label, {text, "Disable"}}, {font, Font},
- {x, 10}, {y, Hlbl2*2},
- {width, Wlbl2-10}, {height, Hlbl2},
- {align, w}, {group, Grp},
- {data, {trigger, disable}}]),
- gs:radiobutton(Frm, [{label, {text, "Delete"}}, {font, Font},
- {x, 10}, {y, Hlbl2*3},
- {width, Wlbl2-10}, {height, Hlbl2},
- {align, w}, {group, Grp},
- {data, {trigger, delete}}]),
-
- %% Add OK and Cancel buttons
- {Wbtn, Hbtn} = dbg_ui_win:min_size(["OK","Cancel"], 70, 30),
- Ybtn = Yacc + Pad + Hfrm + Pad,
- OK = gs:button(Win, [{x, Pad}, {y, Ybtn},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"OK"}}, {font, Font}]),
- gs:button(Win, [{x, W-Pad-Wbtn}, {y, Ybtn},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"Cancel"}}, {font, Font}]),
-
- Hwin = Ybtn + Hbtn + Pad,
- gs:config(Win, [{width, W}, {height, Hwin}, {map, true}]),
-
- #winInfo{type=Type, win=Win,
- entries=Entries, trigger=enable, ok=OK}.
-
-%%--------------------------------------------------------------------
-%% update_functions(WinInfo, Funcs) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Funcs = [{Name, Arity}]
-%% Name = atom()
-%% Arity = integer()
-%%--------------------------------------------------------------------
-update_functions(WinInfo, Funcs) ->
- Items = lists:map(fun([N, A]) -> io_lib:format("~p/~p", [N, A]) end,
- Funcs),
- gs:config(WinInfo#winInfo.listbox, [{items, Items},
- {setfocus, true}]),
- WinInfo#winInfo{funcs=Funcs}.
-
-%%--------------------------------------------------------------------
-%% handle_event(GSEvent, WinInfo) -> Command
-%% GSEvent = {gs, Id, Event, Data, Arg}
-%% WinInfo = #winInfo{}
-%% Command = ignore
-%% | stopped
-%% | {win, WinInfo}
-%% | {module, Mod}
-%% | {break, [[Mod, Line]], Action}
-%% | {break, [[Mod, Line, CMod, CFunc]], Action}
-%% | {break, [[Mod, Func, Arity]], Action}
-%%--------------------------------------------------------------------
-handle_event({gs, _Id, destroy, _Data, _Arg}, _WinInfo) ->
- stopped;
-handle_event({gs, _Id, configure, _Data, [W, H|_]}, WinInfo) ->
- gs:config(WinInfo#winInfo.packer, [{width, W-10}, {height, H-10}]),
- gs:config(WinInfo#winInfo.cancel, [{x, W-80}]),
- ignore;
-handle_event({gs, Ent, buttonpress, _,[N,X0,Y0|_]}, WinInfo) when N>1 ->
- %% Right (middle) mouse button click in module entry, display a
- %% menu containing all interpreted modules
- Mods = int:interpreted(),
- X = gs:read(Ent, x) + X0,
- Y = gs:read(Ent, y) + Y0,
- Menu = gs:menu(WinInfo#winInfo.win, [{post_at,{X,Y}}]),
- lists:foreach(fun(Mod) ->
- gs:menuitem(Menu, [{label,{text,Mod}},
- {data,{module,Mod}}])
- end,
- Mods),
- ignore;
-handle_event({gs, LB, keypress, window, [Key|_]}, WinInfo) ->
- %% Used for functional break window, since listboxes for some
- %% reason doesn't generate keypress events
- if
- Key/='Tab', Key/='Return' ->
- ignore;
- true ->
- handle_event({gs, LB, click, listbox, ["OK"]}, WinInfo)
- end;
-handle_event({gs, Ent, keypress, Data, [Key|_]}, WinInfo) ->
- case WinInfo#winInfo.type of
- function when Key/='Tab', Key/='Return' ->
- case gs:read(WinInfo#winInfo.listbox, items) of
- [] -> ignore;
- _Items ->
- gs:config(WinInfo#winInfo.listbox, clear),
- {win, WinInfo#winInfo{funcs=[]}}
- end;
- function -> % 'Return' | 'Tab' pressed in Module entry
- case check_input(WinInfo#winInfo.entries) of
- error -> ignore;
- [Mod] -> {module, Mod}
- end;
- _Type when Key=='Tab'; Key=='Return' ->
- case next_entry(Ent, WinInfo#winInfo.entries) of
- last ->
- gs:config(WinInfo#winInfo.ok, flash),
- handle_event({gs, Ent, click, Data, ["OK"]}, WinInfo);
- Next ->
- gs:config(Next, {setfocus, true}),
- ignore
- end;
- _Type -> ignore
- end;
-handle_event({gs, _Id, click, _Data, ["OK"|_]}, WinInfo) ->
- case check_input(WinInfo#winInfo.entries) of
- error -> ignore;
- Data when WinInfo#winInfo.type/=function ->
- {break, [Data], WinInfo#winInfo.trigger};
- [Mod] -> % Function break window
- case gs:read(WinInfo#winInfo.listbox, selection) of
- [] ->
- {module, Mod};
- IndexL ->
- Funcs = WinInfo#winInfo.funcs,
- Breaks =
- [[Mod|lists:nth(Index+1, Funcs)] || Index <- IndexL],
- {break, Breaks, enable}
- end
- end;
-handle_event({gs, _Id, click, _Data, ["Cancel"|_]}, _WinInfo) ->
- stopped;
-handle_event({gs, _Id, click, {trigger,Trigger}, _Arg}, WinInfo) ->
- {win, WinInfo#winInfo{trigger=Trigger}};
-handle_event({gs, _Id, click, {module, Mod}, _Arg}, WinInfo) ->
- {Ent, _DataType} = hd(WinInfo#winInfo.entries),
- gs:config(Ent, {insert,{0,Mod}}),
- ignore;
-handle_event(_GSEvent, _WinInfo) ->
- ignore.
-
-check_input(Entries) ->
- check_input(Entries, []).
-check_input([{Entry, Type} | Entries], Data) ->
- Str = gs:read(Entry, text),
- case erl_scan:string(Str) of
- {ok, [{Type, _Line, Val}], _EndLine} ->
- check_input(Entries, [Val|Data]);
- _Error -> error
- end;
-check_input([], Data) -> lists:reverse(Data).
-
-next_entry(Entry, [{Entry, _Type}]) ->
- last;
-next_entry(Entry, [{Entry, _Type1}, {Next, _Type2}|_]) ->
- Next;
-next_entry(Entry, [_|Entries]) ->
- next_entry(Entry, Entries).
diff --git a/lib/debugger/src/dbg_ui_edit.erl b/lib/debugger/src/dbg_ui_edit.erl
deleted file mode 100644
index 390e6acdb4..0000000000
--- a/lib/debugger/src/dbg_ui_edit.erl
+++ /dev/null
@@ -1,91 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_edit).
-
-%% External exports
--export([start/5]).
-
-%% Internal exports
--export([init/6]).
-
--record(state, {win, % term() Edit dialog window data
- pid, % pid() Parent
- prompt % atom()
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(GS, Pos, Title, Prompt, {Type, Value})
-%% GS = graphics system identifier
-%% Pos = {X, Y}
-%% X = Y = integer()
-%% Title = string()
-%% Prompt = atom()
-%% Type = term | atom | float | integer | string
-%% Value = term()
-%%--------------------------------------------------------------------
-start(GS, Pos, Title, Prompt, Edit) ->
- case dbg_ui_winman:is_started(Title) of
- true -> ignore;
- false ->
- spawn(?MODULE, init, [self(), GS, Pos, Title, Prompt, Edit])
- end.
-
-
-%%====================================================================
-%% Internal exports
-%%====================================================================
-
-init(Pid, GS, Pos, Title, Prompt, Edit) ->
-
- %% Create edit dialog window
- Win = dbg_ui_edit_win:create_win(GS, Pos, Title, Prompt, Edit),
- Window = dbg_ui_edit_win:get_window(Win),
- dbg_ui_winman:insert(Title, Window),
- State = #state{win=Win, pid=Pid, prompt=Prompt},
-
- loop(State).
-
-loop(State) ->
- receive
-
- %% From the GUI
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd = dbg_ui_edit_win:handle_event(GuiEvent,
- State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, _Data} ->
- loop(State);
- {dbg_ui_winman, destroy} ->
- exit(normal)
- end.
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd(stopped, _State) ->
- exit(normal);
-gui_cmd({edit, Value}, State) ->
- State#state.pid ! {dbg_ui_edit, State#state.prompt, Value},
- exit(normal).
diff --git a/lib/debugger/src/dbg_ui_edit_win.erl b/lib/debugger/src/dbg_ui_edit_win.erl
deleted file mode 100644
index 2e9a685b57..0000000000
--- a/lib/debugger/src/dbg_ui_edit_win.erl
+++ /dev/null
@@ -1,128 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_edit_win).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-%% External exports
--export([create_win/5, get_window/1,
- handle_event/2]).
-
--record(winInfo, {window, % gsobj()
- entry, % gsobj()
- button, % gsobj()
- type % atom()
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% create_win(GS, Pos, Title, Prompt, {Type, Value}) -> #winInfo{}
-%% GS = graphics system identifier
-%% Pos = {X, Y}
-%% X = Y = integer()
-%% Title = string()
-%% Prompt = atom()
-%% Type = term | atom | float | integer | string
-%% Value = term()
-%%--------------------------------------------------------------------
-create_win(GS, {X, Y}, Title, Prompt, {Type, Value}) ->
- Pad=8,
-
- Font = dbg_ui_win:font(normal),
-
- %% Window
- Win = gs:window(GS, [{title, Title}, {x, X}, {y, Y},
- {destroy, true}]),
-
- %% Label
- {Wlbl, Hlbl} = dbg_ui_win:min_size([Prompt], 50, 30),
- gs:label(Win, [{x, Pad}, {y, Pad}, {width, Wlbl}, {height, Hlbl},
- {align, e}, {label, {text, Prompt}}, {font, Font}]),
-
-
- %% Entry
- {Went, _Hent} = dbg_ui_win:min_size([Value], 100, 20),
- Ent = gs:entry(Win, [{x, Pad+Wlbl}, {y, Pad},
- {width, Went}, {height, Hlbl},
- {text, Value},
- {keypress, true}]),
-
- %% OK and Cancel buttons
- W = Pad + Wlbl + Went + Pad,
- {Wbtn, Hbtn} = dbg_ui_win:min_size(["Cancel"], 70, 30),
- Ybtn = Pad + Hlbl + Pad,
- Btn = gs:button(Win, [{x, Pad}, {y, Ybtn},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"OK"}}, {font, Font}]),
- gs:button(Win, [{x, W-Pad-Wbtn}, {y, Ybtn},
- {width, Wbtn}, {height, Hbtn},
- {label, {text,"Cancel"}}, {font, Font}]),
-
- H = Ybtn + Hbtn + Pad,
- gs:config(Win, [{width, W}, {height, H}, {map, true}]),
-
- #winInfo{window=Win, entry=Ent, button=Btn, type=Type}.
-
-%%--------------------------------------------------------------------
-%% get_window(WinInfo) -> Window
-%% WinInfo = #winInfo{}
-%% Window = gsobj()
-%%--------------------------------------------------------------------
-get_window(WinInfo) ->
- WinInfo#winInfo.window.
-
-%%--------------------------------------------------------------------
-%% handle_event(GSEvent, WinInfo) -> Command
-%% GSEvent = {gs, Id, Event, Data, Arg}
-%% WinInfo = #winInfo{}
-%% Command = ignore
-%% | stopped
-%% | {edit, Value}
-%%--------------------------------------------------------------------
-handle_event({gs, _Id, destroy, _Data, _Arg}, _WinInfo) ->
- stopped;
-handle_event({gs, Id, keypress, Data, ['Return'|_]}, WinInfo) ->
- gs:config(WinInfo#winInfo.button, flash),
- handle_event({gs, Id, click, Data, ["OK"]}, WinInfo);
-handle_event({gs, _Id, click, _Data, ["OK"|_]}, WinInfo) ->
- Ent = WinInfo#winInfo.entry,
- Str = gs:read(Ent, text),
- Type = WinInfo#winInfo.type,
- case erl_scan:string(Str) of
- {ok, Tokens, _EndLine} when Type==term ->
- case erl_parse:parse_term(Tokens++[{dot, 1}]) of
- {ok, Value} -> {edit, Value};
- _Error -> ignore
- end;
- {ok, [{Type, _Line, Value}], _EndLine} when Type/=term ->
- {edit, Value};
- _ ->
- ignore
- end;
-handle_event({gs, _Id, click, _Data, ["Cancel"|_]}, _WinInfo) ->
- stopped;
-handle_event(_GSEvent, _WinInfo) ->
- ignore.
diff --git a/lib/debugger/src/dbg_ui_filedialog_win.erl b/lib/debugger/src/dbg_ui_filedialog_win.erl
deleted file mode 100644
index 52dc2012f3..0000000000
--- a/lib/debugger/src/dbg_ui_filedialog_win.erl
+++ /dev/null
@@ -1,340 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(dbg_ui_filedialog_win).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-%% External exports
--export([create_win/6, create_win/7, get_window/1,
- tag/2,
- handle_event/2]).
-
--record(winInfo, {window, % gsobj()
- extra, % fun()
- cwd, % string()
- pattern % string()
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% create_win(GS, Title, Pos, Mode, Filter, Extra)
-%% create_win(GS, Title, Pos, Mode, Filter, Extra, FileName) -> #winInfo{}
-%% GS = term()
-%% Title = string()
-%% Pos = {X,Y}
-%% Mode = normal | multiselect
-%% Filter = string() File name that may include * symbols.
-%% Extra = fun(File) -> {true, tag} | true | {error, term()}
-%% FileName = string() Suggested file name when saving
-%%--------------------------------------------------------------------
-create_win(GS, Title, {X,Y}, Mode, Filter, Extra) ->
- create_win(GS, Title, {X,Y}, Mode, Filter, Extra, null).
-create_win(GS, Title, {X,Y}, Mode, Filter, Extra, FileName) ->
- Pad = 8,
- Wlb = 480, Hlb = 130,
-
- Font = dbg_ui_win:font(normal),
-
- {Wlbl, Hlbl} = dbg_ui_win:min_size(["Directories"], 80, 20),
- {Wbtn, Hbtn} = dbg_ui_win:min_size(["Filter","Cancel"], 70, 30),
-
- %% Window
- Win = gs:window(GS, [{title,Title}, {x, X}, {y,Y}, {destroy,true}]),
-
- %% 'Filter' label and entry (for selecting directory)
- gs:label(Win, [{label, {text,"Filter"}}, {font, Font}, {align, sw},
- {x, Pad+2}, {y, Pad}, {width,Wlbl}, {height,Hlbl}]),
- gs:entry('Filter', Win, [{x, Pad}, {y, Pad+Hlbl},
- {width, Wlb}, {height, Hbtn},
- {keypress, true}]),
-
- %% Listboxes (showing directories and files)
- Xmid = Pad + Wlb/2,
- Y2 = Pad + Hlbl + Hbtn + Pad,
- gs:label(Win, [{label, {text,"Directories"}},
- {font, Font}, {align, sw},
- {x, Pad+2}, {y, Y2},
- {width, Wlbl}, {height, Hlbl}]),
- gs:label(Win, [{label, {text,"Files"}},
- {font, Font}, {align, sw},
- {x, Xmid+Pad/2+2}, {y, Y2},
- {width, Wlbl}, {height, Hlbl}]),
- gs:listbox('Dirs', Win, [{x, Pad}, {y, Y2+Hlbl},
- {width, Wlb/2-Pad/2}, {height, Hlb},
- {vscroll, right},
- {click, true}, {doubleclick, true}]),
- gs:listbox('Files', Win, [{x, Xmid+Pad/2}, {y, Y2+Hlbl},
- {width, Wlb/2-Pad/2}, {height, Hlb},
- {vscroll, right},
- {click, true}, {doubleclick, true}]),
-
- %% 'Selection' label and entry (for selecting file)
- Y3 = Y2 + Hlbl + Hlb,
- gs:label(Win, [{label, {text,"Selection"}}, {font,Font}, {align,sw},
- {x, Pad+2}, {y, Y3}, {width, Wlbl}, {height, Hlbl}]),
- gs:entry('Selection', Win, [{x, Pad}, {y, Y3+Hlbl},
- {width, Wlb}, {height, Hbtn},
- {keypress, true}]),
-
- %% Buttons
- Y4 = Y3 + Hlbl + Hbtn + Pad,
- Wb = Wlb - Wbtn,
- Opts = [{y, Y4}, {width, Wbtn}, {height, Hbtn}, {font, Font}],
- case Mode of
- normal ->
- gs:button(Win, [{label, {text,"OK"}}, {x, Pad},
- {data, select} | Opts]),
- gs:button(Win, [{label, {text,"Filter"}}, {x, Wlb/2-Wbtn/2},
- {data, filter} | Opts]),
- gs:button(Win, [{label, {text,"Cancel"}}, {x, Pad+Wb},
- {data, done} | Opts]);
- multiselect ->
- gs:button(Win, [{label, {text,"Choose"}}, {x, Pad},
- {data, select} | Opts]),
- gs:button(Win, [{label, {text,"All"}}, {x, Pad+Wb/3},
- {data, multiselect} | Opts]),
- gs:button(Win, [{label, {text,"Filter"}}, {x, Pad+2*Wb/3},
- {data, filter} | Opts]),
- gs:button(Win, [{label, {text,"Done"}}, {x, Pad+Wb},
- {data, done} | Opts])
- end,
-
- %% Insert contents
- {ok, Home} = file:get_cwd(),
- {Cwd, Pattern} = update_win(Filter, Extra, Home),
- if
- is_list(FileName) ->
- gs:config('Selection', {text, filename:join(Cwd,FileName)});
- true -> ignore
- end,
-
- Wwin = Pad + Wlb + Pad,
- Hwin = Y4 + Hbtn + Pad,
- gs:config(Win, [{width, Wwin}, {height, Hwin}, {map, true}]),
-
- #winInfo{window=Win, extra=Extra, cwd=Cwd, pattern=Pattern}.
-
-%%--------------------------------------------------------------------
-%% get_window(WinInfo) -> Window
-%% WinInfo = #winInfo{}
-%% Window = gsobj()
-%%--------------------------------------------------------------------
-get_window(WinInfo) ->
- WinInfo#winInfo.window.
-
-%%--------------------------------------------------------------------
-%% tag(WinInfo, File)
-%% WinInfo = #winInfo{}
-%% File = string()
-%%--------------------------------------------------------------------
-tag(WinInfo, File0) ->
- File = relfile(WinInfo#winInfo.cwd, File0),
- case member(File, gs:read('Files', items)) of
- {true, Index} -> gs:config('Files', {change, {Index, tag(File)}});
- false -> ignore
- end.
-
-tag(Str) -> [$*|Str].
-untag([$*|Str]) -> Str;
-untag([$(|Str]) -> [$)|Rts] = lists:reverse(Str),lists:reverse(Rts);
-untag(Str) -> Str.
-
-member(E, L) -> member(E, L, 0).
-member(E, [E|_], I) -> {true, I};
-member(E, [_|T], I) -> member(E, T, I+1);
-member(_E, [], _I) -> false.
-
-%%--------------------------------------------------------------------
-%% handle_event(GSEvent, WinInfo) -> Command
-%% GSEvent = {gs, Id, Event, Data, Arg}
-%% WinInfo = #winInfo{}
-%% Command = ignore
-%% | {stopped, Dir}
-%% | {win, WinInfo}
-%% | {select, File} | {multiselect, Dir, FileNames}
-%%--------------------------------------------------------------------
-handle_event({gs, _Id, destroy, _Data, _Args}, WinInfo) ->
- {stopped, WinInfo#winInfo.cwd};
-
-handle_event({gs, 'Filter', keypress, _Data, ['Return'|_]}, WinInfo) ->
- handle_event({gs, null, click, filter, null}, WinInfo);
-handle_event({gs, 'Selection', keypress, _Data, ['Return'|_]}, WinInfo) ->
- handle_event({gs, null, click, select, null}, WinInfo);
-
-handle_event({gs, 'Dirs', click, _Data, [0,"..",true|_]}, WinInfo) ->
- Filter = filename:join(filename:dirname(WinInfo#winInfo.cwd),
- WinInfo#winInfo.pattern),
- gs:config('Filter', {text, Filter}),
- ignore;
-handle_event({gs, 'Dirs', click, _Data, [_Index,Str,true|_]}, WinInfo) ->
- Filter = filename:join([WinInfo#winInfo.cwd, Str,
- WinInfo#winInfo.pattern]),
- gs:config('Filter', {text, Filter}),
- ignore;
-handle_event({gs, 'Dirs', doubleclick, _Data, _Arg}, WinInfo) ->
- handle_event({gs, null, click, filter, null}, WinInfo);
-
-handle_event({gs, 'Files', click, _Data, [_Index,Str,true|_]}, WinInfo) ->
- Selection = filename:join(WinInfo#winInfo.cwd, untag(Str)),
- gs:config('Selection', {text, Selection}),
- ignore;
-handle_event({gs, 'Files', doubleclick, _Data, _Arg}, WinInfo) ->
- handle_event({gs, null, click, select, null}, WinInfo);
-
-handle_event({gs, _Id, click, select, _Arg}, _WinInfo) ->
- {select, gs:read('Selection', text)};
-handle_event({gs, _Id, click, multiselect, _Arg}, WinInfo) ->
- Files = [untag(File) || File <- gs:read('Files', items)],
- {multiselect, WinInfo#winInfo.cwd, Files};
-handle_event({gs, _Id, click, filter, _Arg}, WinInfo) ->
- {Cwd, Pattern} = update_win(gs:read('Filter', text),
- WinInfo#winInfo.extra,
- WinInfo#winInfo.cwd),
- {win, WinInfo#winInfo{cwd=Cwd, pattern=Pattern}};
-handle_event({gs, _Id, click, done, _Arg}, WinInfo) ->
- {stopped, WinInfo#winInfo.cwd};
-
-handle_event(_GSEvent, _WinInfo) ->
- ignore.
-
-%%====================================================================
-%% Internal functions
-%%====================================================================
-
-update_win(Filter, ExtraFilter, Prev) ->
- {Res, {Filter2, Cwd, FilePattern}} = check_filter(Filter, Prev),
-
- Dirs = [".." | get_subdirs(Cwd)],
-
- gs:config('Filter', {text, Filter2}),
- gs:config('Dirs', {items, Dirs}),
- gs:config('Selection', {text, Cwd}),
-
- case Res of
- ok ->
- Matching = lists:sort(filelib:wildcard(Filter2, erl_prim_loader)),
- Files = extra_filter(Matching, Cwd, ExtraFilter),
- gs:config('Files', {items, Files});
- error ->
- gs:config('Files', beep)
- end,
-
- {Cwd, FilePattern}.
-
-%% check_filter(Filter, Prev) -> {ok, Res} | {error, Res}
-%% Res = {Filter, Cwd, FilePattern}
-%% Filter = Prev = Cwd = FilePattern = string()
-check_filter(Filter0, Prev) ->
- Filter = case filename:pathtype(Filter0) of
- absolute -> Filter0;
- _Relative -> filename:absname(Filter0, Prev)
- end,
- Comps = filename:split(Filter),
- Last = lists:last(Comps),
- FilePattern = case is_pattern(Last) of
- true -> Last;
- false -> "*"
- end,
- {Cwd, Rest} = max_existing(Comps),
- case Rest of
- [] ->
- %% Filter = existing file or directory
- Res = case filelib:is_dir(Filter, erl_prim_loader) of
- true -> {filename:join(Filter, "*"), Filter, "*"};
- false -> {Filter, filename:dirname(Filter),
- filename:basename(Filter)}
- end,
- {ok, Res};
- [FilePattern] ->
- %% Filter = existing dir and valid pattern
- {ok, {Filter, Cwd, FilePattern}};
- Comps ->
- %% Filter = garbage
- {error, {Prev, Prev, "*"}};
- [Name|_Names] ->
- %% Filter = existing dir ++ pattern or non-existing file/dir
- case is_pattern(Name) of
- true -> {ok, {Filter, Cwd, FilePattern}};
- false -> {error, {Cwd, Cwd, ""}}
- end
- end.
-
-max_existing([Name | Names]) ->
- case filelib:is_file(Name, erl_prim_loader) of
- true -> max_existing(Name, Names);
- false -> {[], [Name | Names]}
- end.
-max_existing(Dir, [Name | Names]) ->
- Dir2 = filename:join(Dir, Name),
- case filelib:is_file(Dir2, erl_prim_loader) of
- true when Names =:= [] -> {Dir2, []};
- true -> max_existing(Dir2, Names);
- false -> {Dir, [Name | Names]}
- end.
-
-is_pattern(Str) ->
- lists:member($*, Str).
-
-extra_filter([File|Files], Dir, Fun) ->
- case Fun(File) of
- true ->
- [relfile(Dir, File) | extra_filter(Files, Dir, Fun)];
- {true,tag} ->
- [[$*|relfile(Dir,File)] | extra_filter(Files, Dir, Fun)];
- {true,disable} ->
- [[$(|relfile(Dir,File)]++[$)] | extra_filter(Files, Dir, Fun)];
- {error, _Reason} -> extra_filter(Files, Dir, Fun)
- end;
-extra_filter([], _Dir, _Fun) -> [].
-
-get_subdirs(Dir) ->
- case erl_prim_loader:list_dir(Dir) of
- {ok, FileNames} ->
- X = [FN || FN <- FileNames,
- filelib:is_dir(filename:join(Dir, FN), erl_prim_loader)],
- lists:sort(X);
- _Error ->
- []
- end.
-
-%% Return the "remainder" of a file name relative a dir name, examples:
-%% relfile("/home/gunilla", "/home/gunilla/m.erl") -> "m.erl"
-%% relfile("/home/gunilla/dir", "/home/gunilla/dir/m.erl") -> "dir/m.erl"
-%% relfile("/home/gunilla", "/home/arne/m.erl") -> "/home/arne/m.erl"
-relfile(Dir, File) ->
- case compare(Dir, File) of
- error -> File;
- RelFile -> RelFile
- end.
-
-compare([_|Dir], [_|File]) ->
- compare(Dir, File);
-compare([], [$/|File]) ->
- File;
-compare(_, _) ->
- error.
diff --git a/lib/debugger/src/dbg_ui_interpret.erl b/lib/debugger/src/dbg_ui_interpret.erl
deleted file mode 100644
index 73392d40cb..0000000000
--- a/lib/debugger/src/dbg_ui_interpret.erl
+++ /dev/null
@@ -1,161 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_interpret).
-
--include_lib("kernel/include/file.hrl").
-
-%% External exports
--export([start/4]).
-
-%% Internal exports
--export([init/6]).
-
--record(state, {gs, % term() Graphics system id
- win, % term() Interpret dialog window data
- monitor, % pid() Monitor pid
- mode % local | global
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(GS, Pos, Dir, Mode)
-%% GS = Graphics system id
-%% Dir = string()
-%% Pos = {X,Y}
-%% Mode = local | global
-%%--------------------------------------------------------------------
-start(GS, Pos, Dir, Mode) ->
- Title = "Interpret Dialog",
- case dbg_ui_winman:is_started(Title) of
- true -> ignore;
- false ->
- spawn(?MODULE, init, [self(), GS, Pos, Title, Dir, Mode])
- end.
-
-%%====================================================================
-%% Internal exports
-%%====================================================================
-
-init(Monitor, GS, Pos, Title, Dir, Mode) ->
- Filter = filename:join(Dir, "*.erl"),
- Extra = fun(File) ->
- case int:interpretable(File) of
- true ->
- ModS = filename:basename(File, ".erl"),
- Mod = list_to_atom(ModS),
- case int:file(Mod) of
- File -> {true, tag};
- _ -> true % {error,not_loaded} | File2
- end;
- _Error -> {true,disable}
- end
- end,
-
- %% Create interpret dialog window
- Win = dbg_ui_filedialog_win:create_win(GS, Title, Pos, multiselect,
- Filter, Extra),
- Window = dbg_ui_filedialog_win:get_window(Win),
- dbg_ui_winman:insert(Title, Window),
-
- State = #state{gs=GS, win=Win, monitor=Monitor, mode=Mode},
- loop(State).
-
-
-%%====================================================================
-%% Main loop and message handling
-%%====================================================================
-
-loop(State) ->
- receive
-
- %% From the GUI
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd = dbg_ui_filedialog_win:handle_event(GuiEvent,
- State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, _Data} ->
- loop(State);
- {dbg_ui_winman, destroy} ->
- exit(normal)
- end.
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd({stopped, Dir}, State) ->
- State#state.monitor ! {dbg_ui_interpret, Dir},
- exit(normal);
-gui_cmd({win, Win}, State) ->
- State#state{win=Win};
-gui_cmd({select, File}, State) ->
- Res = case State#state.mode of
- local -> int:i(File);
- global -> int:ni(File)
- end,
-
- case Res of
- %% Interpretation succeeded, tag the file name
- {module, _Mod} ->
- dbg_ui_filedialog_win:tag(State#state.win, File);
-
- %% Interpretation failed
- error ->
- Error = format_error(int:interpretable(File)),
- Msg = ["Error when interpreting:", File, Error],
- Window = dbg_ui_filedialog_win:get_window(State#state.win),
- tool_utils:notify(Window, Msg)
- end,
- State;
-gui_cmd({multiselect, Dir, FileNames}, State) ->
- interpret_all(State, Dir, FileNames),
- State.
-
-interpret_all(State, Dir, [File0|Files]) ->
- File = filename:join(Dir, File0),
- Res = case State#state.mode of
- local -> int:i(File);
- global -> int:ni(File)
- end,
- case Res of
- {module, _Mod} ->
- dbg_ui_filedialog_win:tag(State#state.win, File),
- interpret_all(State, Dir, Files);
- error ->
- Window = dbg_ui_filedialog_win:get_window(State#state.win),
- Error = format_error(int:interpretable(File)),
- Msg = ["Error when interpreting:", File, Error,
- "OK to continue?"],
- case tool_utils:confirm(Window, Msg) of
- ok -> interpret_all(State, Dir, Files);
- cancel -> true
- end
- end;
-interpret_all(_State, _Dir, []) ->
- true.
-
-format_error({error,no_beam}) -> "No BEAM file";
-format_error({error,no_debug_info}) -> "No debug_info in BEAM file";
-format_error({error,badarg}) -> "File does not exist";
-format_error({error,{app,App}}) ->
- "Cannot interpret "++atom_to_list(App)++" modules".
diff --git a/lib/debugger/src/dbg_ui_mon.erl b/lib/debugger/src/dbg_ui_mon.erl
deleted file mode 100644
index 82fe210968..0000000000
--- a/lib/debugger/src/dbg_ui_mon.erl
+++ /dev/null
@@ -1,738 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_mon).
-
--include_lib("kernel/include/file.hrl").
-
-%% External exports
--export([start/2, stop/0]).
-
--define(TRACEWIN, ['Button Area', 'Evaluator Area', 'Bindings Area']).
--define(BACKTRACE, 100).
-
--record(pinfo, {pid, % pid()
- status % break | exit | idle | running | waiting
- }).
-
--record(state, {mode, % local | global
- starter, % bool() 'true' if int was started by me
-
- gs, % term() Graphics system id
- win, % term() Monitor window data
- focus, % undefined | #pinfo{} Process in focus
- coords, % {X,Y} Mouse pointer position
-
- intdir, % string() Default dir
- pinfos, % [#pinfo{}] Debugged processes
-
- tracewin, % [Area] Areas shown in trace window
- backtrace, % integer() Number of call frames to fetch
-
- attach, % false | {Flags, Function}
-
- sfile, % default | string() Settings file
- changed % boolean() Settings have been changed
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(Mode, SFile) -> {ok, Pid} | {error, Reason}
-%% Mode = local | global
-%% SFile = string() | default Settings file
-%% Pid = pid()
-%% Reason = {already_started,Pid} | term()
-%%--------------------------------------------------------------------
-start(Mode, SFile) ->
- case whereis(?MODULE) of
- undefined ->
- CallingPid = self(),
- Pid = spawn(fun () -> init(CallingPid, Mode, SFile) end),
- receive
- {initialization_complete, Pid} ->
- {ok, Pid};
- Error ->
- Error
- end;
-
- Pid ->
- {error, {already_started,Pid}}
- end.
-
-%%--------------------------------------------------------------------
-%% stop() -> ok
-%%--------------------------------------------------------------------
-stop() ->
- case whereis(?MODULE) of
- undefined ->
- ok;
- Pid ->
- Flag = process_flag(trap_exit, true),
- link(Pid),
- Pid ! stop,
- receive
- {'EXIT', Pid, stop} ->
- process_flag(trap_exit, Flag),
- ok
- end
- end.
-
-
-%%====================================================================
-%% Initialization
-%%====================================================================
-
-init(CallingPid, Mode, SFile) ->
- register(?MODULE, self()),
-
- %% Graphics system
- case catch dbg_ui_mon_win:init() of
- {'EXIT', Reason} ->
- CallingPid ! {error, Reason};
- GS ->
- init2(CallingPid, Mode, SFile, GS)
- end.
-
-init2(CallingPid, Mode, SFile, GS) ->
-
- %% Start Int if necessary and subscribe to information from it
- Bool = case int:start() of
- {ok, _Int} -> true;
- {error, {already_started, _Int}} -> false
- end,
- int:subscribe(),
-
- %% Start other necessary stuff
- dbg_ui_winman:start(), % Debugger window manager
-
- %% Create monitor window
- Title = "Monitor",
- Win = dbg_ui_mon_win:create_win(GS, Title, menus()),
- Window = dbg_ui_mon_win:get_window(Win),
- dbg_ui_winman:insert(Title, Window),
-
- %% Initial process state
- State1 = #state{mode = Mode,
- starter = Bool,
-
- gs = GS,
- win = Win,
- focus = undefined,
- coords = {0,0},
-
- intdir = element(2, file:get_cwd()),
- pinfos = [],
-
- sfile = SFile,
- changed = false
- },
-
- State2 = init_options(?TRACEWIN, % Trace Window
- int:auto_attach(), % Auto Attach
- int:stack_trace(), % Stack Trace
- ?BACKTRACE, % Back Trace Size
- State1),
-
- State3 = init_contents(int:interpreted(), % Modules
- int:all_breaks(), % Breakpoints
- int:snapshot(), % Processes
- State2),
-
- %% Disable/enable functionality according to process in focus (none)
- gui_enable_functions(State3#state.focus),
-
- CallingPid ! {initialization_complete, self()},
-
- if
- SFile =:= default ->
- loop(State3);
- true ->
- loop(load_settings(SFile, State3))
- end.
-
-init_options(TraceWin, AutoAttach, StackTrace, BackTrace, State) ->
- lists:foreach(fun(Area) ->
- dbg_ui_mon_win:select(Area, true)
- end,
- TraceWin),
-
- case AutoAttach of
- false -> ignore;
- {Flags, _Function} ->
- dbg_ui_mon_win:show_option(State#state.win,
- auto_attach, Flags),
- lists:foreach(fun(Flag) ->
- dbg_ui_mon_win:select(map(Flag), true)
- end,
- Flags)
- end,
-
- dbg_ui_mon_win:show_option(State#state.win,
- stack_trace, StackTrace),
- dbg_ui_mon_win:select(map(StackTrace), true),
-
- dbg_ui_mon_win:show_option(State#state.win, back_trace, BackTrace),
-
- State#state{tracewin=TraceWin, backtrace=BackTrace}.
-
-init_contents(Mods, Breaks, Processes, State) ->
- Win2 =
- lists:foldl(fun(Mod, Win) ->
- dbg_ui_mon_win:add_module(Win,'Module',Mod)
- end,
- State#state.win,
- Mods),
-
- Win3 =
- lists:foldl(fun(Break, Win) ->
- dbg_ui_mon_win:add_break(Win,'Break',Break)
- end,
- Win2,
- Breaks),
-
- lists:foldl(fun(PidTuple, State0) ->
- int_cmd({new_process, PidTuple}, State0)
- end,
- State#state{win=Win3},
- Processes).
-
-
-%%====================================================================
-%% Main loop and message handling
-%%====================================================================
-
-loop(State) ->
- receive
-
- stop ->
- gui_cmd(stopped, State);
-
- %% From the GUI
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent) =:= gs ->
- Cmd = dbg_ui_mon_win:handle_event(GuiEvent,State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the interpreter process
- {int, Cmd} ->
- State2 = int_cmd(Cmd, State),
- loop(State2);
-
- %% From the dbg_ui_interpret process
- {dbg_ui_interpret, Dir} ->
- loop(State#state{intdir=Dir});
-
- %% From the dbg_ui_edit process
- {dbg_ui_edit, 'Backtrace:', BackTrace} ->
- dbg_ui_mon_win:show_option(State#state.win,
- back_trace, BackTrace),
- loop(State#state{backtrace=BackTrace});
-
- %% From the dbg_ui_settings process
- {dbg_ui_settings, SFile, Action} ->
- State2 = case Action of
- load -> load_settings(SFile, State);
- save -> save_settings(SFile, State)
- end,
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, Data} ->
- dbg_ui_winman:update_windows_menu(Data),
- loop(State)
- end.
-
-%%--Commands from the GUI---------------------------------------------
-%% Act upon a command from the GUI. In most cases, it is only necessary
-%% to call a relevant int-function. int will then report when the action
-%% has been taken.
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd(stopped, State) ->
- if
- State#state.starter =:= true -> int:stop();
- true -> int:auto_attach(false)
- end,
- exit(stop);
-gui_cmd({coords, Coords}, State) ->
- State#state{coords=Coords};
-
-gui_cmd({shortcut, Key}, State) ->
- case shortcut(Key) of
- {always, Cmd} -> gui_cmd(Cmd, State);
- {if_enabled, Cmd} ->
- case dbg_ui_mon_win:is_enabled(Cmd) of
- true -> gui_cmd(Cmd, State);
- false -> State
- end;
- false -> State
- end;
-
-%% File Menu
-gui_cmd('Load Settings...', State) ->
- Window = dbg_ui_mon_win:get_window(State#state.win),
- dbg_ui_settings:start(Window, State#state.coords,
- load, State#state.sfile),
- State;
-gui_cmd('Save Settings...', State) ->
- Window = dbg_ui_mon_win:get_window(State#state.win),
- dbg_ui_settings:start(Window, State#state.coords,
- save, State#state.sfile),
- State;
-gui_cmd('Exit', State) ->
- gui_cmd(stopped, State);
-
-%% Edit Menu
-gui_cmd('Refresh', State) ->
- int:clear(),
- Win = dbg_ui_mon_win:clear_processes(State#state.win),
- gui_enable_functions(undefined),
- State2 = State#state{win=Win, focus=undefined, pinfos=[]},
- lists:foldl(fun(PidTuple, S) ->
- int_cmd({new_process,PidTuple}, S)
- end,
- State2,
- int:snapshot());
-gui_cmd('Kill All', State) ->
- lists:foreach(fun(PInfo) ->
- case PInfo#pinfo.status of
- exit -> ignore;
- _Status -> exit(PInfo#pinfo.pid, kill)
- end
- end,
- State#state.pinfos),
- State;
-
-%% Module Menu
-gui_cmd('Interpret...', State) ->
- dbg_ui_interpret:start(State#state.gs, State#state.coords,
- State#state.intdir, State#state.mode),
- State;
-gui_cmd('Delete All Modules', State) ->
- lists:foreach(fun(Mod) -> int:nn(Mod) end, int:interpreted()),
- State;
-gui_cmd({module, Mod, What}, State) ->
- case What of
- delete -> int:nn(Mod);
- view -> dbg_ui_view:start(State#state.gs, Mod)
- end,
- State;
-
-%% Process Menu
-gui_cmd('Step', State) ->
- int:step((State#state.focus)#pinfo.pid),
- State;
-gui_cmd('Next', State) ->
- int:next((State#state.focus)#pinfo.pid),
- State;
-gui_cmd('Continue', State) ->
- int:continue((State#state.focus)#pinfo.pid),
- State;
-gui_cmd('Finish ', State) ->
- int:finish((State#state.focus)#pinfo.pid),
- State;
-gui_cmd('Attach', State) ->
- Pid = (State#state.focus)#pinfo.pid,
- case dbg_ui_winman:is_started(dbg_ui_trace:title(Pid)) of
- true -> ignore;
- false -> int:attach(Pid, trace_function(State))
- end,
- State;
-gui_cmd('Kill', State) ->
- exit((State#state.focus)#pinfo.pid, kill),
- State;
-
-%% Break Menu
-gui_cmd('Line Break...', State) ->
- dbg_ui_break:start(State#state.gs, State#state.coords, line),
- State;
-gui_cmd('Conditional Break...', State) ->
- dbg_ui_break:start(State#state.gs, State#state.coords, conditional),
- State;
-gui_cmd('Function Break...', State) ->
- dbg_ui_break:start(State#state.gs, State#state.coords, function),
- State;
-gui_cmd('Enable All', State) ->
- Breaks = int:all_breaks(),
- lists:foreach(fun ({{Mod, Line}, _Options}) ->
- int:enable_break(Mod, Line)
- end,
- Breaks),
- State;
-gui_cmd('Disable All', State) ->
- Breaks = int:all_breaks(),
- lists:foreach(fun ({{Mod, Line}, _Options}) ->
- int:disable_break(Mod, Line)
- end,
- Breaks),
- State;
-gui_cmd('Delete All', State) ->
- int:no_break(),
- State;
-gui_cmd({break, {Mod, Line}, What}, State) ->
- case What of
- delete -> int:delete_break(Mod, Line);
- {status, inactive} -> int:disable_break(Mod, Line);
- {status, active} -> int:enable_break(Mod, Line);
- {trigger, Action} -> int:action_at_break(Mod, Line, Action)
- end,
- State;
-
-%% Options Commands
-gui_cmd({'Trace Window', TraceWin}, State) ->
- State2 = State#state{tracewin=TraceWin},
- case State#state.attach of
- false -> ignore;
- {Flags, {dbg_ui_trace, start, StartFlags}} ->
- case trace_function(State2) of
- {_, _, StartFlags} -> ignore;
- NewFunction -> % {_, _, NewStartFlags}
- int:auto_attach(Flags, NewFunction)
- end;
- _AutoAttach -> ignore
- end,
- State2;
-gui_cmd({'Auto Attach', When}, State) ->
- if
- When =:= [] -> int:auto_attach(false);
- true ->
- Flags = [map(Name) || Name <- When],
- int:auto_attach(Flags, trace_function(State))
- end,
- State;
-gui_cmd({'Stack Trace', [Name]}, State) ->
- int:stack_trace(map(Name)),
- State;
-gui_cmd('Back Trace Size...', State) ->
- dbg_ui_edit:start(State#state.gs, State#state.coords, "Backtrace",
- 'Backtrace:', {integer, State#state.backtrace}),
- State;
-
-%% Help Menu
-gui_cmd('Debugger', State) ->
- HelpFile = filename:join([code:lib_dir(debugger), "doc", "html", "index.html"]),
- Window = dbg_ui_mon_win:get_window(State#state.win),
- tool_utils:open_help(Window, HelpFile),
- State;
-
-gui_cmd({focus, Pid, Win}, State) ->
- {value, PInfo} =
- lists:keysearch(Pid, #pinfo.pid, State#state.pinfos),
- gui_enable_functions(PInfo),
- State#state{win=Win, focus=PInfo};
-gui_cmd(default, State) ->
- case lists:member('Attach', menus(enabled, State#state.focus)) of
- true -> gui_cmd('Attach', State);
- false -> State
- end.
-
-%%--Commands from the interpreter-------------------------------------
-
-int_cmd({interpret, Mod}, State) ->
- Win = dbg_ui_mon_win:add_module(State#state.win, 'Module', Mod),
- State#state{win=Win};
-int_cmd({no_interpret, Mod}, State) ->
- Win = dbg_ui_mon_win:delete_module(State#state.win, Mod),
- State#state{win=Win};
-
-int_cmd({new_process, {Pid, Function, Status, Info}}, State) ->
-
- %% Create record with information about the process
- Name = registered_name(Pid),
- PInfo = #pinfo{pid=Pid, status=Status},
-
- %% Update window
- Win = dbg_ui_mon_win:add_process(State#state.win,
- Pid, Name, Function, Status, Info),
-
- %% Store process information
- PInfos = State#state.pinfos ++ [PInfo],
- State#state{win=Win, pinfos=PInfos};
-int_cmd({new_status, Pid, Status, Info}, State) ->
-
- %% Find stored information about the process
- PInfos = State#state.pinfos,
- {value, PInfo} = lists:keysearch(Pid, #pinfo.pid, PInfos),
-
- %% Update process information
- PInfo2 = PInfo#pinfo{status=Status},
- PInfos2 = lists:keyreplace(Pid, #pinfo.pid, PInfos, PInfo2),
- State2 = State#state{pinfos=PInfos2},
-
- %% Update window
- dbg_ui_mon_win:update_process(State2#state.win, Pid, Status, Info),
- case State2#state.focus of
- #pinfo{pid=Pid} ->
- gui_enable_functions(PInfo2),
- State2#state{focus=PInfo2};
- _ ->
- State2
- end;
-
-int_cmd({new_break, Break}, State) ->
- Win = dbg_ui_mon_win:add_break(State#state.win, 'Break', Break),
- State#state{win=Win};
-int_cmd({delete_break, Point}, State) ->
- Win = dbg_ui_mon_win:delete_break(State#state.win, Point),
- State#state{win=Win};
-int_cmd({break_options, Break}, State) ->
- dbg_ui_mon_win:update_break(State#state.win, Break),
- State;
-int_cmd(no_break, State) ->
- Win = dbg_ui_mon_win:clear_breaks(State#state.win),
- State#state{win=Win};
-int_cmd({no_break, Mod}, State) ->
- Win = dbg_ui_mon_win:clear_breaks(State#state.win, Mod),
- State#state{win=Win};
-
-int_cmd({auto_attach, AutoAttach}, State) ->
- OnFlags = case AutoAttach of
- false -> [];
- {Flags, _Function} -> Flags
- end,
- OffFlags = [init, exit, break] -- OnFlags,
- dbg_ui_mon_win:show_option(State#state.win, auto_attach, OnFlags),
- lists:foreach(fun(Flag) ->
- dbg_ui_mon_win:select(map(Flag), true)
- end,
- OnFlags),
- lists:foreach(fun(Flag) ->
- dbg_ui_mon_win:select(map(Flag), false)
- end,
- OffFlags),
- State#state{attach=AutoAttach};
-int_cmd({stack_trace, Flag}, State) ->
- dbg_ui_mon_win:show_option(State#state.win, stack_trace, Flag),
- dbg_ui_mon_win:select(map(Flag), true),
- State.
-
-
-%%====================================================================
-%% GUI auxiliary functions
-%%====================================================================
-
-menus() ->
- [{'File', [{'Load Settings...', 0},
- {'Save Settings...', 2},
- separator,
- {'Exit', 0}]},
- {'Edit', [{'Refresh', no},
- {'Kill All', no}]},
- {'Module', [{'Interpret...', 0},
- {'Delete All Modules', no},
- separator]},
- {'Process', [{'Step', 0},
- {'Next', 0},
- {'Continue', 0},
- {'Finish ', 0},
- separator,
- {'Attach', 0},
- {'Kill', no}]},
- {'Break', [{'Line Break...', 5},
- {'Conditional Break...', no},
- {'Function Break...', no},
- separator,
- {'Enable All', no},
- {'Disable All', no},
- {'Delete All', 0},
- separator]},
- {'Options', [{'Trace Window', no, cascade,
- [{'Button Area', no, check},
- {'Evaluator Area', no, check},
- {'Bindings Area', no, check},
- {'Trace Area', no, check}]},
- {'Auto Attach', no, cascade,
- [{'First Call', no, check},
- {'On Break', no, check},
- {'On Exit', no, check}]},
- {'Stack Trace', no, cascade,
- [{'Stack On, Tail', no, radio},
- {'Stack On, No Tail', no, radio},
- {'Stack Off', no, radio}]},
- {'Back Trace Size...', no}]},
- {'Help', [{'Debugger', no}]}].
-
-menus(enabled, undefined) ->
- [];
-menus(disabled, undefined) ->
- ['Step','Next','Continue','Finish ','Attach','Kill'];
-menus(enabled, #pinfo{status=exit}) ->
- ['Attach'];
-menus(disabled, #pinfo{status=exit}) ->
- ['Step','Next','Continue','Finish ','Kill'];
-menus(enabled, #pinfo{status=break}) ->
- ['Step','Next','Continue','Finish ','Attach','Kill'];
-menus(disabled, #pinfo{status=break}) ->
- [];
-menus(enabled, _PInfo) ->
- ['Attach','Kill'];
-menus(disabled, _PInfo) ->
- ['Step','Next','Continue','Finish '].
-
-shortcut(l) -> {always, 'Load Settings...'};
-shortcut(v) -> {always, 'Save Settings...'};
-shortcut(e) -> {always, 'Exit'};
-
-shortcut(i) -> {always, 'Interpret...'};
-
-shortcut(s) -> {if_enabled, 'Step'};
-shortcut(n) -> {if_enabled, 'Next'};
-shortcut(c) -> {if_enabled, 'Continue'};
-shortcut(f) -> {if_enabled, 'Finish '};
-shortcut(a) -> {if_enabled, 'Attach'};
-
-shortcut(b) -> {always, 'Line Break...'};
-shortcut(d) -> {always, 'Delete All'};
-
-shortcut(_) -> false.
-
-%% Enable/disable functionality depending on the state of the process
-%% currently in Focus
-gui_enable_functions(PInfo) ->
- Enabled = menus(enabled, PInfo),
- Disabled = menus(disabled, PInfo),
- dbg_ui_mon_win:enable(Enabled, true),
- dbg_ui_mon_win:enable(Disabled, false).
-
-%% Map values used by int to/from GUI names
-map('First Call') -> init; % Auto attach
-map('On Exit') -> exit;
-map('On Break') -> break;
-map(init) -> 'First Call';
-map(exit) -> 'On Exit';
-map(break) -> 'On Break';
-
-map('Stack On, Tail') -> all; % Stack trace
-map('Stack On, No Tail') -> no_tail;
-map('Stack Off') -> false;
-map(all) -> 'Stack On, Tail';
-map(true) -> 'Stack On, Tail';
-map(no_tail) -> 'Stack On, No Tail';
-map(false) -> 'Stack Off'.
-
-
-%%====================================================================
-%% Debugger settings
-%%====================================================================
-
-load_settings(SFile, State) ->
- case file:read_file(SFile) of
- {ok, Binary} ->
- case catch binary_to_term(Binary) of
- {debugger_settings, Settings} ->
- load_settings2(Settings,
- State#state{sfile=SFile,
- changed=false});
- _Error -> State
- end;
- {error, _Reason} -> State
- end.
-
-load_settings2(Settings, State) ->
- {TraceWin, AutoAttach, StackTrace, BackTrace, Files, Breaks} =
- Settings,
-
- TraceWinAll = ['Button Area', 'Evaluator Area', 'Bindings Area',
- 'Trace Area'],
- lists:foreach(fun(Area) -> dbg_ui_mon_win:select(Area, true) end,
- TraceWin),
- lists:foreach(fun(Area) -> dbg_ui_mon_win:select(Area, false) end,
- TraceWinAll--TraceWin),
-
- case AutoAttach of
- false -> int:auto_attach(false);
- {Flags, Function} -> int:auto_attach(Flags, Function)
- end,
-
- int:stack_trace(StackTrace),
-
- dbg_ui_mon_win:show_option(State#state.win, back_trace, BackTrace),
-
- case State#state.mode of
- local -> lists:foreach(fun(File) -> int:i(File) end, Files);
- global -> lists:foreach(fun(File) -> int:ni(File) end, Files)
- end,
- lists:foreach(fun(Break) ->
- {{Mod, Line}, [Status, Action, _, Cond]} =
- Break,
- int:break(Mod, Line),
- if
- Status =:= inactive ->
- int:disable_break(Mod, Line);
- true -> ignore
- end,
- if
- Action/=enable ->
- int:action_at_break(Mod,Line,Action);
- true -> ignore
- end,
- case Cond of
- CFunction when is_tuple(CFunction) ->
- int:test_at_break(Mod,Line,CFunction);
- null -> ignore
- end
- end,
- Breaks),
-
- State#state{tracewin=TraceWin, backtrace=BackTrace}.
-
-save_settings(SFile, State) ->
- Settings = {State#state.tracewin,
- int:auto_attach(),
- int:stack_trace(),
- State#state.backtrace,
- [int:file(Mod) || Mod <- int:interpreted()],
- int:all_breaks()},
- Binary = term_to_binary({debugger_settings, Settings}),
- case file:write_file(SFile, Binary) of
- ok ->
- State#state{sfile=SFile, changed=false};
- {error, _Reason} ->
- State
- end.
-
-
-%%====================================================================
-%% Other internal functions
-%%====================================================================
-
-registered_name(Pid) ->
- %% Yield in order to give Pid more time to register its name
- timer:sleep(200),
-
- Node = node(Pid),
- if
- Node =:= node() ->
- case erlang:process_info(Pid, registered_name) of
- {registered_name, Name} -> Name;
- _ -> undefined
- end;
- true ->
- case rpc:call(Node,erlang,process_info,
- [Pid,registered_name]) of
- {registered_name, Name} -> Name;
- _ -> undefined
- end
- end.
-
-trace_function(State) ->
- {dbg_ui_trace, start, [State#state.tracewin,State#state.backtrace]}.
diff --git a/lib/debugger/src/dbg_ui_mon_win.erl b/lib/debugger/src/dbg_ui_mon_win.erl
deleted file mode 100644
index 8655c7697a..0000000000
--- a/lib/debugger/src/dbg_ui_mon_win.erl
+++ /dev/null
@@ -1,573 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_mon_win).
--compile([{nowarn_deprecated_function,{gs,checkbutton,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,grid,2}},
- {nowarn_deprecated_function,{gs,gridline,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-%% External exports
--export([init/0]).
--export([create_win/3, get_window/1,
- show_option/3,
- enable/2, is_enabled/1, select/2,
- add_module/3, delete_module/2,
- add_process/6, update_process/4, clear_processes/1,
- add_break/3, update_break/2, delete_break/2,
- clear_breaks/1, clear_breaks/2,
- handle_event/2
- ]).
-
--define(default_rows,50).
-
--record(moduleInfo, {module, menubtn}).
--record(procInfo, {pid, row}).
--record(breakInfo, {point, status, break}).
--record(winInfo, {window, % gsobj()
- grid, % gsobj()
- row, % int() Last row in grid
-
- focus, % int() Selected row in grid
-
- modules=[], % [#moduleInfo{}] Known modules
- processes=[], % [#procInfo{}] Known processes
- breaks=[], % [#breakInfo{}] Known breakpoints
-
- listbox, % gsobj() Listinng known modules
-
- %% Auto attach buttons
- fbutton, % gsobj()
- bbutton, % gsobj()
- ebutton, % gsobj()
- selected=[], % ['First Call'|'On Break'|'On Exit']
-
- slabel, % showing Stack Trace option
- blabel % showing Back Trace Size
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-init() ->
- dbg_ui_win:init().
-
-%%--------------------------------------------------------------------
-%% create_win(GS, Title, Menus) -> #winInfo{}
-%% GS = gsobj()
-%% Title = string()
-%% Menus = [menu()] See dbg_ui_win.erl
-%%--------------------------------------------------------------------
-
--define(PAD, 5).
--define(Wf, 150).
--define(Wg, 770).
--define(W, 800).
--define(H, 390).
-
-create_win(GS, Title, Menus) ->
- Win = gs:window(GS, [{title, Title},
- {width, ?W}, {height, ?H},
- {configure,true}, {destroy,true},
- {keypress,true}, {motion,true}]),
-
- MenuBar = gs:menubar(Win, []),
- dbg_ui_win:create_menus(MenuBar, Menus),
- dbg_ui_winman:windows_menu(MenuBar),
-
- Font = dbg_ui_win:font(normal),
-
- Frame = gs:frame(Win, [{x, ?PAD}, {y, 30},
- {width, ?Wf}, {height, ?H}]),
- Hlb = 200,
- Listbox = gs:listbox(Frame, [{x, 0}, {y, 0},
- {width, ?Wf}, {height, Hlb},
- {data, listbox},
- {doubleclick, true},
- {items, []}]),
- gs:label(Frame, [{x, 0}, {y, Hlb}, {width, ?Wf}, {height, 20},
- {align, w},
- {label, {text, "Auto Attach:"}}, {font, Font}]),
- Fbtn = gs:checkbutton(Frame, [{x, 0}, {y, Hlb+20},
- {width, ?Wf}, {height, 20},
- {label, {text, 'First Call'}},
- {align, w}, {font, Font},
- {data, autoattach}]),
- Bbtn = gs:checkbutton(Frame, [{x, 0}, {y, Hlb+40},
- {width, ?Wf}, {height, 20},
- {label, {text, 'On Break'}},
- {align, w}, {font, Font},
- {data, autoattach}]),
- Ebtn = gs:checkbutton(Frame, [{x, 0}, {y, Hlb+60},
- {width, ?Wf}, {height, 20},
- {label, {text, 'On Exit'}},
- {align, w}, {font, Font},
- {data, autoattach}]),
- SLabel = gs:label(Frame, [{x, 0}, {y, Hlb+80},
- {width, ?Wf}, {height, 40},
- {font, Font}, {align, w}]),
- BLabel = gs:label(Frame, [{x, 0}, {y, Hlb+120},
- {width, ?Wf}, {height, 40},
- {font, Font}, {align, w}]),
-
- Grid = gs:grid(Win, [{x, 2*?PAD+?Wf}, {y, 30},
- {width, ?W-(2*?PAD+?Wf)}, {height, ?H-30},
- {bg, grey}, {fg, black},
- {vscroll, right}, {hscroll, bottom},
- calc_columnwidths(?Wg),
- {rows, {1,?default_rows}}]),
- gs:gridline(Grid, [{row, 1}, {bw, 5}, {fg, blue},
- {font, Font},
- {text, {1,"Pid"}}, {text, {2,"Initial Call"}},
- {text, {3,"Name"}}, {text, {4,"Status"}},
- {text, {5,"Information"}}]),
-
- gs:config(Win, {map, true}),
- #winInfo{window=Win, grid=Grid, row=1, focus=0,
- listbox=Listbox,
- fbutton=Fbtn, bbutton=Bbtn, ebutton=Ebtn,
- slabel=SLabel, blabel=BLabel}.
-
-%%--------------------------------------------------------------------
-%% get_window(WinInfo) -> Window
-%% WinInfo = #winInfo{}
-%% Window = gsobj()
-%%--------------------------------------------------------------------
-get_window(WinInfo) ->
- WinInfo#winInfo.window.
-
-%%--------------------------------------------------------------------
-%% show_option(WinInfo, Option, Value) -> void()
-%% WinInfo = #winInfo{}
-%% Option = auto_attach | stack_trace | back_trace
-%% Value = [Flag] % Option==auto_attach
-%% Flag = init | break | exit
-%% | true | all | no_tail | false % Option==stack_trace
-%% | int() % Option==back_trace
-%%--------------------------------------------------------------------
-show_option(WinInfo, Option, Value) ->
- case Option of
-
- auto_attach ->
- lists:foreach(fun (Button) ->
- gs:config(Button, {select, false})
- end,
- option_buttons(WinInfo, [init, break, exit])),
- lists:foreach(fun (Button) ->
- gs:config(Button, {select, true})
- end,
- option_buttons(WinInfo, Value));
-
- stack_trace ->
- Text = case Value of
- all -> "Stack Trace:\n On (with tail)";
- true -> "Stack Trace:\n On (with tail)";
- no_tail -> "Stack Trace:\n On (no tail)";
- false -> "Stack Trace:\n Off"
- end,
- gs:config(WinInfo#winInfo.slabel, {label, {text, Text}});
-
- back_trace ->
- Text = "Back Trace Size:\n " ++ integer_to_list(Value),
- gs:config(WinInfo#winInfo.blabel, {label, {text, Text}})
- end.
-
-option_buttons(WinInfo, [init|Flags]) ->
- [WinInfo#winInfo.fbutton|option_buttons(WinInfo, Flags)];
-option_buttons(WinInfo, [break|Flags]) ->
- [WinInfo#winInfo.bbutton|option_buttons(WinInfo, Flags)];
-option_buttons(WinInfo, [exit|Flags]) ->
- [WinInfo#winInfo.ebutton|option_buttons(WinInfo, Flags)];
-option_buttons(_WinInfo, []) ->
- [].
-
-%%--------------------------------------------------------------------
-%% enable([MenuItem], Bool)
-%% is_enabled(MenuItem) -> Bool
-%% MenuItem = atom()
-%% Bool = boolean()
-%%--------------------------------------------------------------------
-enable(MenuItems, Bool) ->
- lists:foreach(fun(MenuItem) ->
- gs:config(MenuItem, {enable, Bool})
- end,
- MenuItems).
-
-is_enabled(MenuItem) ->
- gs:read(MenuItem, enable).
-
-%%--------------------------------------------------------------------
-%% select(MenuItem, Bool)
-%% MenuItem = atom()
-%% Bool = boolean()
-%%--------------------------------------------------------------------
-select(MenuItem, Bool) ->
- dbg_ui_win:select(MenuItem, Bool).
-
-%%--------------------------------------------------------------------
-%% add_module(WinInfo, Name, Mod) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Name = atom()
-%% Mod = atom()
-%%--------------------------------------------------------------------
-add_module(WinInfo, Menu, Mod) ->
- Modules = WinInfo#winInfo.modules,
- case lists:keymember(Mod, #moduleInfo.module, Modules) of
- false ->
- %% Create a menu for the module
- Font = dbg_ui_win:font(normal),
- MenuBtn = gs:menuitem(Menu, [{label, {text,Mod}},
- {font, Font},
- {itemtype, cascade}]),
- SubMenu = gs:menu(MenuBtn, []),
- gs:menuitem(SubMenu, [{label, {text,"View"}},
- {font, Font},
- {data, {module,Mod,view}}]),
- gs:menuitem(SubMenu, [{label, {text,"Delete"}},
- {font, Font},
- {data, {module,Mod,delete}}]),
-
- %% Add the module to the listbox
- gs:config(WinInfo#winInfo.listbox, {add, Mod}),
-
- ModInfo = #moduleInfo{module=Mod, menubtn=MenuBtn},
- WinInfo#winInfo{modules=[ModInfo | Modules]};
- true -> WinInfo
- end.
-
-%%--------------------------------------------------------------------
-%% delete_module(WinInfo, Mod) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Mod = atom()
-%%--------------------------------------------------------------------
-delete_module(WinInfo, Mod) ->
- {value, ModInfo} = lists:keysearch(Mod, #moduleInfo.module,
- WinInfo#winInfo.modules),
- gs:destroy(ModInfo#moduleInfo.menubtn),
- delete_module(WinInfo#winInfo.listbox, atom_to_list(Mod), 0),
- WinInfo#winInfo{modules=lists:keydelete(Mod, #moduleInfo.module,
- WinInfo#winInfo.modules)}.
-
-delete_module(Listbox, ModS, Index) ->
- case gs:read(Listbox, {get, Index}) of
- ModS ->
- gs:config(Listbox, {del, Index});
- _OtherModS ->
- delete_module(Listbox, ModS, Index+1)
- end.
-
-%%--------------------------------------------------------------------
-%% add_process(WinInfo, Pid, Name, Function, Status, Info) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Pid = pid()
-%% Name = undefined | atom()
-%% Function = {Mod, Func, Args}
-%% Status = idle | running | break | exit
-%% Info = {} | term()
-%%--------------------------------------------------------------------
-add_process(WinInfo, Pid, Name, {Mod,Func,Args}, Status, Info) ->
- Grid = WinInfo#winInfo.grid,
- Row = (WinInfo#winInfo.row)+1,
- GridLine = case gs:read(Grid, {obj_at_row, Row}) of
- undefined ->
- if Row>?default_rows ->
- gs:config(Grid,[{rows,{1,Row}}]);
- true -> ok
- end,
- gs:gridline(Grid,[{row,Row}, {bw,5}, {fg,black},
- {font,dbg_ui_win:font(normal)},
- {click, true},
- {doubleclick, true}]);
- GSObj ->
- GSObj
- end,
- Name2 = case Name of undefined -> ""; _ -> Name end,
- FuncS = io_lib:format("~w:~w/~w", [Mod, Func, length(Args)]),
- Info2 = case Info of {} -> ""; _ -> Info end,
- Options = [{text, {1,Pid}}, {text, {2,FuncS}}, {text, {3,Name2}},
- {text, {4,Status}}, {text, {5,Info2}},
- {data, {gridline, Pid}}],
- gs:config(GridLine, Options),
-
- ProcInfo = #procInfo{pid=Pid, row=Row},
- WinInfo#winInfo{processes=[ProcInfo|WinInfo#winInfo.processes],
- row=Row}.
-
-%%--------------------------------------------------------------------
-%% update_process(WinInfo, Pid, Status, Info)
-%% WinInfo = #winInfo{}
-%% Pid = pid()
-%% Status = idle | running | break | exit
-%% Info = {} | term()
-%%--------------------------------------------------------------------
-update_process(WinInfo, Pid, Status, Info) ->
- {value, ProcInfo} = lists:keysearch(Pid, #procInfo.pid,
- WinInfo#winInfo.processes),
-
- Grid = WinInfo#winInfo.grid,
- GridLine = gs:read(Grid, {obj_at_row, ProcInfo#procInfo.row}),
-
- Info2 = case Info of {} -> ""; _ -> Info end,
- gs:config(GridLine, [{text, {4,Status}}, {text, {5,Info2}}]).
-
-%%--------------------------------------------------------------------
-%% clear_processes(WinInfo) -> WinInfo
-%% WinInfo = #winInfo{}
-%%--------------------------------------------------------------------
-clear_processes(WinInfo) ->
- Grid = WinInfo#winInfo.grid,
- Max = WinInfo#winInfo.row,
- clear_processes(Grid, 2, Max),
- gs:config(Grid,[{rows,{1,?default_rows}}]),
- WinInfo#winInfo{row=1, focus=0, processes=[]}.
-
-clear_processes(Grid, Row, Max) when Row=<Max ->
- GridLine = gs:read(Grid, {obj_at_row, Row}),
- case gs:read(GridLine,{text,4}) of
- "exit" ->
- Pid = list_to_pid(gs:read(GridLine,{text,1})),
- dbg_ui_winman:clear_process(dbg_ui_trace:title(Pid));
- _ ->
- ok
- end,
-
- Options = [{fg, black},
- {{text,1}, ""}, {{text,2},""}, {{text,3},""},
- {{text,4}, ""}, {{text,5},""},
- {data, []}],
- gs:config(GridLine, Options),
- clear_processes(Grid, Row+1, Max);
-clear_processes(_Grid, Row, Max) when Row>Max ->
- done.
-
-%%--------------------------------------------------------------------
-%% add_break(WinInfo, Name, {Point, Options}) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Name = atom()
-%% Point = {Mod, Line}
-%% Options = [Status, Action, Mods, Cond]
-%% Status = active | inactive
-%% Action = enable | disable | delete
-%% Mods = null (not used)
-%% Cond = null | {Mod, Func}
-%%--------------------------------------------------------------------
-add_break(WinInfo, Menu, {Point, Options}) ->
- Break = dbg_ui_win:add_break(Menu, Point),
- dbg_ui_win:update_break(Break, Options),
- BreakInfo = #breakInfo{point=Point, break=Break},
- WinInfo#winInfo{breaks=[BreakInfo|WinInfo#winInfo.breaks]}.
-
-%%--------------------------------------------------------------------
-%% update_break(WinInfo, {Point, Options})
-%% WinInfo = #winInfo{}
-%% Point = {Mod, Line}
-%% Options = [Status, Action, Mods, Cond]
-%% Status = active | inactive
-%% Action = enable | disable | delete
-%% Mods = null (not used)
-%% Cond = null | {Mod, Func}
-%%--------------------------------------------------------------------
-update_break(WinInfo, {Point, Options}) ->
- {value, BreakInfo} = lists:keysearch(Point, #breakInfo.point,
- WinInfo#winInfo.breaks),
- dbg_ui_win:update_break(BreakInfo#breakInfo.break, Options).
-
-%%--------------------------------------------------------------------
-%% delete_break(WinInfo, Point) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Point = {Mod, Line}
-%%--------------------------------------------------------------------
-delete_break(WinInfo, Point) ->
- {value, BreakInfo} = lists:keysearch(Point, #breakInfo.point,
- WinInfo#winInfo.breaks),
- dbg_ui_win:delete_break(BreakInfo#breakInfo.break),
- WinInfo#winInfo{breaks=lists:keydelete(Point, #breakInfo.point,
- WinInfo#winInfo.breaks)}.
-
-%%--------------------------------------------------------------------
-%% clear_breaks(WinInfo) -> WinInfo
-%% clear_breaks(WinInfo, Mod) -> WinInfo
-%% WinInfo = #winInfo{}
-%%--------------------------------------------------------------------
-clear_breaks(WinInfo) ->
- lists:foreach(fun(BreakInfo) ->
- dbg_ui_win:delete_break(BreakInfo#breakInfo.break)
- end,
- WinInfo#winInfo.breaks),
- WinInfo#winInfo{breaks=[]}.
-clear_breaks(WinInfo, Mod) ->
- Fun =
- fun(BreakInfo) ->
- case BreakInfo#breakInfo.point of
- {Mod, _Line} ->
- dbg_ui_win:delete_break(BreakInfo#breakInfo.break),
- false;
- _ -> true
- end
- end,
- Breaks = lists:filter(Fun, WinInfo#winInfo.breaks),
- WinInfo#winInfo{breaks=Breaks}.
-
-%%--------------------------------------------------------------------
-%% handle_event(GSEvent, WinInfo) -> Command
-%% GSEvent = {gs, Id, Event, Data, Arg}
-%% WinInfo = #winInfo{}
-%% Command = ignore
-%% | stopped
-%% | {coords, {X,Y}}
-%%
-%% | {shortcut, Key}
-%% | MenuItem | {Menu, [MenuItem]}
-%% MenuItem = Menu = atom()
-%% | {break, Point, What}
-%% What = delete | {status, Status} | {trigger, Trigger}
-%% | {module, Mod, What}
-%% What = view | delete
-%%
-%% | {focus, Pid, WinInfo}
-%% | default
-%%--------------------------------------------------------------------
-%% Window events
-handle_event({gs, _Id, configure, _Data, [W, H |_]}, WinInfo) ->
- configure(WinInfo, {W, H}),
- ignore;
-handle_event({gs, _Id, destroy, _Data, _Arg}, _WinInfo) ->
- stopped;
-handle_event({gs, _Id, motion, _Data, [X,Y]}, WinInfo) ->
- {LastX, LastY} = dbg_ui_win:motion(X, Y),
- Win = WinInfo#winInfo.window,
- {coords, {gs:read(Win, x)+LastX-5, gs:read(Win, y)+LastY-5}};
-
-%% Menus and keyboard shortcuts
-handle_event({gs, _Id, keypress, _Data, [Key,_,_,1]}, _WinInfo) when
- Key/='Up', Key/='Down', Key/=p, Key/=n ->
- {shortcut, Key};
-handle_event({gs, _Id, click, {dbg_ui_winman, Win}, _Arg}, _WinInfo) ->
- dbg_ui_winman:raise(Win),
- ignore;
-handle_event({gs, _Id, click, {menuitem, Name}, _Arg}, _WinInfo) ->
- Name;
-handle_event({gs, _Id, click, {menu, Menu}, _Arg}, _WinInfo) ->
- Names = dbg_ui_win:selected(Menu),
- {Menu, Names};
-handle_event({gs, _Id, click, {break, Point, What}, _Arg}, _WinInfo) ->
- {break, Point, What};
-handle_event({gs, _Id, click, {module, Mod, What}, _Arg}, _WinInfo) ->
- {module, Mod, What};
-
-%% Listbox
-handle_event({gs, _Id, doubleclick, listbox, [_Index, ModS|_]}, _WI) ->
- {module, list_to_atom(ModS), view};
-
-%% Auto attach buttons
-handle_event({gs, _Id, click, autoattach, _Arg}, WinInfo) ->
- Names = lists:foldl(fun (Button, NamesAcc) ->
- case gs:read(Button, select) of
- true ->
- {text, Name} =
- gs:read(Button, label),
- [list_to_atom(Name)|NamesAcc];
- false ->
- NamesAcc
- end
- end,
- [],
- [WinInfo#winInfo.ebutton,
- WinInfo#winInfo.bbutton,
- WinInfo#winInfo.fbutton]),
- {'Auto Attach', Names};
-
-%% Process grid
-handle_event({gs, _Id, keypress, _Data, [Key|_]}, WinInfo) when
- Key =:= 'Up'; Key =:= 'Down' ->
- Dir = if Key =:= 'Up' -> up; Key =:= 'Down' -> down end,
- Row = move(WinInfo, Dir),
- if Row>1 ->
- WinInfo2 = highlight(WinInfo, Row),
- #procInfo{pid=Pid} =
- lists:keyfind(Row, #procInfo.row, WinInfo#winInfo.processes),
- {focus, Pid, WinInfo2};
- true ->
- ignore
- end;
-handle_event({gs, _Id, click, {gridline, Pid}, [_Col,Row|_]}, WinInfo) ->
- WinInfo2 = highlight(WinInfo, Row),
- {focus, Pid, WinInfo2};
-handle_event({gs, _Id, doubleclick, _Data, _Arg}, _WinInfo) ->
- default;
-
-handle_event(_GSEvent, _WinInfo) ->
- ignore.
-
-move(WinInfo, Dir) ->
- Row = WinInfo#winInfo.focus,
- Last = WinInfo#winInfo.row,
- if
- Dir =:= up, Row > 1 -> Row-1;
- Dir =:= down, Row < Last -> Row+1;
- true -> Row
- end.
-
-highlight(WinInfo, Row) ->
- Grid = WinInfo#winInfo.grid,
- case WinInfo#winInfo.focus of
- 0 -> ignore;
- Focus ->
- GridLine1 = gs:read(Grid, {obj_at_row, Focus}),
- gs:config(GridLine1, {fg, black})
- end,
- GridLine2 = gs:read(Grid, {obj_at_row, Row}),
- gs:config(GridLine2, {fg, white}),
- WinInfo#winInfo{focus=Row}.
-
-%%====================================================================
-%% Internal functions
-%%====================================================================
-
-configure(WinInfo, {W, H}) ->
- Grid = WinInfo#winInfo.grid,
- NewW = W - (2*?PAD+?Wf),
- Dx = NewW - gs:read(Grid, width),
- Dy = H-42 - gs:read(Grid, height),
- if
- (Dx+Dy) =/= 0 ->
- gs:config(Grid, [{width, NewW}, {height, H-30}]),
- Cols = calc_columnwidths(NewW),
- gs:config(Grid, Cols);
- true ->
- ok
- end.
-
-calc_columnwidths(Width) ->
- W = if
- Width =< ?Wg -> ?Wg;
- true -> Width
- end,
- First = [round(X) || X <- [0.13*W, 0.27*W, 0.18*W, 0.18*W]],
- Last = W - lists:sum(First) - 30,
- {columnwidths, First++[Last]}.
diff --git a/lib/debugger/src/dbg_ui_settings.erl b/lib/debugger/src/dbg_ui_settings.erl
deleted file mode 100644
index fcfd67966f..0000000000
--- a/lib/debugger/src/dbg_ui_settings.erl
+++ /dev/null
@@ -1,162 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2011. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_settings).
-
--include_lib("kernel/include/file.hrl").
-
-%% External exports
--export([start/4]).
-
-%% Internal exports
--export([init/6]).
-
-%% OTP-6011 What's denoted gs="Graphics system id" is now in fact
-%% the object id of the monitor window.
--record(state, {gs, % term() Graphics system id
- win, % term() Settings dialog window data
- monitor, % pid() Monitor pid
- action % load | save
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(GS, Pos, Action, SFile)
-%% GS = Graphics system id
-%% Pos = {X,Y}
-%% Action = load | save
-%% SFile = default | string()
-%%--------------------------------------------------------------------
-start(GS, Pos, Action, SFile) ->
- Title = case Action of
- load -> "Load Settings Dialog";
- save -> "Save Settings Dialog"
- end,
- case dbg_ui_winman:is_started(Title) of
- true -> ignore;
- false ->
- spawn(?MODULE, init, [self(), GS, Pos, Title, Action, SFile])
- end.
-
-%%====================================================================
-%% Internal exports
-%%====================================================================
-
-init(Monitor, GS, Pos, Title, Action, SFile) ->
- {SDir, SFileName} =
- if
- %% If settings are saved for the first time, and to
- %% the default directory HOME/erlang.tools/debugger,
- %% make sure the directory exists, or create it if
- %% desired and possible
- SFile==default -> {default_settings_dir(GS), "NoName.state"};
- true -> {filename:dirname(SFile), filename:basename(SFile)}
- end,
-
- Filter = filename:join(SDir, "*.state"),
- Extra = fun(_File) -> true end,
-
- %% Create window
- Win = case Action of
- load ->
- dbg_ui_filedialog_win:create_win(GS, Title, Pos, normal,
- Filter, Extra);
- save ->
- dbg_ui_filedialog_win:create_win(GS, Title, Pos, normal,
- Filter, Extra, SFileName)
- end,
- Window = dbg_ui_filedialog_win:get_window(Win),
- dbg_ui_winman:insert(Title, Window),
-
- State = #state{gs=GS, win=Win, monitor=Monitor, action=Action},
- loop(State).
-
-
-%%====================================================================
-%% Main loop and message handling
-%%====================================================================
-
-loop(State) ->
- receive
-
- %% From the GUI
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd = dbg_ui_filedialog_win:handle_event(GuiEvent,
- State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, _Data} ->
- loop(State);
- {dbg_ui_winman, destroy} ->
- exit(normal)
- end.
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd({stopped, _Dir}, _State) ->
- exit(normal);
-gui_cmd({win, Win}, State) ->
- State#state{win=Win};
-gui_cmd({select, File}, State) ->
- State#state.monitor ! {dbg_ui_settings, File, State#state.action},
- exit(normal).
-
-
-%%====================================================================
-%% Internal functions
-%%====================================================================
-
-default_settings_dir(GS) ->
- {ok, [[Home]]} = init:get_argument(home),
- DefDir = filename:join([Home, ".erlang_tools", "debugger"]),
-
- case filelib:is_dir(DefDir) of
- true -> DefDir;
- false ->
- {ok, CWD} = file:get_cwd(),
-
- Msg = ["Default directory", DefDir, "does not exist.",
- "Click OK to create it or",
- "Cancel to use other directory."],
- case tool_utils:confirm(GS, Msg) of
- ok ->
- ToolsDir = filename:dirname(DefDir),
- case filelib:is_dir(ToolsDir) of
- true ->
- case file:make_dir(DefDir) of
- ok -> DefDir;
- _Error -> CWD
- end;
- false ->
- case file:make_dir(ToolsDir) of
- ok ->
- case file:make_dir(DefDir) of
- ok -> DefDir;
- _Error -> CWD
- end;
- _Error -> CWD
- end
- end;
- cancel -> CWD
- end
- end.
diff --git a/lib/debugger/src/dbg_ui_trace.erl b/lib/debugger/src/dbg_ui_trace.erl
deleted file mode 100644
index 3e1fb2dcae..0000000000
--- a/lib/debugger/src/dbg_ui_trace.erl
+++ /dev/null
@@ -1,814 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2013. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_trace).
-
-%% External exports
--export([start/1, start/3]).
--export([title/1]).
-
--define(TRACEWIN, ['Button Area', 'Evaluator Area', 'Bindings Area']).
--define(BACKTRACE, 100).
-
--record(state, {gs, % term() Graphics system id
- win, % term() Attach process window data
- coords, % {X,Y} Mouse point position
-
- pid, % pid() Debugged process
- meta, % pid() Meta process
- status, % {Status,Mod,Line} | {exit,Where,Reason}
- % Status = init | idle | break
- % | wait_break | wait_running
- % | running
- % Where={Mod,Line} | null
-
- cm, % atom() | undefined Current module
- cm_obsolete=false, % boolean() Curr mod needs reloading
-
- stack, % {Cur,Max}
-
- trace, % boolean()
- stack_trace, % all | no_tail | false
- backtrace % integer() #call frames to fetch
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(Pid)
-%% start(Pid, TraceWin, BackTrace)
-%% Pid = pid()
-%% TraceWin = [WinArea]
-%% WinArea = 'Button|Evaluator|Bindings|Trace Area'
-%% Backtrace = integer()
-%%--------------------------------------------------------------------
-start(Pid) -> % Used by debugger:quick/3 (no monitor)
- start(Pid, ?TRACEWIN, ?BACKTRACE).
-start(Pid, TraceWin, BackTrace) ->
- case {whereis(dbg_wx_mon), whereis(dbg_ui_mon)} of
- {undefined, undefined} ->
- case which_gui() of
- gs ->
- start2(Pid, TraceWin, BackTrace);
- wx ->
- dbg_wx_trace:start(Pid, TraceWin, BackTrace)
- end;
- {undefined, Monitor} when is_pid(Monitor) ->
- start2(Pid, TraceWin, BackTrace);
- {Monitor, _} when is_pid(Monitor) ->
- dbg_wx_trace:start(Pid, TraceWin, BackTrace)
- end.
-
-start2(Pid, TraceWin, BackTrace) ->
- %% Inform int about my existence and get the meta pid back
- case int:attached(Pid) of
- {ok, Meta} ->
- init(Pid, Meta, TraceWin, BackTrace);
- error ->
- ignore
- end.
-
-which_gui() ->
- try
- wx:new(),
- wx:destroy(),
- wx
- catch _:_ ->
- gs
- end.
-
-%%--------------------------------------------------------------------
-%% title(Pid) -> string()
-%% By exporting this function, dbg_ui_mon may check with dbg_ui_winman
-%% if there already is an attach window for a given pid and thus avoid
-%% spawning processes unnecessarily.
-%%--------------------------------------------------------------------
-title(Pid) ->
- "Attach Process " ++ pid_to_list(Pid).
-
-
-%%====================================================================
-%% Main loop and message handling
-%%====================================================================
-
-init(Pid, Meta, TraceWin, BackTrace) ->
-
- %% Start necessary stuff
- GS = dbg_ui_trace_win:init(), % Graphics system
-
- %% Create attach process window
- Title = title(Pid),
- Win = dbg_ui_trace_win:create_win(GS, Title, TraceWin, menus()),
- Window = dbg_ui_trace_win:get_window(Win),
- dbg_ui_winman:insert(Title, Window),
-
- %% Initial process state
- State1 = #state{gs=GS, win=Win, coords={0,0}, pid=Pid, meta=Meta,
- status={idle,null,null},
- stack={1,1}},
-
- State2 = init_options(TraceWin,
- int:stack_trace(), % Stack Trace
- BackTrace, % Back trace size
- State1),
-
- State3 = init_contents(int:all_breaks(), % Breakpoints
- State2),
-
- int:meta(Meta, trace, State3#state.trace),
-
- gui_enable_updown(stack_trace, {1,1}),
- gui_enable_btrace(false, false),
- dbg_ui_trace_win:display(idle),
-
- loop(State3).
-
-init_options(TraceWin, StackTrace, BackTrace, State) ->
- lists:foreach(fun(Area) -> dbg_ui_trace_win:select(Area, true) end,
- TraceWin),
-
- Trace = lists:member('Trace Area', TraceWin),
-
- dbg_ui_trace_win:select(map(StackTrace), true),
-
- %% Backtrace size is (currently) not shown in window
-
- State#state{trace=Trace,stack_trace=StackTrace,backtrace=BackTrace}.
-
-init_contents(Breaks, State) ->
- Win =
- lists:foldl(fun(Break, Win) ->
- dbg_ui_trace_win:add_break(Win,
- 'Break',Break)
- end,
- State#state.win,
- Breaks),
-
- State#state{win=Win}.
-
-loop(#state{meta=Meta} = State) ->
- receive
-
- %% From the GUI main window
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd =
- dbg_ui_trace_win:handle_event(GuiEvent,State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the GUI help windows
- {gui, Cmd} ->
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the interpreter
- {int, Cmd} ->
- State2 = int_cmd(Cmd, State),
- loop(State2);
-
- %% From the meta process
- {Meta, Cmd} ->
- State2 = meta_cmd(Cmd, State),
- loop(State2);
- {NewMeta, {exit_at, Where, Reason, Cur}} ->
- State2 = meta_cmd({exit_at, Where, Reason, Cur},
- State#state{meta=NewMeta}),
- loop(State2);
-
- %% From the dbg_ui_edit process
- {dbg_ui_edit, 'Backtrace:', BackTrace} ->
- loop(State#state{backtrace=BackTrace});
- {dbg_ui_edit, Var, Val} ->
- Cmd = atom_to_list(Var)++"="++io_lib:format("~p", [Val]),
- State2 = gui_cmd({user_command, lists:flatten(Cmd)}, State),
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, Data} ->
- dbg_ui_winman:update_windows_menu(Data),
- loop(State);
- {dbg_ui_winman, destroy} ->
- exit(stop)
- end.
-
-%%--Commands from the GUI---------------------------------------------
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd({win, Win}, State) ->
- State#state{win=Win};
-gui_cmd(stopped, _State) ->
- exit(stop);
-gui_cmd({coords, Coords}, State) ->
- State#state{coords=Coords};
-
-gui_cmd({shortcut, Key}, State) ->
- case shortcut(Key) of
- {always, Cmd} -> gui_cmd(Cmd, State);
- {if_enabled, Cmd} ->
- case dbg_ui_trace_win:is_enabled(Cmd) of
- true -> gui_cmd(Cmd, State);
- false -> State
- end;
- false -> State
- end;
-
-%% File menu
-gui_cmd('Close', State) ->
- gui_cmd(stopped, State);
-
-%% Edit menu
-gui_cmd('Go To Line...', State) ->
- %% Will result in message handled below: {gui, {gotoline, Line}}
- dbg_ui_trace_win:helpwin(gotoline, State#state.win,
- State#state.gs, State#state.coords),
- State;
-gui_cmd({gotoline, Line}, State) ->
- Win = dbg_ui_trace_win:select_line(State#state.win, Line),
- State#state{win=Win};
-gui_cmd('Search...', State) ->
- dbg_ui_trace_win:helpwin(search, State#state.win,
- State#state.gs, State#state.coords),
- State;
-
-%% Process menu
-gui_cmd('Step', State) ->
- int:meta(State#state.meta, step),
- State;
-gui_cmd('Next', State) ->
- int:meta(State#state.meta, next),
- State;
-gui_cmd('Continue', State) ->
- int:meta(State#state.meta, continue),
- {Status, Mod, Line} = State#state.status,
- if
- Status==wait_break ->
- Win = dbg_ui_trace_win:unmark_line(State#state.win),
- gui_enable_functions(wait_running),
- State#state{win=Win, status={wait_running,Mod,Line}};
- true ->
- dbg_ui_trace_win:enable(['Stop'], true),
- dbg_ui_trace_win:enable(['Continue'], false),
- State
- end;
-gui_cmd('Finish', State) ->
- int:meta(State#state.meta, finish),
- State;
-gui_cmd('Skip', State) ->
- int:meta(State#state.meta, skip),
- State;
-gui_cmd('Time Out', State) ->
- int:meta(State#state.meta, timeout),
- State;
-gui_cmd('Stop', State) ->
- int:meta(State#state.meta, stop),
- {Status, Mod, Line} = State#state.status,
- if
- Status==wait_running ->
- Win = dbg_ui_trace_win:mark_line(State#state.win, Line,
- break),
- gui_enable_functions(wait_break),
- gui_enable_updown(State#state.stack_trace,
- State#state.stack),
- gui_enable_btrace(State#state.trace,
- State#state.stack_trace),
- dbg_ui_trace_win:display({wait, Mod, Line}),
- State#state{win=Win, status={wait_break,Mod,Line}};
- true ->
- dbg_ui_trace_win:enable(['Stop'], false),
- dbg_ui_trace_win:enable(['Continue'], true),
- State
- end;
-gui_cmd('Where', State) ->
- {_Cur, Max} = State#state.stack,
- Stack = {Max, Max},
- {_Status, Mod, Line} = State#state.status,
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid, break),
- gui_update_bindings(State#state.meta),
- gui_enable_updown(State#state.stack_trace, Stack),
- dbg_ui_trace_win:display(State#state.status),
- State#state{win=Win, cm=Mod, stack=Stack};
-
-gui_cmd('Kill', State) ->
- exit(State#state.pid, kill),
- State;
-gui_cmd('Messages', State) ->
- case int:meta(State#state.meta, messages) of
- [] ->
- dbg_ui_trace_win:eval_output("< No Messages!\n", bold);
- Messages ->
- dbg_ui_trace_win:eval_output("< --- Current Messages ---\n",
- bold),
- lists:foldl(
- fun(Msg, N) ->
- Str1 = io_lib:format(" ~w:", [N]),
- dbg_ui_trace_win:eval_output(Str1, bold),
- Str2 = io_lib:format(" ~ts~n",[io_lib:print(Msg)]),
- dbg_ui_trace_win:eval_output(Str2, normal),
- N+1
- end,
- 1,
- Messages)
- end,
- State;
-gui_cmd('Back Trace', State) ->
- dbg_ui_trace_win:trace_output("\nBACK TRACE\n----------\n"),
- lists:foreach(
- fun({Le, {Mod,Func,Args}}) ->
- Str = io_lib:format("~p > ~p:~p~p~n",
- [Le, Mod, Func, Args]),
- dbg_ui_trace_win:trace_output(Str);
- ({Le, {Fun,Args}}) ->
- Str = io_lib:format("~p > ~p~p~n", [Le, Fun, Args]),
- dbg_ui_trace_win:trace_output(Str);
- (_) -> ignore
- end,
- int:meta(State#state.meta, backtrace, State#state.backtrace)),
- dbg_ui_trace_win:trace_output("\n"),
- State;
-gui_cmd('Up', State) ->
- {Cur, Max} = State#state.stack,
- case int:meta(State#state.meta, stack_frame, {up, Cur}) of
- {New, {undefined,-1}, _Bs} -> % call from non-interpreted code
- Stack = {New, Max},
- Win = dbg_ui_trace_win:show_no_code(State#state.win),
- dbg_ui_trace_win:update_bindings([]),
- gui_enable_updown(State#state.stack_trace, Stack),
- dbg_ui_trace_win:display({New,null,null}),
- State#state{win=Win, cm=null, stack=Stack};
-
- {New, {Mod,Line}, Bs} ->
- Stack = {New, Max},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid,
- where),
- dbg_ui_trace_win:update_bindings(Bs),
- gui_enable_updown(State#state.stack_trace, Stack),
- dbg_ui_trace_win:display({New,Mod,Line}),
- State#state{win=Win, cm=Mod, stack=Stack};
- top ->
- dbg_ui_trace_win:enable(['Up'], false),
- State
- end;
-gui_cmd('Down', State) ->
- {Cur, Max} = State#state.stack,
- case int:meta(State#state.meta, stack_frame, {down, Cur}) of
- {New, {undefined,-1}, _Bs} -> % call from non-interpreted code
- Stack = {New, Max},
- Win = dbg_ui_trace_win:show_no_code(State#state.win),
- dbg_ui_trace_win:update_bindings([]),
- gui_enable_updown(State#state.stack_trace, Stack),
- dbg_ui_trace_win:display({New,null,null}),
- State#state{win=Win, cm=null, stack=Stack};
-
- {New, {Mod,Line}, Bs} ->
- Stack = {New, Max},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid,
- where),
- dbg_ui_trace_win:update_bindings(Bs),
- gui_enable_updown(State#state.stack_trace, Stack),
- dbg_ui_trace_win:display({New,Mod,Line}),
- State#state{win=Win, cm=Mod, stack=Stack};
-
- bottom ->
- gui_cmd('Where', State)
- end;
-
-%% Break menu
-gui_cmd('Line Break...', State) ->
- add_break(State#state.gs, State#state.coords, line,
- State#state.cm,
- dbg_ui_trace_win:selected_line(State#state.win)),
- State;
-gui_cmd('Conditional Break...', State) ->
- add_break(State#state.gs, State#state.coords, conditional,
- State#state.cm,
- dbg_ui_trace_win:selected_line(State#state.win)),
- State;
-gui_cmd('Function Break...', State) ->
- add_break(State#state.gs, State#state.coords, function,
- State#state.cm, undefined),
- State;
-gui_cmd('Enable All', State) ->
- Breaks = int:all_breaks(),
- ThisMod = State#state.cm,
- lists:foreach(fun ({{Mod, Line}, _Options}) when Mod==ThisMod ->
- int:enable_break(Mod, Line);
- (_Break) ->
- ignore
- end,
- Breaks),
- State;
-gui_cmd('Disable All', State) ->
- Breaks = int:all_breaks(),
- ThisMod = State#state.cm,
- lists:foreach(fun ({{Mod, Line}, _Options}) when Mod==ThisMod ->
- int:disable_break(Mod, Line);
- (_Break) ->
- ignore
- end,
- Breaks),
- State;
-gui_cmd('Delete All', State) ->
- int:no_break(State#state.cm),
- State;
-gui_cmd({break, {Mod, Line}, What}, State) ->
- case What of
- add -> int:break(Mod, Line);
- delete -> int:delete_break(Mod, Line);
- {status, inactive} -> int:disable_break(Mod, Line);
- {status, active} -> int:enable_break(Mod, Line);
- {trigger, Action} -> int:action_at_break(Mod, Line, Action)
- end,
- State;
-
-%% Options menu
-gui_cmd({'Trace Window', TraceWin}, State) ->
- Trace = lists:member('Trace Area', TraceWin),
- int:meta(State#state.meta, trace, Trace),
- Win = dbg_ui_trace_win:configure(State#state.win, TraceWin),
- {Status,_,_} = State#state.status,
- if
- Status==break; Status==wait_break ->
- gui_enable_btrace(Trace, State#state.stack_trace);
- true -> ignore
- end,
- State#state{win=Win, trace=Trace};
-gui_cmd({'Stack Trace', [Name]}, State) ->
- int:meta(State#state.meta, stack_trace, map(Name)),
- {Status,_,_} = State#state.status,
- if
- Status==break; Status==wait_break ->
- gui_enable_btrace(State#state.trace, map(Name));
- true -> ignore
- end,
- State;
-gui_cmd('Back Trace Size...', State) ->
- dbg_ui_edit:start(State#state.gs, State#state.coords, "Backtrace",
- 'Backtrace:', {integer, State#state.backtrace}),
- State;
-
-%% Help menu
-gui_cmd('Debugger', State) ->
- Window = dbg_ui_trace_win:get_window(State#state.win),
- HelpFile = filename:join([code:lib_dir(debugger),
- "doc", "html", "part_frame.html"]),
- tool_utils:open_help(Window, HelpFile),
- State;
-
-gui_cmd({user_command, Cmd}, State) ->
- {Status, _Mod, _Line} = State#state.status,
- if
- Status==break;
- Status==wait_break;
- Status==wait_running ->
- Cm = State#state.cm,
- Arg = case State#state.stack of
- {Cur, Max} when Cur<Max -> {Cm, Cmd, Cur};
- _Stack -> {Cm, Cmd}
- end,
-
- %% Reply will be received as {Meta, {eval_rsp, Res}}
- int:meta(State#state.meta, eval, Arg);
- true ->
- Str = "Commands not allowed",
- dbg_ui_trace_win:eval_output([$<,Str,10], normal)
- end,
- State;
-
-gui_cmd({edit, {Var, Val}}, State) ->
- dbg_ui_edit:start(State#state.gs, State#state.coords,
- "Edit variable", Var, {term, Val}),
- State.
-
-add_break(GS, Coords, Type, undefined, _Line) ->
- dbg_ui_break:start(GS, Coords, Type);
-add_break(GS, Coords, Type, Mod, undefined) ->
- dbg_ui_break:start(GS, Coords, Type, Mod);
-add_break(GS, Coords, Type, Mod, Line) ->
- dbg_ui_break:start(GS, Coords, Type, Mod, Line).
-
-%%--Commands from the interpreter-------------------------------------
-
-int_cmd({interpret, Mod}, State) ->
- if
- Mod==State#state.cm ->
- State#state{cm_obsolete=true};
- true ->
- State
- end;
-int_cmd({no_interpret, Mod}, State) ->
- if
- Mod==State#state.cm ->
- State#state{cm_obsolete=true};
- true ->
- Win = dbg_ui_trace_win:remove_code(State#state.win, Mod),
- State#state{win=Win}
- end;
-
-int_cmd({new_break, Break}, State) ->
- Win = dbg_ui_trace_win:add_break(State#state.win, 'Break', Break),
- State#state{win=Win};
-int_cmd({delete_break, Point}, State) ->
- Win = dbg_ui_trace_win:delete_break(State#state.win, Point),
- State#state{win=Win};
-int_cmd({break_options, Break}, State) ->
- Win = dbg_ui_trace_win:update_break(State#state.win, Break),
- State#state{win=Win};
-int_cmd(no_break, State) ->
- Win = dbg_ui_trace_win:clear_breaks(State#state.win),
- State#state{win=Win};
-int_cmd({no_break, Mod}, State) ->
- Win = dbg_ui_trace_win:clear_breaks(State#state.win, Mod),
- State#state{win=Win}.
-
-%%--Commands from the meta process------------------------------------
-
-%% Message received when first attached to a living process
-%% '_Trace' is a boolean indicating if the process is traced or not --
-%% ignore this as we already have ordered tracing or not depending on if
-%% the Trace Area is shown or not.
-meta_cmd({attached, Mod, Line, _Trace}, State) ->
- Win = if
- Mod/=undefined ->
- gui_enable_functions(init),
- gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid,
- break);
- true -> State#state.win
- end,
- State#state{win=Win, status={init,Mod,Line}, cm=Mod};
-
-%% Message received when returning to interpreted code
-meta_cmd({re_entry, dbg_ieval, eval_fun}, State) ->
- State;
-meta_cmd({re_entry, Mod, _Func}, State) ->
- Obs = State#state.cm_obsolete,
- case State#state.cm of
- Mod when Obs==true ->
- Win = gui_load_module(State#state.win, Mod,State#state.pid),
- State#state{win=Win, cm_obsolete=false};
- Mod -> State;
- Cm ->
- Win = gui_show_module(State#state.win, Mod, 0,
- Cm, State#state.pid, break),
- State#state{win=Win, cm=Mod}
- end;
-
-%% Message received when attached to a terminated process
-meta_cmd({exit_at, null, Reason, Cur}, State) ->
- Stack = {Cur, Cur},
- gui_enable_functions(exit),
- gui_enable_updown(false, Stack),
- dbg_ui_trace_win:display({exit, null, Reason}),
- State#state{status={exit,null,Reason}, stack=Stack};
-meta_cmd({exit_at, {Mod,Line}, Reason, Cur}, State) ->
- Stack = {Cur+1, Cur+1},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid, break),
- gui_enable_functions(exit),
- gui_enable_updown(State#state.stack_trace, Stack),
- gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.meta),
- dbg_ui_trace_win:display({exit, {Mod,Line}, Reason}),
- State#state{win=Win, cm=Mod,status={exit,{Mod,Line},Reason},
- stack=Stack};
-
-meta_cmd({break_at, Mod, Line, Cur}, State) ->
- Stack = {Cur,Cur},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid, break),
- gui_enable_functions(break),
- gui_enable_updown(State#state.stack_trace, Stack),
- gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.meta),
- dbg_ui_trace_win:display({break, Mod, Line}),
- State#state{win=Win, cm=Mod, status={break,Mod,Line}, stack=Stack};
-meta_cmd({func_at, Mod, Line, Cur}, State) ->
- Stack = {Cur,Cur},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid, where),
- gui_enable_functions(idle),
- dbg_ui_trace_win:display(idle),
- State#state{win=Win, cm=Mod, status={idle,Mod,Line}, stack=Stack};
-meta_cmd({wait_at, Mod, Line, Cur}, #state{status={Status,_,_}}=State)
- when Status/=init, Status/=break ->
- Stack = {Cur,Cur},
- gui_enable_functions(wait_running),
- dbg_ui_trace_win:display({wait,Mod,Line}),
- State#state{status={wait_running,Mod,Line}, stack=Stack};
-meta_cmd({wait_at, Mod, Line, Cur}, State) ->
- Stack = {Cur,Cur},
- Win = gui_show_module(State#state.win, Mod, Line,
- State#state.cm, State#state.pid, break),
- gui_enable_functions(wait_break),
- gui_enable_updown(State#state.stack_trace, Stack),
- gui_enable_btrace(State#state.trace, State#state.stack_trace),
- gui_update_bindings(State#state.meta),
- dbg_ui_trace_win:display({wait, Mod, Line}),
- State#state{win=Win, cm=Mod, status={wait_break,Mod,Line},
- stack=Stack};
-meta_cmd({wait_after_at, Mod, Line, Sp}, State) ->
- meta_cmd({wait_at, Mod, Line, Sp}, State);
-meta_cmd(running, State) ->
- Win = dbg_ui_trace_win:unmark_line(State#state.win),
- gui_enable_functions(running),
- dbg_ui_trace_win:update_bindings([]),
- dbg_ui_trace_win:display({running, State#state.cm}),
- State#state{win=Win, status={running,null,null}};
-
-meta_cmd(idle, State) ->
- Win = dbg_ui_trace_win:show_no_code(State#state.win),
- gui_enable_functions(idle),
- dbg_ui_trace_win:update_bindings([]),
- dbg_ui_trace_win:display(idle),
- State#state{win=Win, status={idle,null,null}, cm=undefined};
-
-%% Message about changed trace option can be ignored, the change must
-%% have been ordered by this process. (In theory, the change could have
-%% been ordered by another attached process. The Debugger, though,
-%% allows max one attached process per debugged process).
-meta_cmd({trace, _Bool}, State) ->
- State;
-
-meta_cmd({stack_trace, Flag}, State) ->
- dbg_ui_trace_win:select(map(Flag), true),
- gui_enable_updown(Flag, State#state.stack),
- {Status,_,_} = State#state.status,
- if
- Status==break; Status==wait_break ->
- gui_enable_btrace(State#state.trace, Flag);
- true -> ignore
- end,
- State#state{stack_trace=Flag};
-
-meta_cmd({trace_output, Str}, State) ->
- dbg_ui_trace_win:trace_output(Str),
- State;
-
-%% Reply on a user command
-meta_cmd({eval_rsp, Res}, State) ->
- Str = io_lib:print(Res),
- dbg_ui_trace_win:eval_output([$<,Str,10], normal),
- State.
-
-
-%%====================================================================
-%% GUI auxiliary functions
-%%====================================================================
-
-menus() ->
- [{'File', [{'Close', no}]},
- {'Edit', [{'Go To Line...', no},
- {'Search...', no}]},
- {'Process', [{'Step', 0},
- {'Next', 0},
- {'Continue', 0},
- {'Finish', 0},
- {'Skip', no},
- {'Time Out', no},
- {'Stop', no},
- separator,
- {'Kill', no},
- separator,
- {'Messages', 0},
- {'Back Trace', no},
- separator,
- {'Where', 0},
- {'Up', no},
- {'Down', no}]},
- {'Break', [{'Line Break...', 5},
- {'Conditional Break...', no},
- {'Function Break...', no},
- separator,
- {'Enable All', no},
- {'Disable All', no},
- {'Delete All', 0},
- separator]},
- {'Options', [{'Trace Window', no, cascade,
- [{'Button Area', no, check},
- {'Evaluator Area', no, check},
- {'Bindings Area', no, check},
- {'Trace Area', no, check}]},
- {'Stack Trace', no, cascade,
- [{'Stack On, Tail', no, radio},
- {'Stack On, No Tail', no, radio},
- {'Stack Off', no, radio}]},
- {'Back Trace Size...', no}]},
- {'Help', [{'Debugger', no}]}].
-
-%% enable(Status) -> [MenuItem]
-%% Status = init % when first message from Meta has arrived
-%% | idle | break | exit | wait_break | wait_running | running
-enable(init) -> [];
-enable(idle) -> ['Stop','Kill'];
-enable(break) -> ['Step','Next','Continue','Finish','Skip',
- 'Kill','Messages'];
-enable(exit) -> [];
-enable(wait_break) -> ['Continue','Time Out','Kill'];
-enable(wait_running) -> ['Stop','Kill'];
-enable(running) -> ['Stop','Kill'].
-
-all_buttons() ->
- ['Step','Next','Continue','Finish','Skip','Time Out','Stop',
- 'Kill','Messages','Back Trace','Where','Up','Down'].
-
-shortcut(s) -> {if_enabled, 'Step'};
-shortcut(n) -> {if_enabled, 'Next'};
-shortcut(c) -> {if_enabled, 'Continue'};
-shortcut(f) -> {if_enabled, 'Finish'};
-shortcut(m) -> {if_enabled, 'Messages'};
-shortcut(w) -> {if_enabled, 'Where'};
-
-shortcut(b) -> {always, 'Line Break...'};
-shortcut(d) -> {always, 'Delete All'};
-
-shortcut(_) -> false.
-
-map('Stack On, Tail') -> all; % Stack trace
-map('Stack On, No Tail') -> no_tail;
-map('Stack Off') -> false;
-map(all) -> 'Stack On, Tail';
-map(true) -> 'Stack On, Tail';
-map(no_tail) -> 'Stack On, No Tail';
-map(false) -> 'Stack Off'.
-
-
-%% gui_show_module(Win, Mod, Line, Cm, Pid, How) -> Win
-%% gui_show_module(Win, {Mod,Line}, _Reason, Cm, Pid, How) -> Win
-%% How = where | break
-%% Show contents of a module in code area
-gui_show_module(Win, {Mod,Line}, _Reason, Cm, Pid, How) ->
- gui_show_module(Win, Mod, Line, Cm, Pid, How);
-gui_show_module(Win, Mod, Line, Mod, _Pid, How) ->
- dbg_ui_trace_win:mark_line(Win, Line, How);
-gui_show_module(Win, Mod, Line, _Cm, Pid, How) ->
- Win2 = case dbg_ui_trace_win:is_shown(Win, Mod) of
- {true, Win3} -> Win3;
- false -> gui_load_module(Win, Mod, Pid)
- end,
- dbg_ui_trace_win:mark_line(Win2, Line, How).
-
-gui_load_module(Win, Mod, Pid) ->
- dbg_ui_trace_win:display({text, "Loading module..."}),
- Contents = int:contents(Mod, Pid),
- Win2 = dbg_ui_trace_win:show_code(Win, Mod, Contents),
- dbg_ui_trace_win:display({text, ""}),
- Win2.
-
-gui_update_bindings(Meta) ->
- Bs = int:meta(Meta, bindings, nostack),
- dbg_ui_trace_win:update_bindings(Bs).
-
-gui_enable_functions(Status) ->
- Enable = enable(Status),
- Disable = all_buttons() -- Enable,
- dbg_ui_trace_win:enable(Disable, false),
- dbg_ui_trace_win:enable(Enable, true).
-
-gui_enable_updown(Flag, Stack) ->
- {Enable, Disable} =
- if
- Flag==false -> {[], ['Up', 'Down']};
- true ->
- case Stack of
- {1,1} -> {[], ['Up', 'Down']};
- {2,2} -> {[], ['Up', 'Down']};
- {Max,Max} -> {['Up'], ['Down']};
- {2,_Max} -> {['Down'], ['Up']};
- {_Cur,_Max} -> {['Up', 'Down'], []}
- end
- end,
- dbg_ui_trace_win:enable(Enable, true),
- dbg_ui_trace_win:enable(Disable, false),
- if
- Enable==[] -> dbg_ui_trace_win:enable(['Where'], false);
- true -> dbg_ui_trace_win:enable(['Where'], true)
- end.
-
-gui_enable_btrace(Trace, StackTrace) ->
- Bool = if
- Trace==false -> false;
- StackTrace==false -> false;
- true -> true
- end,
- dbg_ui_trace_win:enable(['Back Trace'], Bool).
diff --git a/lib/debugger/src/dbg_ui_trace_win.erl b/lib/debugger/src/dbg_ui_trace_win.erl
deleted file mode 100644
index beb3fbd71e..0000000000
--- a/lib/debugger/src/dbg_ui_trace_win.erl
+++ /dev/null
@@ -1,1595 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_trace_win).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,checkbutton,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,4}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,editor,3}},
- {nowarn_deprecated_function,{gs,entry,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,grid,3}},
- {nowarn_deprecated_function,{gs,gridline,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,window,2}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-%% External exports
--export([init/0]).
--export([create_win/4, get_window/1,
- configure/2,
- enable/2, is_enabled/1, select/2,
- add_break/3, update_break/2, delete_break/2,
- clear_breaks/1, clear_breaks/2,
- display/1, % Help messages
- is_shown/2, % Code area
- show_code/3, show_no_code/1, remove_code/2,
- mark_line/3, unmark_line/1,
- select_line/2, selected_line/1,
- eval_output/2, % Evaluator area
- update_bindings/1, % Bindings area
- trace_output/1, % Trace area
- handle_event/2
- ]).
--export([helpwin/4, % Help windows
- helpwin/5]).
-
--record(breakInfo, {point, status, break}).
--record(winInfo, {window, % gsobj()
- size, % {W, H}
- flags, % {F,F,F,F} F = open|close
-
- marked_line=0, % integer() Current line
- selected_line=0, % integer() Selected line
-
- breaks=[], % [#breakInfo{}] Known breakpoints
-
- editor, % {Mod, Editor} Visible code editor
- editors=[] % [{Mod,Editor}] Code editors
- }).
-
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% init() -> GS
-%% GS = term()
-%%--------------------------------------------------------------------
-init() ->
- dbg_ui_win:init().
-
-%%--------------------------------------------------------------------
-%% create_win(GS, Title, TraceWin, Menus) -> #winInfo{}
-%% GS = gsobj()
-%% Title = string()
-%% TraceWin = [WinArea]
-%% WinArea = 'Button|Evaluator|Bindings|Trace Area'
-%% Menus = [menu()] See dbg_ui_win.erl
-%%--------------------------------------------------------------------
-create_win(GS, Title, TraceWin, Menus) ->
- Bu = flip(lists:member('Button Area', TraceWin)),
- Ev = flip(lists:member('Evaluator Area', TraceWin)),
- Bi = flip(lists:member('Bindings Area', TraceWin)),
- Tr = flip(lists:member('Trace Area', TraceWin)),
-
- Win = gs:window(trace_window, GS, [{title, Title},
- {width, 550},
- {configure,true}, {destroy,true},
- {keypress,true}, {motion,true}]),
-
- MenuBar = gs:menubar(Win, []),
- dbg_ui_win:create_menus(MenuBar, Menus),
- dbg_ui_winman:windows_menu(MenuBar),
-
- FrameOpts = [{anchor,nw}, {relief,raised}, {bw,2}, {keypress,true}],
- Editor = code_area(2, 25, FrameOpts, Win),
- button_area(Bu, 2, 235, FrameOpts, Win),
- eval_area({Ev,Bi}, 2, 265, FrameOpts, Win),
- bind_area({Ev,Bi}, 300, 265, FrameOpts, Win),
- trace_area(Tr, 2, 475, FrameOpts, Win),
-
- Flags = {Bu, Ev, Bi, Tr},
- resizebar(rb1(Flags), 'RB1', 2, 225, 710, 10, Win),
- resizebar(rb2(Flags), 'RB2', 2, 465, 710, 10, Win),
- resizebar(rb3(Flags), 'RB3', 290, 265, 10, 200, Win),
- config_v(),
- config_h(),
-
- gs:config(Win,{height,
- 25 +
- gs:read('CodeArea', height) +
- gs:read('RB1', height) +
- gs:read('ButtonArea', height) +
- erlang:max(gs:read('EvalArea', height),
- gs:read('BindArea', height)) +
- gs:read('RB2', height) +
- gs:read('TraceArea', height)}),
-
- gs:config(Win, {map, true}),
- #winInfo{window=Win, size={gs:read(Win,width), gs:read(Win,height)},
- flags=Flags,
- editor={'$top', Editor}, editors=[{'$top', Editor}]}.
-
-flip(true) -> open;
-flip(false) -> close.
-
-%%--------------------------------------------------------------------
-%% get_window(WinInfo) -> Window
-%% WinInfo = #winInfo{}
-%% Window = gsobj()
-%%--------------------------------------------------------------------
-get_window(WinInfo) ->
- WinInfo#winInfo.window.
-
-%%--------------------------------------------------------------------
-%% configure(WinInfo, TraceWin) -> WinInfo
-%% WinInfo = #winInfo{}
-%% TraceWin = [WinArea]
-%% WinArea = 'Button|Evaluator|Bindings|Trace Area'
-%% Window areas should be opened or closed.
-%%--------------------------------------------------------------------
-configure(WinInfo, TraceWin) ->
- {Bu1, Ev1, Bi1, Tr1} = OldFlags = WinInfo#winInfo.flags,
- Bu2 = flip(lists:member('Button Area', TraceWin)),
- Ev2 = flip(lists:member('Evaluator Area', TraceWin)),
- Bi2 = flip(lists:member('Bindings Area', TraceWin)),
- Tr2 = flip(lists:member('Trace Area', TraceWin)),
- NewFlags = {Bu2, Ev2, Bi2, Tr2},
-
- Win = WinInfo#winInfo.window,
- W = gs:read(Win, width),
- H = gs:read(Win, height),
-
- H2 = if
- Bu1 =:= close, Bu2 =:= open ->
- resize_button_area(open, width, W-4),
- gs:config('ButtonArea', {height, 30}),
- H+30;
- Bu1 =:= open, Bu2 =:= close ->
- gs:config('ButtonArea', [{width, 0}, {height, 0}]),
- H-30;
- true -> H
- end,
- H3 = if
- Ev1 =:= close, Ev2 =:= open, Bi1 =:= open ->
- Wnew1 = round((W-10-4)/2), % W = window/2 - rb - pads
- Hbi1 = gs:read('BindArea', height), % H = bind area h
- resize_eval_area(open, width, Wnew1),
- resize_eval_area(open, height, Hbi1),
- gs:config('RB3', {width, 10}),
- gs:config('RB3', {height, Hbi1}),
- resize_bind_area(open, width,
- Wnew1-gs:read('BindArea', width)),
- H2;
- Ev1 =:= close, Ev2 =:= open, Bi1 =:= close ->
- resize_eval_area(open, width, W-4),
- resize_eval_area(open, height, 200),
- H2+200;
- Ev1 =:= open, Ev2 =:= close, Bi1 =:= open ->
- gs:config('EvalArea', [{width,0}, {height,0}]),
- gs:config('RB3', [{width, 0}, {height, 0}]),
- Wnew2 = W-4,
- resize_bind_area(open, width,
- Wnew2-gs:read('BindArea', width)),
- H2;
- Ev1 =:= open, Ev2 =:= close, Bi1 =:= close ->
- Hs1 = gs:read('EvalArea', height),
- gs:config('EvalArea', [{width, 0}, {height, 0}]),
- H2-Hs1;
- true -> H2
- end,
- H4 = if
- Bi1 =:= close, Bi2 =:= open, Ev2 =:= open ->
- Wnew3 = round((W-10-4)/2), % W = window/2 - rb - pads
- Hs2 = gs:read('EvalArea', height), % H = eval area h
- resize_bind_area(open, width, Wnew3),
- resize_bind_area(open, height, Hs2),
- gs:config('RB3', [{width,10},{height,Hs2}]),
- resize_eval_area(open, width,
- Wnew3-gs:read('EvalArea', width)),
- H3;
- Bi1 =:= close, Bi2 =:= open, Ev2 =:= close ->
- resize_bind_area(open, width, W-4),
- resize_bind_area(open, height, 200),
- H3+200;
- Bi1 =:= open, Bi2 =:= close, Ev2 =:= open ->
- gs:config('BindArea', [{width, 0}, {height, 0}]),
- gs:config('RB3', [{width, 0}, {height, 0}]),
- Wnew4 = W-4,
- resize_eval_area(open, width,
- Wnew4-gs:read('EvalArea', width)),
- H3;
- Bi1 =:= open, Bi2 =:= close, Ev2 =:= close ->
- Hbi2 = gs:read('BindArea', height),
- gs:config('BindArea', [{width, 0}, {height, 0}]),
- H3-Hbi2;
- true -> H3
- end,
- H5 = if
- Tr1 =:= close, Tr2 =:= open ->
- resize_trace_area(open, width, W-4),
- resize_trace_area(open, height, 200),
- H4+200;
- Tr1 =:= open, Tr2 =:= close ->
- Hf = gs:read('TraceArea', height),
- gs:config('TraceArea', [{width, 0}, {height, 0}]),
- H4-Hf;
- true -> H4
- end,
- gs:config(Win, {height, H5}),
-
- RB1old = rb1(OldFlags), RB1new = rb1(NewFlags),
- if
- RB1old =:= close, RB1new =:= open ->
- gs:config('RB1', [{width, W-4}, {height, 10}]),
- gs:config(Win, {height, gs:read(Win, height)+10});
- RB1old =:= open, RB1new =:= close ->
- gs:config('RB1', [{width, 0}, {height, 0}, lower]),
- gs:config(Win, {height, gs:read(Win, height)-10});
- true -> ignore
- end,
-
- RB2old = rb2(OldFlags), RB2new = rb2(NewFlags),
- if
- RB2old =:= close, RB2new =:= open ->
- gs:config('RB2', [{width, W-4}, {height, 10}]),
- gs:config(Win, {height,gs:read(Win, height)+10});
- RB2old =:= open, RB2new =:= close ->
- gs:config('RB2', [{width, 0}, {height, 0}, lower]),
- gs:config(Win, {height, gs:read(Win, height)-10});
- true -> ignore
- end,
- config_v(),
- config_h(),
-
- flush_configure(),
-
- WinInfo#winInfo{size={gs:read(Win, width), gs:read(Win, height)},
- flags=NewFlags}.
-
-flush_configure() ->
- receive
- {gs, _Id, configure, _Data, _Arg} ->
- flush_configure()
- after 100 ->
- true
- end.
-
-%%--------------------------------------------------------------------
-%% enable([MenuItem], Bool)
-%% is_enabled(MenuItem) -> Bool
-%% MenuItem = atom()
-%% Bool = boolean()
-%%--------------------------------------------------------------------
-enable(MenuItems, Bool) ->
- lists:foreach(fun(MenuItem) ->
- gs:config(MenuItem, {enable, Bool}),
- case is_button(MenuItem) of
- {true, Button} ->
- gs:config(Button, {enable, Bool});
- false -> ignore
- end
- end,
- MenuItems).
-
-is_enabled(MenuItem) ->
- gs:read(MenuItem, enable).
-
-%%--------------------------------------------------------------------
-%% select(MenuItem, Bool)
-%% MenuItem = atom()
-%% Bool = boolean()
-%%--------------------------------------------------------------------
-select(MenuItem, Bool) ->
- dbg_ui_win:select(MenuItem, Bool).
-
-%%--------------------------------------------------------------------
-%% add_break(WinInfo, Name, {Point, Options}) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Name = atom() Menu name
-%% Point = {Mod, Line}
-%% Options = [Status, Action, Mods, Cond]
-%% Status = active | inactive
-%% Action = enable | disable | delete
-%% Mods = null (not used)
-%% Cond = null | {Mod, Func}
-%%--------------------------------------------------------------------
-add_break(WinInfo, Menu, {{Mod,Line},[Status|_Options]}=Break) ->
- case lists:keyfind(Mod, 1, WinInfo#winInfo.editors) of
- {Mod, Editor} ->
- add_break_to_code(Editor, Line, Status);
- false -> ignore
- end,
- add_break_to_menu(WinInfo, Menu, Break).
-
-add_break_to_code(Editor, Line, Status) ->
- Color = if Status =:= active -> red; Status =:= inactive -> blue end,
- config_editor(Editor, [{overwrite,{{Line,0},"-@- "}},
- {fg,{{{Line,0},{Line,lineend}}, Color}}]).
-
-add_break_to_menu(WinInfo, Menu, {Point, [Status|_Options]=Options}) ->
- Break = dbg_ui_win:add_break(Menu, Point),
- dbg_ui_win:update_break(Break, Options),
- BreakInfo = #breakInfo{point=Point, status=Status, break=Break},
- WinInfo#winInfo{breaks=[BreakInfo|WinInfo#winInfo.breaks]}.
-
-%%--------------------------------------------------------------------
-%% update_break(WinInfo, {Point, Options}) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Point = {Mod, Line}
-%% Options = [Status, Action, Mods, Cond]
-%% Status = active | inactive
-%% Action = enable | disable | delete
-%% Mods = null (not used)
-%% Cond = null | {Mod, Func}
-%%--------------------------------------------------------------------
-update_break(WinInfo, {{Mod,Line},[Status|_Options]}=Break) ->
- case lists:keyfind(Mod, 1, WinInfo#winInfo.editors) of
- {Mod, Editor} ->
- add_break_to_code(Editor, Line, Status);
- false -> ignore
- end,
- update_break_in_menu(WinInfo, Break).
-
-update_break_in_menu(WinInfo, {Point, [Status|_Options]=Options}) ->
- {value, BreakInfo} = lists:keysearch(Point, #breakInfo.point,
- WinInfo#winInfo.breaks),
- dbg_ui_win:update_break(BreakInfo#breakInfo.break, Options),
- BreakInfo2 = BreakInfo#breakInfo{status=Status},
- WinInfo#winInfo{breaks=lists:keyreplace(Point, #breakInfo.point,
- WinInfo#winInfo.breaks,
- BreakInfo2)}.
-
-%%--------------------------------------------------------------------
-%% delete_break(WinInfo, Point) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Point = {Mod, Line}
-%%--------------------------------------------------------------------
-delete_break(WinInfo, {Mod,Line}=Point) ->
- case lists:keyfind(Mod, 1, WinInfo#winInfo.editors) of
- {Mod, Editor} -> delete_break_from_code(Editor, Line);
- false -> ignore
- end,
- delete_break_from_menu(WinInfo, Point).
-
-delete_break_from_code(Editor, Line) ->
- Prefix = string:substr(integer_to_list(Line)++": ", 1, 5),
- config_editor(Editor, [{overwrite,{{Line,0},Prefix}},
- {fg,{{{Line,0},{Line,lineend}}, black}}]).
-
-delete_break_from_menu(WinInfo, Point) ->
- {value, BreakInfo} = lists:keysearch(Point, #breakInfo.point,
- WinInfo#winInfo.breaks),
- dbg_ui_win:delete_break(BreakInfo#breakInfo.break),
- WinInfo#winInfo{breaks=lists:keydelete(Point, #breakInfo.point,
- WinInfo#winInfo.breaks)}.
-
-%%--------------------------------------------------------------------
-%% clear_breaks(WinInfo) -> WinInfo
-%% clear_breaks(WinInfo, Mod) -> WinInfo
-%% WinInfo = #winInfo{}
-%%--------------------------------------------------------------------
-clear_breaks(WinInfo) ->
- clear_breaks(WinInfo, all).
-clear_breaks(WinInfo, Mod) ->
- Remove = if
- Mod =:= all -> WinInfo#winInfo.breaks;
- true ->
- lists:filter(fun(#breakInfo{point={Mod2,_L}}) ->
- if
- Mod2 =:= Mod -> true;
- true -> false
- end
- end,
- WinInfo#winInfo.breaks)
- end,
- lists:foreach(fun(#breakInfo{point=Point}) ->
- delete_break(WinInfo, Point)
- end,
- Remove),
- Remain = WinInfo#winInfo.breaks -- Remove,
- WinInfo#winInfo{breaks=Remain}.
-
-%%--------------------------------------------------------------------
-%% display(Arg)
-%% Arg = idle | {Status,Mod,Line} | {running,Mod}
-%% | {exit,Where,Reason} | {text,Text}
-%% Status = break | wait | Level
-%% Level = int()
-%% Mod = atom()
-%% Line = integer()
-%% Where = {Mod,Line} | null
-%% Reason = term()
-%% Text = string()
-%%--------------------------------------------------------------------
-display(Arg) ->
- Str = case Arg of
- idle -> "State: uninterpreted";
- {exit, {Mod,Line}, Reason} ->
- gs:config(trace_window, raise),
- io_lib:format("State: EXITED [~w.erl/~w], Reason:~w",
- [Mod, Line, Reason]);
- {exit, null, Reason} ->
- gs:config(trace_window, raise),
- io_lib:format("State: EXITED [uninterpreted], "
- "Reason:~w", [Reason]);
- {Level, null, _Line} when is_integer(Level) ->
- io_lib:format("*** Call level #~w "
- "(in non-interpreted code)",
- [Level]);
- {Level, Mod, Line} when is_integer(Level) ->
- io_lib:format("*** Call level #~w [~w.erl/~w]",
- [Level, Mod, Line]);
- {Status, Mod, Line} ->
- What = case Status of
- wait -> 'receive';
- _ -> Status
- end,
- io_lib:format("State: ~w [~w.erl/~w]",
- [What, Mod, Line]);
- {running, Mod} ->
- io_lib:format("State: running [~w.erl]", [Mod]);
- {text, Text} -> Text
- end,
- gs:config(info_window, {label,{text,lists:flatten(Str)}}).
-
-%%--------------------------------------------------------------------
-%% is_shown(WinInfo, Mod) -> {true, WinInfo} | false
-%% show_code(WinInfo, Mod, Contents) -> WinInfo
-%% show_no_code(WinInfo) -> WinInfo
-%% remove_code(WinInfo, Mod) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Mod = atom()
-%% Contents = string()
-%% Note: remove_code/2 should not be used for currently shown module.
-%%--------------------------------------------------------------------
-is_shown(WinInfo, Mod) ->
- case lists:keyfind(Mod, 1, WinInfo#winInfo.editors) of
- {Mod, Editor} ->
- gs:config(Editor, raise),
- {true, WinInfo#winInfo{editor={Mod, Editor}}};
- false -> false
- end.
-
-show_code(WinInfo, Mod, Contents) ->
- Editors = WinInfo#winInfo.editors,
- {Flag, Editor} = case lists:keyfind(Mod, 1, Editors) of
- {Mod, Ed} -> {existing, Ed};
- false -> {new, code_editor()}
- end,
- %% Insert code and update breakpoints, if any
- config_editor(Editor, [raise, clear]),
- show_code(Editor, Contents),
- lists:foreach(fun(BreakInfo) ->
- case BreakInfo#breakInfo.point of
- {Mod2, Line} when Mod2 =:= Mod ->
- Status = BreakInfo#breakInfo.status,
- add_break_to_code(Editor, Line,Status);
- _Point -> ignore
- end
- end,
- WinInfo#winInfo.breaks),
- case Flag of
- existing ->
- WinInfo#winInfo{editor={Mod, Editor}};
- new ->
- WinInfo#winInfo{editor={Mod, Editor},
- editors=[{Mod, Editor} | Editors]}
- end.
-
-show_code(Editor, Text) when length(Text) > 1500 ->
- %% Add some text at a time so that other processes may get scheduled
- Str = string:sub_string(Text, 1, 1500),
- config_editor(Editor, {insert,{'end', Str}}),
- show_code(Editor, string:sub_string(Text, 1501));
-show_code(Editor, Text) ->
- config_editor(Editor, {insert,{'end',Text}}).
-
-show_no_code(WinInfo) ->
- {'$top', Editor} = lists:keyfind('$top', 1, WinInfo#winInfo.editors),
- gs:config(Editor, raise),
- WinInfo#winInfo{editor={'$top', Editor}}.
-
-remove_code(WinInfo, Mod) ->
- Editors = WinInfo#winInfo.editors,
- case lists:keyfind(Mod, 1, Editors) of
- {Mod, Editor} ->
- gs:destroy(Editor),
- WinInfo#winInfo{editors=lists:keydelete(Mod, 1, Editors)};
- false ->
- WinInfo
- end.
-
-%%--------------------------------------------------------------------
-%% mark_line(WinInfo, Line, How) -> WinInfo
-%% WinInfo = #winInfo{}
-%% Line = integer()
-%% How = break | where
-%% Mark the code line where the process is executing.
-%%--------------------------------------------------------------------
-mark_line(WinInfo, Line, How) ->
- {_Mod, Editor} = WinInfo#winInfo.editor,
- mark_line2(Editor, WinInfo#winInfo.marked_line, false),
- mark_line2(Editor, Line, How),
- if
- Line =/= 0 -> config_editor(Editor, {vscrollpos, Line-5});
- true -> ignore
- end,
- WinInfo#winInfo{marked_line=Line}.
-
-unmark_line(WinInfo) ->
- mark_line(WinInfo, 0, false).
-
-mark_line2(Editor, Line, How) ->
- Prefix = case How of
- break -> "-->";
- where -> ">>>";
- false -> " "
- end,
- Font = if
- How =:= false -> dbg_ui_win:font(normal);
- true -> dbg_ui_win:font(bold)
- end,
- config_editor(Editor, [{overwrite, {{Line,5}, Prefix}},
- {font_style,
- {{{Line,0},{Line,lineend}}, Font}}]).
-
-%%--------------------------------------------------------------------
-%% select_line(WinInfo, Line) -> WinInfo
-%% selected_line(WinInfo) -> undefined | Line
-%% WinInfo = #winInfo{}
-%% Line = integer()
-%% Select/unselect a line (unselect if Line=0).
-%%--------------------------------------------------------------------
-select_line(WinInfo, Line) ->
- {_Mod, Editor} = WinInfo#winInfo.editor,
-
- %% Since 'Line' may be specified by the user in the 'Go To Line'
- %% help window, it must be checked that it is correct
- Size = gs:read(Editor, size),
- if
- Line =:= 0 ->
- select_line(Editor, WinInfo#winInfo.selected_line, false),
- WinInfo#winInfo{selected_line=0};
- Line < Size ->
- select_line(Editor, Line, true),
- config_editor(Editor, {vscrollpos, Line-5}),
- WinInfo#winInfo{selected_line=Line};
- true ->
- WinInfo
- end.
-
-select_line(Editor, Line, true) ->
- config_editor(Editor, {selection, {{Line,0}, {Line,lineend}}});
-select_line(Editor, _Line, false) ->
- config_editor(Editor, {selection, {{1,0}, {1,0}}}).
-
-selected_line(WinInfo) ->
- case WinInfo#winInfo.selected_line of
- 0 -> undefined;
- Line -> Line
- end.
-
-%%--------------------------------------------------------------------
-%% eval_output(Str, Face)
-%% Str = string()
-%% Face = normal | bold
-%%--------------------------------------------------------------------
-eval_output(Text, Face) ->
- Y1 = gs:read('EvalEditor', size),
- config_editor('EvalEditor', {insert,{'end',Text}}),
- Y2 = gs:read('EvalEditor', size),
-
- Font = dbg_ui_win:font(Face),
- config_editor('EvalEditor',
- [{font_style, {{{Y1,0},{Y2,lineend}}, Font}},
- {vscrollpos,Y2}]).
-
-%%--------------------------------------------------------------------
-%% update_bindings(Bs)
-%% Bs = [{Var,Val}]
-%%--------------------------------------------------------------------
-update_bindings(Bs) ->
- gs:config('BindGrid', {rows, {1,length(Bs)+1}}),
- Font = dbg_ui_win:font(normal),
- Last =
- lists:foldl(fun({Var, Val}, Row) ->
- Opts = [{text, {1,atom_to_list(Var)}},
- {text, {2,io_lib:format("~P",
- [Val, 4])}},
- {doubleclick, true},
- {data, {binding,{Var,Val}}}],
- case gs:read('BindGrid',{obj_at_row,Row}) of
- undefined ->
- gs:gridline('BindGrid',
- [{row, Row},
- {height, 14},
- {font, Font} | Opts]);
- GridLine ->
- gs:config(GridLine, Opts)
- end,
- Row+1
- end,
- 2,
- Bs),
- delete_gridlines(Last).
-
-delete_gridlines(Row) ->
- case gs:read('BindGrid', {obj_at_row, Row}) of
- undefined -> true;
- GridLine ->
- gs:destroy(GridLine),
- delete_gridlines(Row+1)
- end.
-
-%%--------------------------------------------------------------------
-%% trace_output(Str)
-%% Str = string()
-%%--------------------------------------------------------------------
-trace_output(Str) ->
- Font = dbg_ui_win:font(normal),
- config_editor('TraceEditor',
- [{insert, {'end',Str}},
- {fg, {{{1,0},'end'},black}},
- {font_style, {{{1,0},'end'},Font}}]),
- Max = gs:read('TraceEditor', size),
- config_editor('TraceEditor', {vscrollpos, Max}).
-
-%%--------------------------------------------------------------------
-%% handle_event(GSEvent, WinInfo) -> Command
-%% GSEvent = {gs, Id, Event, Data, Arg}
-%% WinInfo = #winInfo{}
-%% Command = ignore
-%% | {win, WinInfo}
-%% | stopped
-%% | {coords, {X,Y}}
-%%
-%% | {shortcut, Key}
-%% | MenuItem | {Menu, [MenuItem]}
-%% MenuItem = Menu = atom()
-%% | {break, Point, What}
-%% What = add | delete | {status,Status} |{trigger,Trigger}
-%% | {module, Mod, view}
-%%
-%% | {user_command, Cmd}
-%%
-%% | {edit, {Var, Val}}
-%%--------------------------------------------------------------------
-%% Window events
-handle_event({gs, _Id, configure, _Data, [W, H|_]}, WinInfo) ->
- case WinInfo#winInfo.size of
- {W, H} -> ignore;
- _Size ->
- configure(WinInfo, W, H),
- {win, WinInfo#winInfo{size={W, H}}}
- end;
-handle_event({gs, _Id, destroy, _Data, _Arg}, _WinInfo) ->
- stopped;
-handle_event({gs, _Id, motion, _Data, [X,Y]}, WinInfo) ->
- {LastX, LastY} = dbg_ui_win:motion(X, Y),
- Win = WinInfo#winInfo.window,
- {coords, {gs:read(Win, x)+LastX-5, gs:read(Win, y)+LastY-5}};
-handle_event({gs, RB, buttonpress, resizebar, _Arg}, WinInfo) ->
- resize(WinInfo, RB), % Resize window contents
- ignore;
-
-%% Menus, buttons and keyboard shortcuts
-handle_event({gs, _Id, keypress, _Data, [Key,_,_,1]}, _WinInfo) ->
- {shortcut, Key};
-handle_event({gs, _Id, click, {dbg_ui_winman, Win}, _Arg}, _WinInfo) ->
- dbg_ui_winman:raise(Win),
- ignore;
-handle_event({gs, _Id, click, {menuitem, Name}, _Arg}, _WinInfo) ->
- Name;
-handle_event({gs, _Id, click, {menu, Menu}, _Arg}, _WinInfo) ->
- Names = dbg_ui_win:selected(Menu),
- {Menu, Names};
-handle_event({gs, _Id, click, {break, Point, What}, _Arg}, _WinInfo) ->
- {break, Point, What};
-handle_event({gs, _Id, click, {module, Mod, view}, _Arg}, _WinInfo) ->
- {module, Mod, view};
-
-%% Code area
-handle_event({gs, Editor, buttonpress, code_editor, _Arg}, WinInfo) ->
- {Row, _Col} = gs:read(Editor, insertpos),
- Again = receive
- {gs, Editor, buttonpress, code_editor, _} ->
- gs:read(Editor, insertpos)
- after 500 ->
- false
- end,
- case Again of
- {Row, _} ->
- {Mod, _Editor} = WinInfo#winInfo.editor,
- Point = {Mod, Row},
- case lists:keymember(Point, #breakInfo.point,
- WinInfo#winInfo.breaks) of
- false -> {break, Point, add};
- true -> {break, Point, delete}
- end;
- {Row2, _} ->
- select_line(Editor, Row2, true),
- {win, WinInfo#winInfo{selected_line=Row2}};
- false ->
- select_line(Editor, Row, true),
- {win, WinInfo#winInfo{selected_line=Row}}
- end;
-
-%% Button area
-handle_event({gs, _Id, click, {button, Name}, _Arg}, _WinInfo) ->
- Name;
-
-%% Evaluator area
-handle_event({gs, 'EvalEntry', keypress, _Data, ['Return'|_]}, _WI) ->
- Command = case gs:read('EvalEntry', text) of
- [10] ->
- eval_output("\n", normal),
- ignore;
- Cmd ->
- eval_output([$>, Cmd, 10], normal),
- {user_command, Cmd}
- end,
- gs:config('EvalEntry', [{text,""}, {focus,false}]),
- Command;
-
-%% Bindings area
-handle_event({gs, _Id, click, {binding, {Var, Val}}, _Arg}, _WinInfo) ->
- Str = io_lib:format("< ~p = ~p~n", [Var, Val]),
- eval_output(Str, bold),
- ignore;
-handle_event({gs, _Id, doubleclick, {binding, B}, _Arg}, _WinInfo) ->
- {edit, B};
-
-handle_event(_GSEvent, _WinInfo) ->
- ignore.
-
-
-%%====================================================================
-%% Internal functions
-%%====================================================================
-
-%%--Code Area---------------------------------------------------------
-
-code_area(X, Y, FrameOpts, Win) ->
- gs:frame('CodeArea', Win,
- [{x,X}, {y,Y}, {width,546}, {height,400} | FrameOpts]),
- gs:label(info_window, 'CodeArea',
- [{label,{text,""}}, {font,dbg_ui_win:font(normal)},
- {x,5}, {y,10}, {width,406}, {height,15},
- {anchor,nw}, {align,w}]),
- code_editor('CodeEditor', 536, 365).
-
-code_editor() ->
- W = gs:read('CodeEditor', width),
- H = gs:read('CodeEditor', height),
- code_editor(null, W, H).
-
-code_editor(Name, W, H) ->
- Editor = if
- Name =:= null -> gs:editor('CodeArea', []);
- true -> gs:editor(Name, 'CodeArea', [])
- end,
- gs:config(Editor, [{x,5}, {y,30}, {width,W}, {height,H},
- {keypress,false}, {buttonpress,true},
- {data,code_editor}]),
- config_editor(Editor, [{vscroll,right}, {hscroll,bottom}]),
- Font = dbg_ui_win:font(normal),
- config_editor(Editor, [{wrap,none}, {fg,{{{1,0},'end'},black}},
- {font, Font},
- {font_style, {{{1,0},'end'},Font}}]),
- Editor.
-
-resize_code_area(WinInfo, Key, Diff) ->
- gs:config('CodeArea', {Key,gs:read('CodeArea', Key)+Diff}),
- case Key of
- width ->
- gs:config(info_window, {Key,gs:read(info_window,Key)+Diff});
- height -> ignore
- end,
-
- %% Resize all code editors
- Value = gs:read('CodeEditor', Key)+Diff,
- gs:config('CodeEditor', {Key,Value}),
- Editors = WinInfo#winInfo.editors,
- lists:foreach(fun({_Mod, Editor}) ->
- gs:config(Editor, {Key,Value})
- end,
- Editors).
-
-%%--Button Area-------------------------------------------------------
-
-buttons() ->
- [{'Step','StepButton'}, {'Next','NextButton'},
- {'Continue','ContinueButton'}, {'Finish','FinishButton'},
- {'Where','WhereButton'}, {'Up','UpButton'}, {'Down','DownButton'}].
-
-is_button(Name) ->
- case lists:keyfind(Name, 1, buttons()) of
- {Name, Button} -> {true, Button};
- false -> false
- end.
-
-button_area(Bu, X, Y, FrameOpts, Win) ->
- {W,H} = case Bu of
- open -> {546,30};
- close -> {0,0}
- end,
- gs:frame('ButtonArea', Win,
- [{x,X}, {y,Y}, {width,W}, {height,H} | FrameOpts]),
- Font = dbg_ui_win:font(normal),
- lists:foldl(fun({Name, Button}, Xb) ->
- gs:button(Button, 'ButtonArea',
- [{label, {text,Name}}, {font,Font},
- {x, Xb}, {y, 1},
- {width, 77}, {height, 24},
- {data, {button,Name}}]),
- Xb+78
- end,
- 1,
- buttons()).
-
-resize_button_area(close, width, _Diff) ->
- ignore;
-resize_button_area(open, width, Diff) ->
- gs:config('ButtonArea', {width, gs:read('ButtonArea', width)+Diff}).
-
-%%--Evaluator Area----------------------------------------------------
-
-eval_area({Ev,Bi}, X, Y, FrameOpts, Win) ->
- {W,H} = if
- Ev =:= open -> {289,200};
- true -> {0,0}
- end,
- Font = dbg_ui_win:font(normal),
- gs:frame('EvalArea', Win,
- [{x,X}, {y,Y}, {width,W}, {height,H} | FrameOpts]),
- gs:label('EvalArea',
- [{label,{text,"Evaluator:"}}, {font, Font},
- {x,5}, {y,35}, {width,80}, {height,25},
- {anchor,sw}, {align,center}]),
- gs:entry('EvalEntry', 'EvalArea',
- [{font, Font},
- {x,80}, {y,35}, {width,185}, {height,25},
- {anchor,sw}, {keypress,true}]),
- gs:editor('EvalEditor', 'EvalArea',
- [{x,5}, {y,35}, {width, 280}, {height, 160},
- {keypress,false},
- {vscroll,right}, {hscroll,bottom},
- {wrap,none}, {fg,{{{1,0},'end'},black}},
- {font, Font},
- {font_style,{{{1,0},'end'},Font}}]),
- gs:config('EvalEditor', {enable, false}),
- if
- Ev =:= open, Bi =:= close -> resize_eval_area(Ev, width, 257);
- true -> ignore
- end.
-
-resize_eval_area(close, _Key, _Diff) ->
- ignore;
-resize_eval_area(open, Key, Diff) ->
- New = gs:read('EvalArea', Key)+Diff,
- gs:config('EvalArea', {Key,New}),
- case Key of
- width ->
- gs:config('EvalEntry', {width,New-104}),
- gs:config('EvalEditor', {width,New-9});
- height ->
- gs:config('EvalEditor', {height,New-40})
- end.
-
-%%--Bindings Area-----------------------------------------------------
-
-bind_area({Ev,Bi}, X, Y, FrameOpts, Win) ->
- {W,H} = if
- Bi =:= open -> {249,200};
- true -> {0,0}
- end,
- gs:frame('BindArea', Win,
- [{x,X}, {y,Y}, {width,W}, {height,H} | FrameOpts]),
-
- Font = dbg_ui_win:font(bold),
- gs:grid('BindGrid', 'BindArea',
- [{x,2}, {y,2}, {height,193}, {width,241},
- {fg,black}, {vscroll,right}, {hscroll,bottom},
- {font,Font},
- calc_columnwidths(241), {rows, {1,50}}]),
- gs:gridline('BindGrid',
- [{row,1}, {height,14}, {fg,blue},
- {text,{1,"Name"}}, {text,{2,"Value"}}, {font,Font}]),
- gs:config('BindGrid', {rows,{1,1}}),
- if
- Bi =:= open, Ev =:= close -> resize_bind_area(Bi, width, 297);
- true -> ignore
- end.
-
-resize_bind_area(close, _Key, _Diff) ->
- ignore;
-resize_bind_area(open, Key, Diff) ->
- New = gs:read('BindArea', Key)+Diff,
- gs:config('BindArea', {Key,New}),
- case Key of
- width ->
- gs:config('BindGrid', {width,New-8}),
- Cols = calc_columnwidths(New-8),
- gs:config('BindGrid', Cols);
- height ->
- gs:config('BindGrid', {height,New-7})
- end.
-
-calc_columnwidths(Width) ->
- if Width =< 291 ->
- {columnwidths,[90,198]};
- true ->
- S = (Width)/(90+198),
- {columnwidths,[round(90*S),round(198*S)]}
- end.
-
-%%--Trace Area--------------------------------------------------------
-
-trace_area(Tr, X, Y, FrameOpts, Win) ->
- {W,H} = case Tr of
- open -> {546,200};
- close -> {0,0}
- end,
- gs:frame('TraceArea', Win,
- [{x,X}, {y,Y}, {width,W}, {height,H} | FrameOpts]),
- Editor = gs:editor('TraceEditor', 'TraceArea',
- [{x,5}, {y,5}, {width,536}, {height,190},
- {keypress,false}]),
- Font = dbg_ui_win:font(normal),
- config_editor(Editor,
- [{vscroll,right}, {hscroll,bottom},
- {wrap,none},{fg,{{{1,0},'end'},black}},
- {font, Font},
- {font_style,{{{1,0},'end'},Font}}]).
-
-resize_trace_area(close, _Key, _Diff) ->
- ignore;
-resize_trace_area(open, Key, Diff) ->
- New = gs:read('TraceArea', Key)+Diff,
- gs:config('TraceArea', {Key,New}),
- gs:config('TraceEditor', {Key,New-10}).
-
-%%--Editors-----------------------------------------------------------
-
-config_editor(Editor, Opts) ->
- gs:config(Editor, {enable,true}),
- gs:config(Editor, Opts),
- gs:config(Editor, {enable,false}).
-
-%%--Resize Bars-------------------------------------------------------
-%% The resize bars are used to resize the areas within the window.
-
-%%--------------------------------------------------------------------
-%% resizebar(Flag, Name, X, Y, W, H, Obj) -> resizebar()
-%% Flag = open | close
-%% Name = atom()
-%% X = Y = integer() Coordinates relative to Obj
-%% W = H = integer() Width and height
-%% Obj = gsobj()
-%% Creates a 'resize bar', a frame object over which the cursor will
-%% be of the 'resize' type.
-%%--------------------------------------------------------------------
-resizebar(Flag, Name, X, Y, W, H, Obj) ->
- {W2,H2} = case Flag of
- open -> {W,H};
- close -> {0,0}
- end,
- gs:create(frame, Name, Obj, [{x,X}, {y,Y}, {width,W2}, {height,H2},
- {bw,2},
- {cursor,resize},
- {buttonpress,true}, {buttonrelease,true},
- {data,resizebar}]).
-
-rb1({_Bu,Ev,Bi,Tr}) ->
- if
- Ev =:= close, Bi =:= close, Tr =:= close -> close;
- true -> open
- end.
-
-rb2({_Bu,Ev,Bi,Tr}) ->
- if
- Tr =:= open ->
- if
- Ev =:= close, Bi =:= close -> close;
- true -> open
- end;
- true -> close
- end.
-
-rb3({_Bu,Ev,Bi,_Tr}) ->
- if
- Ev =:= open, Bi =:= open -> open;
- true -> close
- end.
-
-%%--Configuration-----------------------------------------------------
-%% Resize the window as well as its contents
-
-%%--------------------------------------------------------------------
-%% config_v()
-%% Reconfigure the window vertically.
-%%--------------------------------------------------------------------
-config_v() ->
- Y1 = 25+gs:read('CodeArea', height),
- gs:config('RB1', {y,Y1}),
-
- Y2 = Y1+gs:read('RB1', height),
- gs:config('ButtonArea', {y,Y2}),
-
- Y3 = Y2+gs:read('ButtonArea', height),
- gs:config('EvalArea', {y,Y3}),
- gs:config('RB3', {y,Y3}),
- gs:config('BindArea', {y,Y3}),
-
- Y4 = Y3 + erlang:max(gs:read('EvalArea', height),
- gs:read('BindArea', height)),
- gs:config('RB2', {y,Y4}),
-
- Y5 = Y4 + gs:read('RB2', height),
- gs:config('TraceArea', {y,Y5}).
-
-%%--------------------------------------------------------------------
-%% config_h()
-%% Reconfigure the window horizontally.
-%%--------------------------------------------------------------------
-config_h() ->
- X1 = 2+gs:read('EvalArea', width),
- gs:config('RB3', {x,X1}),
-
- X2 = X1+gs:read('RB3', width),
- gs:config('BindArea', {x,X2}).
-
-%%--------------------------------------------------------------------
-%% configure(WinInfo, W, H)
-%% The window has been resized, now its contents must be resized too.
-%%--------------------------------------------------------------------
-configure(WinInfo, NewW, NewH) ->
- {Bu,Ev,Bi,Tr} = Flags = WinInfo#winInfo.flags,
-
- OldW = gs:read('CodeArea', width)+4,
- OldH = 25+gs:read('CodeArea', height)+
- gs:read('RB1', height)+
- gs:read('ButtonArea', height)+
- erlang:max(gs:read('EvalArea', height), gs:read('BindArea', height))+
- gs:read('RB2', height)+
- gs:read('TraceArea', height),
-
- %% Adjust width unless it is unchanged or less than minimum width
- if
- OldW =/= NewW ->
- {Dcode,Deval,Dbind} = configure_widths(OldW,NewW,Flags),
- resize_code_area(WinInfo, width, Dcode),
- case rb1(Flags) of
- open ->
- gs:config('RB1', {width,gs:read('RB1',width)+Dcode});
- close -> ignore
- end,
- resize_button_area(Bu, width, Dcode),
- resize_eval_area(Ev, width, Deval),
- resize_bind_area(Bi, width, Dbind),
- case rb2(Flags) of
- open ->
- gs:config('RB2', {width,gs:read('RB2',width)+Dcode});
- close -> ignore
- end,
- resize_trace_area(Tr, width, Dcode),
- config_h();
- true -> ignore
- end,
-
- %% Adjust height unless it is unchanged or less than minimum height
- if
- OldH =/= NewH ->
- {Dcode2,Deval2,Dtrace} = configure_heights(OldH,NewH,Flags),
- resize_code_area(WinInfo, height, Dcode2),
- resize_eval_area(Ev, height, Deval2),
- case rb3(Flags) of
- open ->
- gs:config('RB3',
- {height,gs:read('RB3',height)+Deval2});
- close -> ignore
- end,
- resize_bind_area(Bi, height, Deval2),
- resize_trace_area(Tr, height, Dtrace),
- config_v();
- true -> ignore
- end.
-
-%% Compute how much the width of each frame must be increased or
-%% decreased in order to adjust to the new window width.
-configure_widths(OldW, NewW, Flags) ->
- {_Bu,Ev,Bi,_Tr} = Flags,
-
- %% Difference between old and new width, considering min window width
- Diff = abs(erlang:max(OldW,330)-erlang:max(NewW,330)),
-
- %% Check how much the frames can be resized in reality
- Limits = if
- %% Window larger
- NewW > OldW ->
- if
- Ev =:= open, Bi =:= open -> {0,Diff,Diff};
- Ev =:= open -> {0,Diff,0};
- Bi =:= open -> {0,0,Diff};
- true -> {Diff,0,0}
- end;
-
- %% Window smaller; get difference between min size
- %% and current size
- OldW>NewW ->
- if
- Ev =:= open, Bi =:= open ->
- {0,
- gs:read('EvalArea',width)-204,
- gs:read('BindArea',width)-112};
- Ev =:= open -> {0,Diff,0};
- Bi =:= open -> {0,0,Diff};
- true -> {Diff,0,0}
- end
- end,
-
- case Limits of
-
- %% No Shell or Bind frame, larger window
- {T,0,0} when NewW > OldW -> {T,0,0};
-
- %% No Shell or Bind frame, smaller window
- {T,0,0} when OldW > NewW -> {-T,0,0};
-
- %% Window larger; divide Diff among the frames and return result
- {_,Sf,B} when NewW > OldW ->
- {_,Sf2,B2} = divide([{0,0},{0,Sf},{0,B}],Diff),
- {Sf2+B2,Sf2,B2};
-
- %% Window smaller; divide Diff among the frames and return
- %% the inverted result (the frames should shrink)
- {_,Sf,B} when OldW>NewW ->
- {_,Sf2,B2} = divide([{0,0},{0,Sf},{0,B}],Diff),
- {-(Sf2+B2),-Sf2,-B2}
- end.
-
-%% Compute how much the height of each frame must be increased or
-%% decreased in order to adjust to the new window height.
-configure_heights(OldH, NewH, Flags) ->
- {_Bu,Ev,Bi,Tr} = Flags,
-
- %% Difference between old and new height, considering min win height
- MinH = min_height(Flags),
- Diff = abs(erlang:max(OldH,MinH)-erlang:max(NewH,MinH)),
-
- %% Check how much the frames can be resized in reality
- {T,Sf,Ff} = if
- %% Window larger
- NewH > OldH ->
- {Diff,
- if
- Ev =:= close, Bi =:= close -> 0;
- true -> Diff
- end,
- if
- Tr =:= open -> Diff;
- true -> 0
- end};
-
- %% Window smaller; get difference between min size
- %% and current size
- OldH > NewH ->
- {gs:read('CodeArea',height)-100,
- if
- Ev =:= close, Bi =:= close -> 0;
- true ->
- if
- Ev =:= open ->
- gs:read('EvalArea',height)-100;
- Bi =:= open ->
- gs:read('BindArea',height)-100
- end
- end,
- if
- Tr =:= open -> gs:read('TraceArea',height)-100;
- true -> 0
- end}
- end,
-
- if
- %% Window larger; divide Diff among the frames and return result
- NewH>OldH -> divide([{0,T},{0,Sf},{0,Ff}],Diff);
-
- %% Window smaller; divide Diff among the frames and return
- %% the inverted result (the frames should shrink)
- OldH>NewH ->
- {T2,Sf2,Ff2} = divide([{0,T},{0,Sf},{0,Ff}],Diff),
- {-T2,-Sf2,-Ff2}
- end.
-
-%% Compute minimum window height
-min_height(Flags) ->
- {Bu,S,Bi,F} = Flags,
- H1 = 25 + 100 + 2, % Upper pad + Trace frame + lower pad
- H2 = H1 + bu(Bu) + s_bi(S,Bi) + f(F),
- H3 = case rb1(Flags) of
- open -> H2+10;
- close -> H2
- end,
- H4 = case rb2(Flags) of
- open -> H3+10;
- close -> H3
- end,
- H4.
-
-bu(close) -> 0;
-bu(open) -> 30.
-
-s_bi(close,close) -> 0;
-s_bi(_,_) -> 100.
-
-f(close) -> 0;
-f(open) -> 100.
-
-%% Try to distribute Diff as evenly as possible between E1, E2 and E3.
-divide([{T,T},{S,S},{F,F}], _Diff) ->
- {T,S,F};
-divide(L, Diff) ->
- [{T,Tmax},{S,Smax},{F,Fmax}] = L,
-
- %% Count how many elements in L can still be filled
- Rem = remaining(L),
-
- %% Divide Diff by Rem
- D = Diff div Rem,
-
- if
- %% All of Diff has been distributed
- D =:= 0 -> {T,S,F};
- true ->
- %% For each element, try to add as much as possible of D
- {NewT,Dt} = divide2(D,T,Tmax),
- {NewS,Ds} = divide2(D,S,Smax),
- {NewF,Df} = divide2(D,F,Fmax),
-
- %% Recur with a list of elements with new current values
- %% and decreased Diff
- divide([{NewT,Tmax},{NewS,Smax},{NewF,Fmax}],
- (Diff rem Rem)+Dt+Ds+Df)
- end.
-
-%% Count the number of 'non-filled' elements in L, ie where Curr<Max.
-remaining([]) -> 0;
-remaining([{Max,Max}|T]) -> remaining(T);
-remaining([_H|T]) -> 1 + remaining(T).
-
-divide2(_Diff, Max, Max) -> {Max,0};
-divide2(Diff, Curr, Max) ->
- New = Curr+Diff,
- if
- New>Max -> {Max,New-Max};
- true -> {New,0}
- end.
-
-%%--Resizing using resize bars----------------------------------------
-%% Motions event will move the ResizeBar accordingly in Win, when
-%% the mouse button is released, the window is reconfigured.
-
-resize(WinInfo, ResizeBar) ->
-
- %% Get window dimensions
- W = gs:read(WinInfo#winInfo.window, width),
- H = gs:read(WinInfo#winInfo.window, height),
-
- %% Call resize loop with min and max for the resize bars derived
- %% from the window dimensions
- resizeloop(WinInfo, ResizeBar, null,
- rblimits('RB1',W,H),
- rblimits('RB2',W,H),
- rblimits('RB3',W,H)).
-
-resizeloop(WI, RB, Prev, {Min1,Max1}, {Min2,Max2}, {Min3,Max3}) ->
- receive
- {gs,_,motion,_,[_,Y]} when RB =:= 'RB1', Y > Min1, Y < Max1 ->
- gs:config('RB1', {y,Y}),
- resizeloop(WI, RB, Y, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
- {gs,_,motion,_,_} when RB =:= 'RB1' ->
- resizeloop(WI, RB, Prev, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
-
- {gs,_,motion,_,[_,Y]} when RB =:= 'RB2', Y > Min2, Y < Max2 ->
- gs:config('RB2', {y,Y}),
- resizeloop(WI, RB, Y, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
- {gs,_,motion,_,_} when RB =:= 'RB2' ->
- resizeloop(WI, RB, Prev, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
-
- {gs,_,motion,_,[X,_]} when RB =:= 'RB3', X > Min3, X < Max3 ->
- gs:config('RB3', {x,X}),
- resizeloop(WI, RB, X, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
- {gs,_,motion,_,_} when RB =:= 'RB3' ->
- resizeloop(WI, RB, Prev, {Min1,Max1}, {Min2,Max2}, {Min3,Max3});
-
- {gs,_,buttonrelease,_,_} ->
- resize_win(WI, RB, Prev)
- end.
-
-resize_win(_WinInfo, _RB, null) -> ignore;
-resize_win(WinInfo, 'RB1', Y) ->
- {_Bu,S,Bi,F} = Flags = WinInfo#winInfo.flags,
- H = gs:read('CodeArea', height),
- Diff = H-(Y-25),
-
- %% Resize Code, Evaluator and Binding areas
- resize_code_area(WinInfo, height, -Diff),
- if
- S =:= close, Bi =:= close, F =:= open ->
- resize_trace_area(open, height, Diff);
- true ->
- resize_eval_area(S, height, Diff),
- resize_bind_area(Bi, height, Diff)
- end,
-
- %% Resize vertical resize bar
- case rb3(Flags) of
- open -> gs:config('RB3', {height,gs:read('RB3',height)+Diff});
- close -> ignore
- end,
-
- %% Adjust the frames y coordinates
- config_v();
-resize_win(WinInfo, 'RB2', Y) ->
- {_Bu,S,Bi,F} = Flags = WinInfo#winInfo.flags,
- Prev = gs:read('TraceArea',y),
- Diff = Prev-(Y+10),
-
- %% Resize Trace, Evaluator and Binding areas
- resize_trace_area(F, height, Diff),
- resize_eval_area(S, height, -Diff),
- resize_bind_area(Bi, height, -Diff),
-
- %% Resize vertical resize bar
- case rb3(Flags) of
- open -> gs:config('RB3', {height,gs:read('RB3',height)-Diff});
- close -> ignore
- end,
-
- %% Adjust the frames y coordinates
- config_v();
-
-resize_win(WinInfo, 'RB3', X) ->
- {_Bu,S,Bi,_F} = WinInfo#winInfo.flags,
- Prev = gs:read('BindArea', x),
- Diff = Prev-(X+10),
-
- %% Resize Binding and Trace areas
- resize_bind_area(Bi, width, Diff),
- resize_eval_area(S, width, -Diff),
-
- %% Adjust the frames x coordinates
- config_h().
-
-%% Given the window dimensions, return the limits for a resize bar.
-rblimits('RB1',_W,H) ->
-
- %% Code frame should not have height <100
- Min = 126,
-
- %% Max is decided by a minimum distance to 'RB2'
- %% unless 'RB2' is invisible and 'CodeArea' is visible
- %% (=> EvalFrame and BindFrame invisible) in which case
- %% TraceFrame should not have height <100
- RB2 = gs:read('RB2',height),
- FF = gs:read('TraceArea',height),
- Max = case RB2 of
- 0 when FF =/= 0 ->
- H-112;
- _ ->
- Y = gs:read('RB2',y),
- erlang:max(Min,Y-140)
- end,
-
- {Min,Max};
-rblimits('RB2',_W,H) ->
- %% TraceFrame should not have height < 100
- Max = H-112,
- %% Min is decided by a minimum distance to 'RB1'
- Y = gs:read('RB1',y),
- Min = erlang:min(Max,Y+140),
- {Min,Max};
-
-rblimits('RB3',W,_H) ->
- %% Neither CodeArea nor BindArea should occupy
- %% less than 1/3 of the total window width and EvalFrame should
- %% be at least 289 pixels wide
- {erlang:max(round(W/3),289),round(2*W/3)}.
-
-
-%%====================================================================
-%% 'Go To Line' and 'Search' help windows
-%%====================================================================
-
-helpwin(gotoline, WinInfo, GS, Coords) ->
- spawn_link(?MODULE, helpwin, [gotoline, WinInfo, GS, Coords,self()]);
-helpwin(search, WinInfo, GS, Coords) ->
- spawn_link(?MODULE, helpwin, [search, WinInfo, GS, Coords, self()]).
-
-helpwin(Type, WinInfo, GS, Coords, AttPid) ->
- {_Mod, Editor} = WinInfo#winInfo.editor,
- Data = case Type of
- gotoline -> null;
- search ->
- {{1, 0}, false}
- end,
- Win = helpwin(Type, GS, Coords),
- helpwin_loop(Type, AttPid, Editor, Data, Win).
-
-helpwin_loop(Type, AttPid, Editor, Data, Win) ->
- receive
- {gs, _Id, destroy, _Data, _Arg} ->
- helpwin_stop(Type, AttPid, Editor, Data),
- true;
-
- {gs, _Id, keypress, _Data, ['Return'|_]} ->
- gs:config(btn(Win), flash),
- Data2 = helpwin_action(Type, default,
- AttPid, Editor, Data, Win),
- helpwin_loop(Type, AttPid, Editor, Data2, Win);
- {gs, _Id, keypress, _Data, _Arg} ->
- helpwin_loop(Type, AttPid, Editor, Data, Win);
-
- {gs, _Id, click, _Data, ["Clear"]} ->
- gs:config(ent(Win), {delete, {0,last}}),
- Data2 = helpwin_clear(Type, AttPid, Editor, Data, Win),
- helpwin_loop(Type, AttPid, Editor, Data2, Win);
- {gs, _Id, click, _Data, ["Close"]} ->
- helpwin_stop(Type, AttPid, Editor, Data),
- true;
- {gs, _Id, click, Action, _Arg} ->
- Data2 =
- helpwin_action(Type, Action, AttPid, Editor, Data, Win),
- helpwin_loop(Type, AttPid, Editor, Data2, Win)
- end.
-
-helpwin_stop(gotoline, _AttPid, _Editor, _Data) ->
- ignore;
-helpwin_stop(search, _AttPid, Editor, {Pos, _CS}) ->
- unmark_string(Editor, Pos).
-
-helpwin_clear(gotoline, _AttPid, _Editor, Data, _Win) ->
- Data;
-helpwin_clear(search, _AttPid, Editor, {Pos, CS}, Win) ->
- unmark_string(Editor, Pos),
- gs:config(lbl(Win), {label, {text,""}}),
- {{1, 0}, CS}.
-
-helpwin_action(gotoline, default, AttPid, _Editor, Data, Win) ->
- case string:strip(gs:read(ent(Win), text)) of
- "" -> ignore;
- Str ->
- case catch list_to_integer(Str) of
- {'EXIT', _Reason} -> ignore;
- Line -> AttPid ! {gui, {gotoline, Line}}
- end
- end,
- Data;
-helpwin_action(search, case_sensitive, _AttPid, _Ed, {Pos, CS}, _Win) ->
- Bool = if CS =:= true -> false; CS =:= false -> true end,
- {Pos, Bool};
-helpwin_action(search, default, _AttPid, Editor, {Pos, CS}, Win) ->
- gs:config(lbl(Win), {label, {text, ""}}),
- unmark_string(Editor, Pos),
- case gs:read(ent(Win), text) of
- "" -> {Pos, CS};
- Str ->
- gs:config(lbl(Win), {label, {text,"Searching..."}}),
- Str2 = lowercase(CS, Str),
- case search(Str2, Editor, gs:read(Editor, size), Pos, CS) of
- {Row, Col} ->
- gs:config(lbl(Win), {label, {text,""}}),
- mark_string(Editor, {Row, Col}, Str),
- {{Row, Col}, CS};
- not_found ->
- gs:config(lbl(Win), {label, {text,"Not found"}}),
- {Pos, CS}
- end
- end.
-
-search(_Str, _Editor, Max, {Row, _Col}, _CS) when Row>Max ->
- not_found;
-search(Str, Editor, Max, {Row, Col}, CS) ->
- SearchIn = lowercase(CS, gs:read(Editor,
- {get,{{Row,Col+1},{Row,lineend}}})),
- case string:str(SearchIn, Str) of
- 0 -> search(Str, Editor, Max, {Row+1, 0}, CS);
- N -> {Row, Col+N}
- end.
-
-lowercase(true, Str) -> Str;
-lowercase(false, Str) ->
- [if Char >= $A, Char =< $Z -> Char+32;
- true -> Char
- end || Char <- Str].
-
-mark_string(Editor, {Row, Col}, Str) ->
- Between = {{Row,Col}, {Row,Col+length(Str)}},
- Font = dbg_ui_win:font(bold),
- gs:config(Editor, [{vscrollpos, Row-5},
- {font_style, {Between, Font}},
- {fg, {Between, red}}]).
-
-unmark_string(Editor, {Row, Col}) ->
- Between = {{Row,Col}, {Row,lineend}},
- Font = dbg_ui_win:font(normal),
- gs:config(Editor, [{vscrollpos, Row-5},
- {font_style, {Between, Font}},
- {fg, {Between, black}}]).
-
-helpwin(Type, GS, {X, Y}) ->
- W = 200, Pad = 10, Wbtn = 50,
-
- Title = case Type of search -> "Search"; gotoline -> "Go To Line" end,
- Win = gs:window(GS, [{title, Title}, {x, X}, {y, Y}, {width, W},
- {destroy, true}]),
-
- Ent = gs:entry(Win, [{x, Pad}, {y, Pad}, {width, W-2*Pad},
- {keypress, true}]),
- Hent = gs:read(Ent, height),
-
- Font = dbg_ui_win:font(normal),
-
- {Ybtn, Lbl} =
- case Type of
- search ->
- Ycb = Pad+Hent,
- gs:checkbutton(Win, [{label, {text, "Case Sensitive"}},
- {font, Font},
- {align, w},
- {x, Pad}, {y, Ycb},
- {width, W-2*Pad}, {height, 15},
- {data, case_sensitive}]),
- Ylbl = Ycb+15,
- {Ylbl+Hent+Pad,
- gs:label(Win, [{x, Pad}, {y, Ylbl},
- {width, W-2*Pad}, {height, Hent}])};
- gotoline -> {Pad+Hent+Pad, null}
- end,
-
- BtnLbl = case Type of search -> "Search"; gotoline -> "Go" end,
- Btn = gs:button(Win, [{label, {text, BtnLbl}}, {font, Font},
- {x, W/2-3/2*Wbtn-Pad}, {y, Ybtn},
- {width, Wbtn}, {height, Hent},
- {data, default}]),
- gs:button(Win, [{label, {text, "Clear"}}, {font, Font},
- {x, W/2-1/2*Wbtn}, {y, Ybtn},
- {width, Wbtn}, {height, Hent}]),
- gs:button(Win, [{label, {text, "Close"}}, {font, Font},
- {x, W/2+1/2*Wbtn+Pad}, {y, Ybtn},
- {width, Wbtn}, {height, Hent}]),
-
- H = Ybtn+Hent+Pad,
- gs:config(Win, [{height, H}, {map, true}]),
- {Ent, Lbl, Btn}.
-
-ent(Win) -> element(1, Win).
-lbl(Win) -> element(2, Win).
-btn(Win) -> element(3, Win).
diff --git a/lib/debugger/src/dbg_ui_view.erl b/lib/debugger/src/dbg_ui_view.erl
deleted file mode 100644
index be998f22ff..0000000000
--- a/lib/debugger/src/dbg_ui_view.erl
+++ /dev/null
@@ -1,255 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2011. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_view).
-
-%% External exports
--export([start/2]).
-
--record(state, {gs, % term() Graphics system id
- win, % term() Attach process window data
- coords, % {X,Y} Mouse point position
- mod % atom() Module
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start(GS, Mod)
-%% Mod = atom()
-%%--------------------------------------------------------------------
-start(GS, Mod) ->
- Title = "View Module " ++ atom_to_list(Mod),
- case dbg_ui_winman:is_started(Title) of
- true -> ignore;
- false -> spawn(fun () -> init(GS, Mod, Title) end)
- end.
-
--spec stop() -> no_return().
-stop() ->
- exit(stop).
-
-%%====================================================================
-%% Main loop and message handling
-%%====================================================================
-
-init(GS, Mod, Title) ->
- %% Subscribe to messages from the interpreter
- int:subscribe(),
-
- %% Create attach process window
- Win1 = dbg_ui_trace_win:create_win(GS, Title, ['Code Area'], menus()),
- Window = dbg_ui_trace_win:get_window(Win1),
- dbg_ui_winman:insert(Title, Window),
-
- Win2 = gui_load_module(Win1, Mod),
- Win3 =
- lists:foldl(fun(Break, Win) ->
- dbg_ui_trace_win:add_break(Win, 'Break', Break)
- end,
- Win2,
- int:all_breaks(Mod)),
-
- loop(#state{gs=GS, win=Win3, coords={0,0}, mod=Mod}).
-
-loop(State) ->
- receive
-
- %% From the GUI main window
- GuiEvent when is_tuple(GuiEvent), element(1, GuiEvent)==gs ->
- Cmd = dbg_ui_trace_win:handle_event(GuiEvent, State#state.win),
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the GUI help windows
- {gui, Cmd} ->
- State2 = gui_cmd(Cmd, State),
- loop(State2);
-
- %% From the interpreter
- {int, Cmd} ->
- State2 = int_cmd(Cmd, State),
- loop(State2);
-
- %% From the dbg_ui_winman process (Debugger window manager)
- {dbg_ui_winman, update_windows_menu, Data} ->
- dbg_ui_winman:update_windows_menu(Data),
- loop(State);
- {dbg_ui_winman, destroy} ->
- stop();
-
- %% Help window termination -- ignore
- {'EXIT', _Pid, _Reason} ->
- loop(State)
- end.
-
-%%--Commands from the GUI---------------------------------------------
-
-gui_cmd(ignore, State) ->
- State;
-gui_cmd({win, Win}, State) ->
- State#state{win=Win};
-gui_cmd(stopped, _State) ->
- stop();
-gui_cmd({coords, Coords}, State) ->
- State#state{coords=Coords};
-
-gui_cmd({shortcut, Key}, State) ->
- case shortcut(Key) of
- false -> State;
- Cmd -> gui_cmd(Cmd, State)
- end;
-
-%% File menu
-gui_cmd('Close', _State) ->
- stop();
-
-%% Edit menu
-gui_cmd('Go To Line...', State) ->
- %% Will result in message handled below: {gui, {gotoline, Line}}
- dbg_ui_trace_win:helpwin(gotoline, State#state.win,
- State#state.gs, State#state.coords),
- State;
-gui_cmd({gotoline, Line}, State) ->
- Win = dbg_ui_trace_win:select_line(State#state.win, Line),
- State#state{win=Win};
-gui_cmd('Search...', State) ->
- dbg_ui_trace_win:helpwin(search, State#state.win,
- State#state.gs, State#state.coords),
- State;
-
-%% Break menu
-gui_cmd('Line Break...', State) ->
- add_break(State#state.gs, State#state.coords, line,
- State#state.mod,
- dbg_ui_trace_win:selected_line(State#state.win)),
- State;
-gui_cmd('Conditional Break...', State) ->
- add_break(State#state.gs, State#state.coords, conditional,
- State#state.mod,
- dbg_ui_trace_win:selected_line(State#state.win)),
- State;
-gui_cmd('Function Break...', State) ->
- add_break(State#state.gs, State#state.coords, function,
- State#state.mod, undefined),
- State;
-gui_cmd('Enable All', State) ->
- Breaks = int:all_breaks(),
- ThisMod = State#state.mod,
- lists:foreach(fun ({{Mod, Line}, _Options}) when Mod==ThisMod ->
- int:enable_break(Mod, Line);
- (_Break) ->
- ignore
- end,
- Breaks),
- State;
-gui_cmd('Disable All', State) ->
- Breaks = int:all_breaks(),
- ThisMod = State#state.mod,
- lists:foreach(fun ({{Mod, Line}, _Options}) when Mod==ThisMod ->
- int:disable_break(Mod, Line);
- (_Break) ->
- ignore
- end,
- Breaks),
- State;
-gui_cmd('Delete All', State) ->
- int:no_break(State#state.mod),
- State;
-gui_cmd({break, {Mod, Line}, What}, State) ->
- case What of
- add -> int:break(Mod, Line);
- delete -> int:delete_break(Mod, Line);
- {status, inactive} -> int:disable_break(Mod, Line);
- {status, active} -> int:enable_break(Mod, Line);
- {trigger, Action} -> int:action_at_break(Mod, Line, Action)
- end,
- State;
-
-%% Help menu
-gui_cmd('Debugger', State) ->
- Window = dbg_ui_trace_win:get_window(State#state.win),
- HelpFile = filename:join([code:lib_dir(debugger),
- "doc", "html", "part_frame.html"]),
- tool_utils:open_help(Window, HelpFile),
- State.
-
-add_break(GS, Coords, Type, undefined, _Line) ->
- dbg_ui_break:start(GS, Coords, Type);
-add_break(GS, Coords, Type, Mod, undefined) ->
- dbg_ui_break:start(GS, Coords, Type, Mod);
-add_break(GS, Coords, Type, Mod, Line) ->
- dbg_ui_break:start(GS, Coords, Type, Mod, Line).
-
-%%--Commands from the interpreter-------------------------------------
-
-int_cmd({new_break, {{Mod,_Line},_Options}=Break}, #state{mod=Mod}=State) ->
- Win = dbg_ui_trace_win:add_break(State#state.win, 'Break', Break),
- State#state{win=Win};
-int_cmd({delete_break, {Mod,_Line}=Point}, #state{mod=Mod}=State) ->
- Win = dbg_ui_trace_win:delete_break(State#state.win, Point),
- State#state{win=Win};
-int_cmd({break_options, {{Mod,_Line},_Options}=Break}, #state{mod=Mod}=State) ->
- Win = dbg_ui_trace_win:update_break(State#state.win, Break),
- State#state{win=Win};
-int_cmd(no_break, State) ->
- Win = dbg_ui_trace_win:clear_breaks(State#state.win),
- State#state{win=Win};
-int_cmd({no_break, _Mod}, State) ->
- Win = dbg_ui_trace_win:clear_breaks(State#state.win),
- State#state{win=Win};
-int_cmd(_, State) ->
- State.
-
-
-%%====================================================================
-%% GUI auxiliary functions
-%%====================================================================
-
-menus() ->
- [{'File', [{'Close', 0}]},
- {'Edit', [{'Go To Line...', 0},
- {'Search...', 0}]},
- {'Break', [{'Line Break...', 5},
- {'Conditional Break...', 13},
- {'Function Break...', 0},
- separator,
- {'Enable All', no},
- {'Disable All', no},
- {'Delete All', 0},
- separator]},
- {'Help', [{'Debugger', no}]}].
-
-shortcut(c) -> 'Close';
-shortcut(g) -> 'Go To Line...';
-shortcut(s) -> 'Search...';
-shortcut(b) -> 'Line Break...';
-shortcut(r) -> 'Conditional Break...';
-shortcut(f) -> 'Function Break...';
-shortcut(d) -> 'Delete All';
-
-shortcut(_) -> false.
-
-gui_load_module(Win, Mod) ->
- dbg_ui_trace_win:display({text, "Loading module..."}),
- Contents = int:contents(Mod, any),
- Win2 = dbg_ui_trace_win:show_code(Win, Mod, Contents),
- dbg_ui_trace_win:display({text, ""}),
- Win2.
diff --git a/lib/debugger/src/dbg_ui_win.erl b/lib/debugger/src/dbg_ui_win.erl
deleted file mode 100644
index 1c7a80a1c4..0000000000
--- a/lib/debugger/src/dbg_ui_win.erl
+++ /dev/null
@@ -1,281 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_win).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
-
-%% External exports
--export([init/0,
- font/1, min_size/3, min_size/4,
- create_menus/2, select/2, selected/1,
- add_break/2, update_break/2, delete_break/1,
- motion/2
- ]).
-
--record(break, {mb, smi, emi, dimi, demi}).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% init() -> GS
-%% GS = term()
-%%--------------------------------------------------------------------
-init() ->
- gs:start([{kernel, true}]).
-
-%%--------------------------------------------------------------------
-%% font(Style) -> Font
-%% Style = normal | bold
-%% Select a suitable font. Defaults to {screen,12} and, if it does not
-%% exist, {courier,12}.
-%%--------------------------------------------------------------------
-font(Style) ->
- GS = init(),
- Style2 = if
- Style =:= normal -> [];
- true -> [Style]
- end,
- case gs:read(GS, {choose_font, {screen,Style2,12}}) of
- Font when element(1, Font) =:= screen ->
- Font;
- _ ->
- gs:read(GS, {choose_font, {courier,Style2,12}})
- end.
-
-%%--------------------------------------------------------------------
-%% min_size(Strings, MinW, MinH) -> {W, H}
-%% min_size(Font, Strings, MinW, MinH) -> {W, H}
-%% Font = GS font - defaults to dbg_ui_win:font(normal)
-%% Strings = [string()]
-%% MinW = MinH = int()
-%% W = H = int()
-%%--------------------------------------------------------------------
-min_size(Strings, MinW, MinH) ->
- min_size(font(normal), Strings, MinW, MinH).
-
-min_size(Font, Strings, MinW, MinH) ->
- GS = init(),
- min_size(GS, Font, Strings, MinW, MinH).
-
-min_size(GS, Font, [String|Strings], MinW, MinH) ->
- {W, H} = gs:read(GS, {font_wh, {Font, String}}),
- min_size(GS, Font, Strings, erlang:max(MinW, W), erlang:max(MinH, H));
-min_size(_GS, _Font, [], W, H) ->
- {W, H}.
-
-%%--------------------------------------------------------------------
-%% create_menus(MenuBar, [Menu])
-%% MenuBar = gsobj()
-%% Menu = {Name, [Item]}
-%% Name = atom()
-%% Item = {Name, N} | {Name, N, Type} | {Name, N, cascade, [Item]}
-%% | separator
-%% N = no | integer()
-%% Type = check | radio
-%% Create the specified menus and menuitems.
-%%
-%% Normal menuitems are specified as {Name, N}. Generates the event:
-%% {gs, _Id, click, {menuitem, Name}, _Arg}
-%%
-%% Check and radio menuitems are specified as {Name, N, check|radio}.
-%% They are assumed to be children to a cascade menuitem! (And all children
-%% to one cascade menuitem are assumed to be either check OR radio
-%% menuitems)!
-%% Selecting a check/radio menuitem generates the event:
-%% {gs, _Id, click, {menu, Menu}, _Arg}
-%% where Menu is the name of the parent, the cascade menuitem.
-%% Use selected(Menu) to retrieve which check/radio menuitems are
-%% selected.
-%%--------------------------------------------------------------------
-create_menus(MenuBar, [{Title, Items}|Menus]) ->
- Title2 = " "++(atom_to_list(Title))++" ",
- MenuBtn = gs:menubutton(MenuBar, [{label, {text,Title2}},
- {font, font(normal)}]),
- case Title of
- 'Help' -> gs:config(MenuBtn, {side, right});
- _ -> ignore
- end,
- Menu = gs:menu(Title, MenuBtn, []),
- create_items(Menu, Items, Title),
- create_menus(MenuBar, Menus);
-create_menus(_MenuBar, []) ->
- done.
-
-create_items(Menu, [Item|Items], Group) ->
- create_item(Menu, Item, Group),
- create_items(Menu, Items, Group);
-create_items(_Menu, [], _Group) ->
- done.
-
-create_item(Menu, {Name, _N, cascade, Items}, _Group) ->
- MenuBtn = gs:menuitem(Menu, [{label, {text,Name}},
- {font, font(normal)},
- {itemtype, cascade}]),
- SubMenu = gs:menu(Name, MenuBtn, []),
- create_items(SubMenu, Items, Name);
-create_item(Menu, separator, _Group) ->
- gs:menuitem(Menu, [{itemtype, separator}]);
-create_item(Menu, MenuItem, Group) ->
- Options = case MenuItem of
- {Name, N} ->
- [{data, {menuitem,Name}}];
- {Name, N, check} ->
- [{itemtype, check}, {data, {menu, Group}}];
- {Name, N, radio} ->
- [{itemtype, radio}, {data, {menu, Group}},
- {group, group(Group)}]
- end,
- gs:menuitem(Name, Menu, [{label, {text,Name}},
- {font, font(normal)} | Options]),
- if
- is_integer(N) -> gs:config(Name, {underline, N});
- true -> ignore
- end.
-
-%% When grouping radio buttons, the group id must be an atom unique for
-%% each window.
-group(Group) ->
- list_to_atom(atom_to_list(Group)++pid_to_list(self())).
-
-%%--------------------------------------------------------------------
-%% select(MenuItem, Bool)
-%% MenuItem = atom()
-%% Bool = boolean()
-%%--------------------------------------------------------------------
-select(MenuItem, Bool) ->
- gs:config(MenuItem, {select, Bool}).
-
-%%--------------------------------------------------------------------
-%% selected(Menu) -> [Name]
-%% Menu = Name = atom()
-%%--------------------------------------------------------------------
-selected(Menu) ->
- Children = gs:read(Menu, children),
- Selected = [gs:read(Child, select) || Child <- Children],
- lists:map(fun(Child) ->
- {text, Name} = gs:read(Child, label),
- list_to_atom(Name)
- end,
- Selected).
-
-%%--------------------------------------------------------------------
-%% add_break(Name, Point) -> #break{}
-%% Name = atom()
-%% Point = {Mod, Line}
-%% The break will generate the following events:
-%% {gs, _Id, click, {break, Point, Event}, _Arg}
-%% Event = delete | {trigger, Action} | {status, Status}
-%% Action = enable | disable | delete
-%% Status = active | inactive
-%%--------------------------------------------------------------------
-add_break(Menu, Point) ->
- Font = font(normal),
-
- %% Create a name for the breakpoint
- {Mod, Line} = Point,
- Label = io_lib:format("~w ~5w", [Mod, Line]),
-
- %% Create a menu for the breakpoint
- MenuBtn = gs:menuitem(Menu, [{label, {text,Label}}, {font, Font},
- {itemtype, cascade}]),
- SubMenu = gs:menu(MenuBtn, []),
- SMI = gs:menuitem(SubMenu, [{data, {break,Point,null}}]),
- gs:menuitem(SubMenu, [{label, {text,"Delete"}}, {font, Font},
- {data, {break,Point,delete}}]),
- TriggerMenuBtn = gs:menuitem(SubMenu,
- [{label,{text,"Trigger Action"}},
- {font, Font},
- {itemtype, cascade}]),
- TriggerMenu = gs:menu(TriggerMenuBtn, []),
- Group = element(3, erlang:now()),
- EMI = gs:menuitem(TriggerMenu, [{label, {text,"Enable"}},
- {font, Font},
- {itemtype, radio}, {group, Group},
- {data,
- {break,Point,{trigger,enable}}}]),
- DiMI = gs:menuitem(TriggerMenu, [{label, {text,"Disable"}},
- {font, Font},
- {itemtype, radio}, {group, Group},
- {data,
- {break,Point,{trigger,disable}}}]),
- DeMI = gs:menuitem(TriggerMenu, [{label, {text,"Delete"}},
- {font, Font},
- {itemtype, radio}, {group, Group},
- {data,
- {break,Point,{trigger,delete}}}]),
-
- #break{mb=MenuBtn, smi=SMI, emi=EMI, dimi=DiMI, demi=DeMI}.
-
-%%--------------------------------------------------------------------
-%% update_break(Break, Options)
-%% Break = #break{}
-%% Options = [Status, Action, Mods, Cond]
-%% Status = active | inactive
-%% Action = enable | disable | delete
-%% Mods = null (not used)
-%% Cond = null | {Mod, Func}
-%%--------------------------------------------------------------------
-update_break(Break, Options) ->
- [Status, Trigger|_] = Options,
- {break, Point, _Status} = gs:read(Break#break.smi, data),
-
- {Label, Data} = case Status of
- active ->
- {"Disable", {break,Point,{status,inactive}}};
- inactive ->
- {"Enable", {break,Point,{status,active}}}
- end,
- gs:config(Break#break.smi, [{label, {text,Label}},
- {font, font(normal)},
- {data, Data}]),
-
- TriggerMI = case Trigger of
- enable -> Break#break.emi;
- disable -> Break#break.dimi;
- delete -> Break#break.demi
- end,
- gs:config(TriggerMI, {select, true}).
-
-%%--------------------------------------------------------------------
-%% delete_break(Break)
-%% Break = #break{}
-%%--------------------------------------------------------------------
-delete_break(Break) ->
- gs:destroy(Break#break.mb).
-
-%%--------------------------------------------------------------------
-%% motion(X, Y) -> {X, Y}
-%% X = Y = integer()
-%%--------------------------------------------------------------------
-motion(X, Y) ->
- receive
- {gs, _Id, motion, _Data, [NX,NY]} ->
- motion(NX, NY)
- after 0 ->
- {X, Y}
- end.
diff --git a/lib/debugger/src/dbg_ui_winman.erl b/lib/debugger/src/dbg_ui_winman.erl
deleted file mode 100644
index b5433a202b..0000000000
--- a/lib/debugger/src/dbg_ui_winman.erl
+++ /dev/null
@@ -1,182 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(dbg_ui_winman).
--behaviour(gen_server).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,3}}]).
-
-%% External exports
--export([start/0]).
--export([insert/2, is_started/1,
- clear_process/1,
- raise/1,
- windows_menu/1, update_windows_menu/1]).
-
-%% gen_server callbacks
--export([init/1, handle_call/3, handle_cast/2, handle_info/2,
- terminate/2, code_change/3]).
-
--record(win, {owner, % pid()
- title, % string()
- win % gsobj()
- }).
-
--record(state, {wins=[] % [#win{}]
- }).
-
-%%====================================================================
-%% External exports
-%%====================================================================
-
-%%--------------------------------------------------------------------
-%% start()
-%%--------------------------------------------------------------------
-start() ->
- gen_server:start({local,?MODULE}, ?MODULE, [], []).
-
-%%--------------------------------------------------------------------
-%% insert(Title, Win)
-%% Title = string()
-%% Win = gsobj()
-%%--------------------------------------------------------------------
-insert(Title, Win) ->
- gen_server:cast(?MODULE, {insert, self(), Title, Win}).
-
-%%--------------------------------------------------------------------
-%% is_started(Title) -> true | false
-%% Title = string()
-%%--------------------------------------------------------------------
-is_started(Title) ->
- case gen_server:call(?MODULE, {is_started, Title}, infinity) of
- {true, Win} ->
- raise(Win),
- true;
- false ->
- false
- end.
-
-%%--------------------------------------------------------------------
-%% clear_process(Title)
-%% Title = string()
-%%--------------------------------------------------------------------
-clear_process(Title) ->
- gen_server:cast(?MODULE, {clear_process, Title}).
-
-%%--------------------------------------------------------------------
-%% raise(Win)
-%% Win = gsobj()
-%%--------------------------------------------------------------------
-raise(Win) ->
- gs:config(Win, [raise, {iconify, false}, {setfocus, true}]).
-
-%%--------------------------------------------------------------------
-%% windows_menu(MenuBar)
-%% MenuBar = gsobj()
-%%--------------------------------------------------------------------
-windows_menu(MenuBar) ->
- gs:menubutton('WindowsMenuBtn', MenuBar,
- [{label,{text," Windows "}},
- {font, dbg_ui_win:font(normal)}]),
- gs:menu('WindowsMenu', 'WindowsMenuBtn', []).
-
-%%--------------------------------------------------------------------
-%% update_windows_menu(Data)
-%% Data = {New, Old}
-%% New = Old = list()
-%%--------------------------------------------------------------------
-update_windows_menu([MonInfo|Infos]) ->
- gs:destroy('WindowsMenu'),
- gs:menu('WindowsMenu', 'WindowsMenuBtn', []),
- menuitem(MonInfo),
- gs:menuitem(separator, 'WindowsMenu', [{itemtype, separator}]),
- lists:foreach(fun(Info) -> menuitem(Info) end, Infos).
-
-menuitem({Title, Win}) ->
- gs:menuitem(Title, 'WindowsMenu', [{label, {text,Title}},
- {font, dbg_ui_win:font(normal)},
- {data, {dbg_ui_winman,Win}}]).
-
-
-%%====================================================================
-%% gen_server callbacks
-%%====================================================================
-
-init(_Arg) ->
- process_flag(trap_exit, true),
- {ok, #state{}}.
-
-handle_call({is_started, Title}, _From, State) ->
- Reply = case lists:keyfind(Title, #win.title, State#state.wins) of
- false -> false;
- Win -> {true, Win#win.win}
- end,
- {reply, Reply, State}.
-
-handle_cast({insert, Pid, Title, Win}, State) ->
- link(Pid),
- Wins = State#state.wins ++ [#win{owner=Pid, title=Title, win=Win}],
- inform_all(Wins),
- {noreply, State#state{wins=Wins}};
-
-handle_cast({clear_process, Title}, State) ->
- OldWins = State#state.wins,
- Wins = case lists:keyfind(Title, #win.title, OldWins) of
- #win{owner=Pid} ->
- Msg = {dbg_ui_winman, destroy},
- Pid ! Msg,
- lists:keydelete(Title, #win.title, OldWins);
- false ->
- OldWins
- end,
- {noreply, State#state{wins=Wins}}.
-
-handle_info({'EXIT', Pid, _Reason}, State) ->
- [Mon | _Wins] = State#state.wins,
- if
- Pid =:= Mon#win.owner -> {stop, normal, State};
- true ->
- Wins2 = lists:keydelete(Pid, #win.owner, State#state.wins),
- inform_all(Wins2),
- {noreply, State#state{wins=Wins2}}
- end.
-
-terminate(_Reason, State) ->
- delete_all(State#state.wins),
- ok.
-
-code_change(_OldVsn, State, _Extra) ->
- {ok, State}.
-
-
-%%====================================================================
-%% Internal functions
-%%====================================================================
-
-inform_all(Wins) ->
- Infos = lists:map(fun(#win{title=Title, win=Win}) -> {Title, Win} end,
- Wins),
- Msg = {dbg_ui_winman, update_windows_menu, Infos},
- lists:foreach(fun(#win{owner=Pid}) -> Pid ! Msg end, Wins).
-
-delete_all(Wins) ->
- Msg = {dbg_ui_winman, destroy},
- lists:foreach(fun(#win{owner=Pid}) -> Pid ! Msg end, Wins).
diff --git a/lib/debugger/src/dbg_wx_mon_win.erl b/lib/debugger/src/dbg_wx_mon_win.erl
index a617f3e1e7..0071b27027 100644
--- a/lib/debugger/src/dbg_wx_mon_win.erl
+++ b/lib/debugger/src/dbg_wx_mon_win.erl
@@ -43,7 +43,7 @@
-record(moduleInfo, {module, menubtn}).
-record(procInfo, {pid, row}).
-record(breakInfo, {point, status, break}).
--record(break, {mb, smi, emi, dimi, demi}). %% BUGBUG defined in dbg_ui_win
+-record(break, {mb, smi, emi, dimi, demi}).
-record(winInfo, {window, % gsobj()
grid, % gsobj()
row, % int() Last row in grid
@@ -76,13 +76,6 @@
init() ->
dbg_wx_win:init().
-%%--------------------------------------------------------------------
-%% create_win(GS, Title, Menus) -> #winInfo{}
-%% GS = gsobj()
-%% Title = string()
-%% Menus = [menu()] See dbg_ui_win.erl
-%%--------------------------------------------------------------------
-
-define(GRID,1000).
-define(PAD, 5).
diff --git a/lib/debugger/src/dbg_wx_trace.erl b/lib/debugger/src/dbg_wx_trace.erl
index 7108b5a79a..1ac796bb4c 100644
--- a/lib/debugger/src/dbg_wx_trace.erl
+++ b/lib/debugger/src/dbg_wx_trace.erl
@@ -71,21 +71,10 @@ start(Pid, TraceWin, BackTrace) ->
start(Pid, TraceWin, BackTrace, ?STRINGS).
start(Pid, TraceWin, BackTrace, Strings) ->
- case {whereis(dbg_wx_mon), whereis(dbg_ui_mon)} of
- {undefined, undefined} ->
- case which_gui() of
- gs ->
- dbg_ui_trace:start(Pid, TraceWin, BackTrace);
- wx ->
- Parent = wx:new(),
- Env = wx:get_env(),
- start(Pid, Env, Parent, TraceWin, BackTrace, Strings)
- end;
- {undefined, Monitor} when is_pid(Monitor) ->
- dbg_ui_trace:start(Pid, TraceWin, BackTrace);
- {Monitor, _} when is_pid(Monitor) ->
+ case whereis(dbg_wx_mon) of
+ Monitor when is_pid(Monitor) ->
Monitor ! {?MODULE, self(), get_env},
- receive
+ receive
{env, Monitor, Env, Parent} ->
start(Pid, Env, Parent, TraceWin, BackTrace, Strings)
end
@@ -110,15 +99,6 @@ start(Pid, Env, Parent, TraceWin, BackTrace, Strings) ->
ignore
end.
-which_gui() ->
- try
- wx:new(),
- wx:destroy(),
- wx
- catch _:_ ->
- gs
- end.
-
%%--------------------------------------------------------------------
%% title(Pid) -> string()
%% By exporting this function, dbg_wx_mon may check with dbg_wx_winman
diff --git a/lib/debugger/src/debugger.app.src b/lib/debugger/src/debugger.app.src
index 807054c983..84fb98c94e 100644
--- a/lib/debugger/src/debugger.app.src
+++ b/lib/debugger/src/debugger.app.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -27,20 +27,6 @@
dbg_iload,
dbg_iserver,
dbg_istk,
- dbg_ui_break,
- dbg_ui_break_win,
- dbg_ui_edit,
- dbg_ui_edit_win,
- dbg_ui_filedialog_win,
- dbg_ui_interpret,
- dbg_ui_mon,
- dbg_ui_mon_win,
- dbg_ui_settings,
- dbg_ui_trace,
- dbg_ui_trace_win,
- dbg_ui_view,
- dbg_ui_win,
- dbg_ui_winman,
dbg_wx_break,
dbg_wx_break_win,
dbg_wx_code,
@@ -59,5 +45,5 @@
i,
int
]},
- {registered, [dbg_iserver, dbg_ui_mon, dbg_ui_winman]},
- {applications, [kernel, stdlib, gs]}]}.
+ {registered, [dbg_iserver, dbg_wx_mon, dbg_wx_winman]},
+ {applications, [kernel, stdlib]}]}.
diff --git a/lib/debugger/src/debugger.erl b/lib/debugger/src/debugger.erl
index b97091ee6b..8a2ac28df5 100644
--- a/lib/debugger/src/debugger.erl
+++ b/lib/debugger/src/debugger.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -32,44 +32,44 @@
%% --------
%% Interface module.
%%
-%% dbg_ui_winman
+%% dbg_wx_winman
%% -------------
%% Window manager, keeping track of open windows and Debugger
%% processes.
%%
-%% dbg_ui_mon, dbg_ui_mon_win
+%% dbg_wx_mon, dbg_wx_mon_win
%% --------------------------
%% Monitor window, main window of Debugger, displaying information
%% about interpreted modules and debugged processes.
%%
-%% dbg_ui_trace, dbg_ui_trace_win
+%% dbg_wx_trace, dbg_wx_trace_win
%% ------------------------------
%% Attach process window, showing the code executed by a debugged
%% process and providing a GUI for stepping, inspecting variables etc.
%%
-%% dbg_ui_break, dbg_ui_break_win
+%% dbg_wx_break, dbg_wx_break_win
%% ------------------------------
%% Help window for creating new breakpoints.
%%
-%% dbg_ui_edit, dbg_ui_edit_win
+%% dbg_wx_edit, dbg_wx_edit_win
%% --------------------------------------
%% Help window for editing terms, used for setting backtrace size
%% (i.e. how many stack frames to display in the attach process window)
%% and changing variable values.
%%
-%% dbg_ui_interpret, dbg_ui_filedialog_win
+%% dbg_wx_interpret, dbg_wx_filedialog_win
%% --------------------------------------
%% Help window for selecting modules to interpret.
%%
-%% dbg_ui_settings, dbg_ui_filedialog_win
+%% dbg_wx_settings, dbg_wx_filedialog_win
%% --------------------------------------
%% Help window for saving and loading Debugger settings.
%%
-%% dbg_ui_view
+%% dbg_wx_view
%% -----------
-%% Help window for viewing interpreted modules (uses dbg_ui_trace_win).
+%% Help window for viewing interpreted modules (uses dbg_wx_trace_win).
%%
-%% dbg_ui_win
+%% dbg_wx_win
%% ----------
%% GUI specific functionality used by more than one window type.
%%
@@ -78,7 +78,7 @@ start() ->
start(global, default, default).
start(Mode) when Mode==local; Mode==global ->
start(Mode, default, default);
-start(Gui) when Gui==gs; Gui==wx ->
+start(Gui) when Gui==wx ->
start(global, default, Gui);
start(SFile) when is_list(SFile), is_integer(hd(SFile)) ->
start(global, SFile, default).
@@ -86,8 +86,6 @@ start(SFile) when is_list(SFile), is_integer(hd(SFile)) ->
start(Mode, SFile) ->
start(Mode, SFile, default).
-start(Mode, SFile, gs) ->
- dbg_ui_mon:start(Mode, SFile);
start(Mode, SFile, wx) ->
dbg_wx_mon:start(Mode, SFile);
start(Mode, SFile, default) ->
@@ -95,7 +93,7 @@ start(Mode, SFile, default) ->
start(Mode, SFile, Gui).
stop() ->
- dbg_ui_mon:stop().
+ dbg_wx_mon:stop().
quick(M, F, A) ->
int:i(M),
@@ -104,15 +102,7 @@ quick(M, F, A) ->
auto_attach(Flags) ->
case which_gui() of
- gs -> int:auto_attach(Flags, {dbg_ui_trace, start, []});
wx -> int:auto_attach(Flags, {dbg_wx_trace, start, []})
end.
-which_gui() ->
- try
- wx:new(),
- wx:destroy(),
- wx
- catch _:_ ->
- gs
- end.
+which_gui() -> wx.
diff --git a/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl b/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
index c5c6a56363..ab485fd350 100644
--- a/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
+++ b/lib/debugger/test/int_eval_SUITE_data/my_int_eval_module.erl
@@ -236,4 +236,8 @@ otp_8310() ->
(catch {a, [X || X <- a]}),
{'EXIT',{{bad_generator,b},_}} =
(catch {a, << <<X>> || << X >> <= b >>}),
+ true = begin (X1 = true) andalso X1, X1 end,
+ false = begin (X2 = false) andalso X2, X2 end,
+ true = begin (X3 = true) orelse X3, X3 end,
+ false = begin (X4 = false) orelse X4, X4 end,
ok.
diff --git a/lib/dialyzer/doc/manual.txt b/lib/dialyzer/doc/manual.txt
index d519ac960b..29c9518d84 100644
--- a/lib/dialyzer/doc/manual.txt
+++ b/lib/dialyzer/doc/manual.txt
@@ -125,7 +125,7 @@ The exit status of the command line version is:
Usage: dialyzer [--help] [--version] [--shell] [--quiet] [--verbose]
[-pa dir]* [--plt plt] [--plts plt*] [-Ddefine]*
[-I include_dir]* [--output_plt file] [-Wwarn]*
- [--src] [--gui | --wx] [files_or_dirs] [-r dirs]
+ [--src] [--gui] [files_or_dirs] [-r dirs]
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
@@ -234,9 +234,7 @@ Options:
--fullpath
Display the full path names of files for which warnings are emitted.
--gui
- Use the gs-based GUI.
- --wx
- Use the wx-based GUI.
+ Use the GUI.
Note:
* denotes that multiple occurrences of these options are possible.
diff --git a/lib/dialyzer/doc/src/dialyzer.xml b/lib/dialyzer/doc/src/dialyzer.xml
index 5bac999ac8..2a631c3010 100644
--- a/lib/dialyzer/doc/src/dialyzer.xml
+++ b/lib/dialyzer/doc/src/dialyzer.xml
@@ -67,7 +67,7 @@
dialyzer [--help] [--version] [--shell] [--quiet] [--verbose]
[-pa dir]* [--plt plt] [--plts plt*] [-Ddefine]*
[-I include_dir]* [--output_plt file] [-Wwarn]*
- [--src] [--gui | --wx] [files_or_dirs] [-r dirs]
+ [--src] [--gui] [files_or_dirs] [-r dirs]
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
@@ -204,9 +204,7 @@
<tag><c><![CDATA[--fullpath]]></c></tag>
<item>Display the full path names of files for which warnings are emitted.</item>
<tag><c><![CDATA[--gui]]></c></tag>
- <item>Use the gs-based GUI.</item>
- <tag><c><![CDATA[--wx]]></c></tag>
- <item>Use the wx-based GUI.</item>
+ <item>Use the GUI.</item>
</taglist>
<note>
<p>* denotes that multiple occurrences of these options are possible.</p>
diff --git a/lib/dialyzer/src/Makefile b/lib/dialyzer/src/Makefile
index bb2edd419a..d7265ba31a 100644
--- a/lib/dialyzer/src/Makefile
+++ b/lib/dialyzer/src/Makefile
@@ -57,7 +57,6 @@ MODULES = \
dialyzer_dataflow \
dialyzer_dep \
dialyzer_explanation \
- dialyzer_gui \
dialyzer_gui_wx \
dialyzer_options \
dialyzer_plt \
@@ -113,9 +112,6 @@ $(EBIN)/dialyzer_cl_parse.$(EMULATOR): dialyzer_cl_parse.erl ../vsn.mk
$(EBIN)/dialyzer_plt.$(EMULATOR): dialyzer_plt.erl ../vsn.mk
$(erlc_verbose)erlc -W $(ERL_COMPILE_FLAGS) -DVSN="\"v$(VSN)\"" -o$(EBIN) dialyzer_plt.erl
-$(EBIN)/dialyzer_gui.$(EMULATOR): dialyzer_gui.erl ../vsn.mk
- $(erlc_verbose)erlc -W $(ERL_COMPILE_FLAGS) -DVSN="\"v$(VSN)\"" -o$(EBIN) dialyzer_gui.erl
-
$(EBIN)/dialyzer_gui_wx.$(EMULATOR): dialyzer_gui_wx.erl ../vsn.mk
$(erlc_verbose)erlc -W $(ERL_COMPILE_FLAGS) -DVSN="\"v$(VSN)\"" -o$(EBIN) dialyzer_gui_wx.erl
@@ -140,7 +136,6 @@ $(EBIN)/dialyzer_contracts.beam: dialyzer.hrl
$(EBIN)/dialyzer_dataflow.beam: dialyzer.hrl
$(EBIN)/dialyzer_dep.beam: dialyzer.hrl
$(EBIN)/dialyzer_explanation.beam: dialyzer.hrl
-$(EBIN)/dialyzer_gui.beam: dialyzer.hrl
$(EBIN)/dialyzer_gui_wx.beam: dialyzer.hrl dialyzer_gui_wx.hrl
$(EBIN)/dialyzer_options.beam: dialyzer.hrl
$(EBIN)/dialyzer_plt.beam: dialyzer.hrl
diff --git a/lib/dialyzer/src/dialyzer.erl b/lib/dialyzer/src/dialyzer.erl
index 822aa0826a..bb7e39dfda 100644
--- a/lib/dialyzer/src/dialyzer.erl
+++ b/lib/dialyzer/src/dialyzer.erl
@@ -62,18 +62,18 @@ plain_cl() ->
cl_halt(cl_check_init(Opts), Opts);
{plt_info, Opts} ->
cl_halt(cl_print_plt_info(Opts), Opts);
- {{gui, Type}, Opts} ->
+ {gui, Opts} ->
try check_gui_options(Opts)
catch throw:{dialyzer_error, Msg} -> cl_error(Msg)
end,
case Opts#options.check_plt of
true ->
case cl_check_init(Opts#options{get_warnings = false}) of
- {ok, _} -> gui_halt(internal_gui(Type, Opts), Opts);
+ {ok, _} -> gui_halt(internal_gui(Opts), Opts);
{error, _} = Error -> cl_halt(Error, Opts)
end;
false ->
- gui_halt(internal_gui(Type, Opts), Opts)
+ gui_halt(internal_gui(Opts), Opts)
end;
{cl, Opts} ->
case Opts#options.check_plt of
@@ -179,12 +179,9 @@ run(Opts) ->
erlang:error({dialyzer_error, lists:flatten(ErrorMsg)})
end.
-internal_gui(Type, OptsRecord) ->
+internal_gui(OptsRecord) ->
F = fun() ->
- case Type of
- gs -> dialyzer_gui:start(OptsRecord);
- wx -> dialyzer_gui_wx:start(OptsRecord)
- end,
+ dialyzer_gui_wx:start(OptsRecord),
?RET_NOTHING_SUSPICIOUS
end,
doit(F).
@@ -205,7 +202,7 @@ gui(Opts) ->
case cl_check_init(OptsRecord) of
{ok, ?RET_NOTHING_SUSPICIOUS} ->
F = fun() ->
- dialyzer_gui:start(OptsRecord)
+ dialyzer_gui_wx:start(OptsRecord)
end,
case doit(F) of
{ok, _} -> ok;
@@ -426,6 +423,9 @@ message_to_string({call_without_opaque, [M, F, Args, ExpectedTriples]}) ->
message_to_string({opaque_eq, [Type, _Op, OpaqueType]}) ->
io_lib:format("Attempt to test for equality between a term of type ~s"
" and a term of opaque type ~s\n", [Type, OpaqueType]);
+message_to_string({opaque_guard, [Arg1, Infix, Arg2, ArgNs]}) ->
+ io_lib:format("Guard test ~s ~s ~s contains ~s\n",
+ [Arg1, Infix, Arg2, form_positions(ArgNs)]);
message_to_string({opaque_guard, [Guard, Args]}) ->
io_lib:format("Guard test ~w~s breaks the opaqueness of its argument\n",
[Guard, Args]);
@@ -438,8 +438,16 @@ message_to_string({opaque_match, [Pat, OpaqueType, OpaqueTerm]}) ->
message_to_string({opaque_neq, [Type, _Op, OpaqueType]}) ->
io_lib:format("Attempt to test for inequality between a term of type ~s"
" and a term of opaque type ~s\n", [Type, OpaqueType]);
-message_to_string({opaque_type_test, [Fun, Opaque]}) ->
- io_lib:format("The type test ~s(~s) breaks the opaqueness of the term ~s\n", [Fun, Opaque, Opaque]);
+message_to_string({opaque_type_test, [Fun, Args, Arg, ArgType]}) ->
+ io_lib:format("The type test ~s~s breaks the opaqueness of the term ~s~s\n",
+ [Fun, Args, Arg, ArgType]);
+message_to_string({opaque_size, [SizeType, Size]}) ->
+ io_lib:format("The size ~s breaks the opaqueness of ~s\n",
+ [SizeType, Size]);
+message_to_string({opaque_call, [M, F, Args, Culprit, OpaqueType]}) ->
+ io_lib:format("The call ~s:~s~s breaks the opaqueness of the term ~s :: ~s\n",
+ [M, F, Args, Culprit, OpaqueType]);
+
%%----- Warnings for concurrency errors --------------------
message_to_string({race_condition, [M, F, Args, Reason]}) ->
io_lib:format("The call ~w:~w~s ~s\n", [M, F, Args, Reason]);
diff --git a/lib/dialyzer/src/dialyzer_cl.erl b/lib/dialyzer/src/dialyzer_cl.erl
index 365c0b36d4..a7be6e0d05 100644
--- a/lib/dialyzer/src/dialyzer_cl.erl
+++ b/lib/dialyzer/src/dialyzer_cl.erl
@@ -2,7 +2,7 @@
%%-------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -613,7 +613,7 @@ cl_loop(State, LogCache) ->
-spec failed_anal_msg(string(), [_]) -> nonempty_string().
failed_anal_msg(Reason, LogCache) ->
- Msg = "Analysis failed with error:\n" ++ Reason ++ "\n",
+ Msg = "Analysis failed with error:\n" ++ lists:flatten(Reason) ++ "\n",
case LogCache =:= [] of
true -> Msg;
false ->
@@ -640,7 +640,7 @@ store_unknown_behaviours(#cl_state{unknown_behaviours = Behs} = St, Beh) ->
-spec cl_error(string()) -> no_return().
cl_error(Msg) ->
- throw({dialyzer_error, Msg}).
+ throw({dialyzer_error, lists:flatten(Msg)}).
-spec cl_error(#cl_state{}, string()) -> no_return().
@@ -650,7 +650,7 @@ cl_error(State, Msg) ->
Outfile -> io:format(Outfile, "\n~s\n", [Msg])
end,
maybe_close_output_file(State),
- throw({dialyzer_error, Msg}).
+ throw({dialyzer_error, lists:flatten(Msg)}).
return_value(State = #cl_state{erlang_mode = ErlangMode,
mod_deps = ModDeps,
diff --git a/lib/dialyzer/src/dialyzer_cl_parse.erl b/lib/dialyzer/src/dialyzer_cl_parse.erl
index 2ea3d3af5a..db27b2037d 100644
--- a/lib/dialyzer/src/dialyzer_cl_parse.erl
+++ b/lib/dialyzer/src/dialyzer_cl_parse.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2012. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -30,7 +30,7 @@
-type dial_cl_parse_ret() :: {'check_init', #options{}}
| {'plt_info', #options{}}
| {'cl', #options{}}
- | {{'gui', 'gs' | 'wx'}, #options{}}
+ | {'gui', #options{}}
| {'error', string()}.
-type deep_string() :: string() | [deep_string()].
@@ -193,12 +193,9 @@ cl(["--dump_callgraph", File|T]) ->
put(dialyzer_callgraph_file, File),
cl(T);
cl(["--gui"|T]) ->
- put(dialyzer_options_mode, {gui, gs}),
+ put(dialyzer_options_mode, gui),
cl(T);
-cl(["--wx"|T]) ->
- put(dialyzer_options_mode, {gui, wx}),
- cl(T);
-cl(["--solver",Solver|T]) -> % not documented
+cl(["--solver", Solver|T]) -> % not documented
append_var(dialyzer_solvers, [list_to_atom(Solver)]),
cl(T);
cl([H|_] = L) ->
@@ -217,7 +214,7 @@ cl([]) ->
{plt_info, cl_options()};
false ->
case get(dialyzer_options_mode) of
- {gui, _} = GUI -> {GUI, common_options()};
+ gui -> {gui, common_options()};
cl ->
case get(dialyzer_options_analysis_type) =:= plt_check of
true -> {check_init, cl_options()};
@@ -361,7 +358,7 @@ help_message() ->
S = "Usage: dialyzer [--help] [--version] [--shell] [--quiet] [--verbose]
[-pa dir]* [--plt plt] [--plts plt*] [-Ddefine]*
[-I include_dir]* [--output_plt file] [-Wwarn]*
- [--src] [--gui | --wx] [files_or_dirs] [-r dirs]
+ [--src] [--gui] [files_or_dirs] [-r dirs]
[--apps applications] [-o outfile]
[--build_plt] [--add_to_plt] [--remove_from_plt]
[--check_plt] [--no_check_plt] [--plt_info] [--get_warnings]
@@ -473,9 +470,7 @@ Options:
--fullpath
Display the full path names of files for which warnings are emitted.
--gui
- Use the gs-based GUI.
- --wx
- Use the wx-based GUI.
+ Use the GUI.
Note:
* denotes that multiple occurrences of these options are possible.
diff --git a/lib/dialyzer/src/dialyzer_contracts.erl b/lib/dialyzer/src/dialyzer_contracts.erl
index 332a326b0d..3467ab4e65 100644
--- a/lib/dialyzer/src/dialyzer_contracts.erl
+++ b/lib/dialyzer/src/dialyzer_contracts.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -21,10 +21,10 @@
-module(dialyzer_contracts).
-export([check_contract/2,
- check_contracts/3,
+ check_contracts/4,
contracts_without_fun/3,
contract_to_string/1,
- get_invalid_contract_warnings/3,
+ get_invalid_contract_warnings/4,
get_contract_args/1,
get_contract_return/1,
get_contract_return/2,
@@ -160,17 +160,22 @@ process_contract_remote_types(CodeServer) ->
dialyzer_codeserver:finalize_contracts(NewContractDict, NewCallbackDict,
CodeServer).
+-type opaques() :: [erl_types:erl_type()] | 'universe'.
+-type opaques_fun() :: fun((module()) -> opaques()).
+
-spec check_contracts([{mfa(), file_contract()}],
- dialyzer_callgraph:callgraph(), dict()) -> plt_contracts().
+ dialyzer_callgraph:callgraph(), dict(),
+ opaques_fun()) -> plt_contracts().
-check_contracts(Contracts, Callgraph, FunTypes) ->
+check_contracts(Contracts, Callgraph, FunTypes, FindOpaques) ->
FoldFun =
fun(Label, Type, NewContracts) ->
case dialyzer_callgraph:lookup_name(Label, Callgraph) of
{ok, {M,F,A} = MFA} ->
case orddict:find(MFA, Contracts) of
{ok, {_FileLine, Contract}} ->
- case check_contract(Contract, Type) of
+ Opaques = FindOpaques(M),
+ case check_contract(Contract, Type, Opaques) of
ok ->
case erl_bif_types:is_known(M, F, A) of
true ->
@@ -192,7 +197,10 @@ check_contracts(Contracts, Callgraph, FunTypes) ->
%% Checks all components of a contract
-spec check_contract(#contract{}, erl_types:erl_type()) -> 'ok' | {'error', term()}.
-check_contract(#contract{contracts = Contracts}, SuccType) ->
+check_contract(Contract, SuccType) ->
+ check_contract(Contract, SuccType, 'universe').
+
+check_contract(#contract{contracts = Contracts}, SuccType, Opaques) ->
try
Contracts1 = [{Contract, insert_constraints(Constraints, dict:new())}
|| {Contract, Constraints} <- Contracts],
@@ -203,9 +211,9 @@ check_contract(#contract{contracts = Contracts}, SuccType) ->
error ->
{error, {overlapping_contract, []}};
ok ->
- InfList = [erl_types:t_inf(Contract, SuccType, opaque)
+ InfList = [erl_types:t_inf(Contract, SuccType, Opaques)
|| Contract <- Contracts2],
- case check_contract_inf_list(InfList, SuccType) of
+ case check_contract_inf_list(InfList, SuccType, Opaques) of
{error, _} = Invalid -> Invalid;
ok -> check_extraneous(Contracts2, SuccType)
end
@@ -217,7 +225,7 @@ check_contract(#contract{contracts = Contracts}, SuccType) ->
check_domains([_]) -> ok;
check_domains([Dom|Doms]) ->
Fun = fun(D) ->
- erl_types:any_none_or_unit(erl_types:t_inf_lists(Dom, D, opaque))
+ erl_types:any_none_or_unit(erl_types:t_inf_lists(Dom, D))
end,
case lists:all(Fun, Doms) of
true -> check_domains(Doms);
@@ -227,23 +235,23 @@ check_domains([Dom|Doms]) ->
%% Allow a contract if one of the overloaded contracts is possible.
%% We used to be more strict, e.g., all overloaded contracts had to be
%% possible.
-check_contract_inf_list([FunType|Left], SuccType) ->
+check_contract_inf_list([FunType|Left], SuccType, Opaques) ->
FunArgs = erl_types:t_fun_args(FunType),
case lists:any(fun erl_types:t_is_none_or_unit/1, FunArgs) of
- true -> check_contract_inf_list(Left, SuccType);
+ true -> check_contract_inf_list(Left, SuccType, Opaques);
false ->
STRange = erl_types:t_fun_range(SuccType),
case erl_types:t_is_none_or_unit(STRange) of
true -> ok;
false ->
Range = erl_types:t_fun_range(FunType),
- case erl_types:t_is_none(erl_types:t_inf(STRange, Range, opaque)) of
- true -> check_contract_inf_list(Left, SuccType);
+ case erl_types:t_is_none(erl_types:t_inf(STRange, Range)) of
+ true -> check_contract_inf_list(Left, SuccType, Opaques);
false -> ok
end
end
end;
-check_contract_inf_list([], _SuccType) ->
+check_contract_inf_list([], _SuccType, _Opaques) ->
{error, invalid_contract}.
check_extraneous([], _SuccType) -> ok;
@@ -259,7 +267,7 @@ check_extraneous_1(Contract, SuccType) ->
STRng = erl_types:t_fun_range(SuccType),
?debug("CR = ~p\nSR = ~p\n", [CRngs, STRng]),
case [CR || CR <- CRngs,
- erl_types:t_is_none(erl_types:t_inf(CR, STRng, opaque))] of
+ erl_types:t_is_none(erl_types:t_inf(CR, STRng))] of
[] ->
CRngList = list_part(CRng),
STRngList = list_part(STRng),
@@ -268,7 +276,7 @@ check_extraneous_1(Contract, SuccType) ->
true ->
CRngElements = erl_types:t_list_elements(CRngList),
STRngElements = erl_types:t_list_elements(STRngList),
- Inf = erl_types:t_inf(CRngElements, STRngElements, opaque),
+ Inf = erl_types:t_inf(CRngElements, STRngElements),
case erl_types:t_is_none(Inf) of
true -> {error, invalid_contract};
false -> ok
@@ -278,7 +286,7 @@ check_extraneous_1(Contract, SuccType) ->
end.
list_part(Type) ->
- erl_types:t_inf(erl_types:t_list(), Type, opaque).
+ erl_types:t_inf(erl_types:t_list(), Type).
is_not_nil_list(Type) ->
erl_types:t_is_list(Type) andalso not erl_types:t_is_nil(Type).
@@ -374,7 +382,7 @@ insert_constraints([], Dict) -> Dict.
store_tmp_contract(MFA, FileLine, TypeSpec, SpecDict, RecordsDict) ->
%% io:format("contract from form: ~p\n", [TypeSpec]),
TmpContract = contract_from_form(TypeSpec, RecordsDict, FileLine),
- %% io:format("contract: ~p\n", [Contract]),
+ %% io:format("contract: ~p\n", [TmpContract]),
dict:store(MFA, {FileLine, TmpContract}, SpecDict).
contract_from_form(Forms, RecDict, FileLine) ->
@@ -494,30 +502,35 @@ general_domain([], AccSig) ->
AccSig1 = erl_types:subst_all_vars_to_any(AccSig),
erl_types:t_fun_args(AccSig1).
--spec get_invalid_contract_warnings([module()], dialyzer_codeserver:codeserver(), dialyzer_plt:plt()) -> [dial_warning()].
+-spec get_invalid_contract_warnings([module()],
+ dialyzer_codeserver:codeserver(),
+ dialyzer_plt:plt(),
+ opaques_fun()) -> [dial_warning()].
-get_invalid_contract_warnings(Modules, CodeServer, Plt) ->
- get_invalid_contract_warnings_modules(Modules, CodeServer, Plt, []).
+get_invalid_contract_warnings(Modules, CodeServer, Plt, FindOpaques) ->
+ get_invalid_contract_warnings_modules(Modules, CodeServer, Plt, FindOpaques, []).
-get_invalid_contract_warnings_modules([Mod|Mods], CodeServer, Plt, Acc) ->
+get_invalid_contract_warnings_modules([Mod|Mods], CodeServer, Plt, FindOpaques, Acc) ->
Contracts1 = dialyzer_codeserver:lookup_mod_contracts(Mod, CodeServer),
Contracts2 = dict:to_list(Contracts1),
Records = dialyzer_codeserver:lookup_mod_records(Mod, CodeServer),
- NewAcc = get_invalid_contract_warnings_funs(Contracts2, Plt, Records, Acc),
- get_invalid_contract_warnings_modules(Mods, CodeServer, Plt, NewAcc);
-get_invalid_contract_warnings_modules([], _CodeServer, _Plt, Acc) ->
+ NewAcc = get_invalid_contract_warnings_funs(Contracts2, Plt, Records, FindOpaques, Acc),
+ get_invalid_contract_warnings_modules(Mods, CodeServer, Plt, FindOpaques, NewAcc);
+get_invalid_contract_warnings_modules([], _CodeServer, _Plt, _FindOpaques, Acc) ->
Acc.
get_invalid_contract_warnings_funs([{MFA, {FileLine, Contract}}|Left],
- Plt, RecDict, Acc) ->
+ Plt, RecDict, FindOpaques, Acc) ->
case dialyzer_plt:lookup(Plt, MFA) of
none ->
%% This must be a contract for a non-available function. Just accept it.
- get_invalid_contract_warnings_funs(Left, Plt, RecDict, Acc);
+ get_invalid_contract_warnings_funs(Left, Plt, RecDict, FindOpaques, Acc);
{value, {Ret, Args}} ->
Sig = erl_types:t_fun(Args, Ret),
+ {M, _F, _A} = MFA,
+ Opaques = FindOpaques(M),
NewAcc =
- case check_contract(Contract, Sig) of
+ case check_contract(Contract, Sig, Opaques) of
{error, invalid_contract} ->
[invalid_contract_warning(MFA, FileLine, Sig, RecDict)|Acc];
{error, {overlapping_contract, []}} ->
@@ -551,7 +564,7 @@ get_invalid_contract_warnings_funs([{MFA, {FileLine, Contract}}|Left],
BifArgs = erl_bif_types:arg_types(M, F, A),
BifRet = erl_bif_types:type(M, F, A),
BifSig = erl_types:t_fun(BifArgs, BifRet),
- case check_contract(Contract, BifSig) of
+ case check_contract(Contract, BifSig, Opaques) of
{error, _} ->
[invalid_contract_warning(MFA, FileLine, BifSig, RecDict)
|Acc];
@@ -564,9 +577,9 @@ get_invalid_contract_warnings_funs([{MFA, {FileLine, Contract}}|Left],
RecDict, Acc)
end
end,
- get_invalid_contract_warnings_funs(Left, Plt, RecDict, NewAcc)
+ get_invalid_contract_warnings_funs(Left, Plt, RecDict, FindOpaques, NewAcc)
end;
-get_invalid_contract_warnings_funs([], _Plt, _RecDict, Acc) ->
+get_invalid_contract_warnings_funs([], _Plt, _RecDict, _FindOpaques, Acc) ->
Acc.
invalid_contract_warning({M, F, A}, FileLine, SuccType, RecDict) ->
@@ -601,16 +614,23 @@ picky_contract_check(CSig0, Sig0, MFA, FileLine, Contract, RecDict, Acc) ->
end.
extra_contract_warning({M, F, A}, FileLine, Contract, CSig, Sig, RecDict) ->
- SigString = lists:flatten(dialyzer_utils:format_sig(Sig, RecDict)),
- ContractString0 = lists:flatten(dialyzer_utils:format_sig(CSig, RecDict)),
+ %% We do not want to depend upon erl_types:t_to_string() possibly
+ %% hiding the contents of opaque types.
+ SigUnopaque = erl_types:t_unopaque(Sig),
+ CSigUnopaque = erl_types:t_unopaque(CSig),
+ SigString0 =
+ lists:flatten(dialyzer_utils:format_sig(SigUnopaque, RecDict)),
+ ContractString0 =
+ lists:flatten(dialyzer_utils:format_sig(CSigUnopaque, RecDict)),
%% The only difference is in record fields containing 'undefined' or not.
- IsUndefRecordFieldsRelated = SigString =:= ContractString0,
+ IsUndefRecordFieldsRelated = SigString0 =:= ContractString0,
{IsRemoteTypesRelated, SubtypeRelation} =
is_remote_types_related(Contract, CSig, Sig, RecDict),
case IsUndefRecordFieldsRelated orelse IsRemoteTypesRelated of
true ->
no_warning;
false ->
+ SigString = lists:flatten(dialyzer_utils:format_sig(Sig, RecDict)),
ContractString = contract_to_string(Contract),
{Tag, Msg} =
case SubtypeRelation of
diff --git a/lib/dialyzer/src/dialyzer_dataflow.erl b/lib/dialyzer/src/dialyzer_dataflow.erl
index 922ccad599..3591d5be8e 100644
--- a/lib/dialyzer/src/dialyzer_dataflow.erl
+++ b/lib/dialyzer/src/dialyzer_dataflow.erl
@@ -2,7 +2,7 @@
%%--------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2012. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -41,27 +41,33 @@
-include("dialyzer.hrl").
+%%-import(helper, %% 'helper' could be any module doing sanity checks...
-import(erl_types,
- [any_none/1, t_any/0, t_atom/0, t_atom/1, t_atom_vals/1,
+ [t_inf/2, t_inf/3, t_inf_lists/2, t_inf_lists/3,
+ t_inf_lists/3, t_is_equal/2, t_is_subtype/2, t_subtract/2,
+ t_sup/1, t_sup/2]).
+
+-import(erl_types,
+ [any_none/1, t_any/0, t_atom/0, t_atom/1, t_atom_vals/1, t_atom_vals/2,
t_binary/0, t_boolean/0,
t_bitstr/0, t_bitstr/2, t_bitstr_concat/1, t_bitstr_match/2,
- t_cons/0, t_cons/2, t_cons_hd/1, t_cons_tl/1, t_contains_opaque/1,
+ t_cons/0, t_cons/2, t_cons_hd/2, t_cons_tl/2,
+ t_contains_opaque/2,
t_find_opaque_mismatch/2, t_float/0, t_from_range/2, t_from_term/1,
- t_fun/0, t_fun/2, t_fun_args/1, t_fun_range/1,
- t_inf/2, t_inf/3, t_inf_lists/2, t_inf_lists/3, t_inf_lists_masked/3,
- t_integer/0, t_integers/1,
- t_is_any/1, t_is_atom/1, t_is_atom/2, t_is_boolean/1, t_is_equal/2,
- t_is_integer/1, t_is_nil/1, t_is_none/1, t_is_none_or_unit/1,
- t_is_number/1, t_is_reference/1, t_is_pid/1, t_is_port/1,
- t_is_subtype/2, t_is_unit/1,
+ t_fun/0, t_fun/2, t_fun_args/1, t_fun_args/2, t_fun_range/1,
+ t_fun_range/2, t_integer/0, t_integers/1,
+ t_is_any/1, t_is_atom/1, t_is_atom/2, t_is_any_atom/3,
+ t_is_boolean/2,
+ t_is_integer/2, t_is_nil/2, t_is_none/1, t_is_none_or_unit/1,
+ t_is_number/2, t_is_reference/2, t_is_pid/2, t_is_port/2,
+ t_is_unit/1,
t_limit/2, t_list/0, t_maybe_improper_list/0, t_module/0,
- t_none/0, t_non_neg_integer/0, t_number/0, t_number_vals/1,
- t_opaque_match_atom/2, t_opaque_match_record/2,
- t_opaque_matching_structure/2,
+ t_none/0, t_non_neg_integer/0, t_number/0, t_number_vals/2,
t_pid/0, t_port/0, t_product/1, t_reference/0,
- t_sup/1, t_sup/2, t_subtract/2, t_to_string/2, t_to_tlist/1,
- t_tuple/0, t_tuple/1, t_tuple_args/1, t_tuple_subtypes/1,
- t_unit/0, t_unopaque/1]).
+ t_to_string/2, t_to_tlist/1,
+ t_tuple/0, t_tuple/1, t_tuple_args/1, t_tuple_args/2,
+ t_tuple_subtypes/2,
+ t_unit/0, t_unopaque/2]).
%%-define(DEBUG, true).
%%-define(DEBUG_PP, true).
@@ -204,7 +210,7 @@ analyze_loop(State) ->
traverse(Tree, Map, State) ->
?debug("Handling ~p\n", [cerl:type(Tree)]),
- %%debug_pp_map(Map),
+ %% debug_pp_map(Map),
case cerl:type(Tree) of
alias ->
%% This only happens when checking for illegal record patterns
@@ -256,12 +262,7 @@ traverse(Tree, Map, State) ->
case cerl:unfold_literal(Tree) of
Tree ->
Type = literal_type(Tree),
- NewType =
- case erl_types:t_opaque_match_atom(Type, State#state.opaques) of
- [Opaque] -> Opaque;
- _ -> Type
- end,
- {State, Map, NewType};
+ {State, Map, Type};
NewTree -> traverse(NewTree, Map, State)
end;
module ->
@@ -286,8 +287,11 @@ traverse(Tree, Map, State) ->
SMA;
false ->
State2 =
- case (t_is_any(ArgType) orelse t_is_simple(ArgType)
- orelse is_call_to_send(Arg)) of
+ case
+ t_is_any(ArgType)
+ orelse t_is_simple(ArgType, State)
+ orelse is_call_to_send(Arg)
+ of
true -> % do not warn in these cases
State1;
false ->
@@ -311,15 +315,7 @@ traverse(Tree, Map, State) ->
case state__lookup_type_for_letrec(Tree, State) of
error ->
LType = lookup_type(Tree, Map),
- Opaques = State#state.opaques,
- case t_opaque_match_record(LType, Opaques) of
- [Opaque] -> {State, Map, Opaque};
- _ ->
- case t_opaque_match_atom(LType, Opaques) of
- [Opaque] -> {State, Map, Opaque};
- _ -> {State, Map, LType}
- end
- end;
+ {State, Map, LType};
{ok, Type} -> {State, Map, Type}
end;
Other ->
@@ -367,7 +363,8 @@ handle_apply(Tree, Map, State) ->
Tree, Msg),
{State3, Map2, t_none()};
false ->
- NewArgs = t_inf_lists(ArgTypes, t_fun_args(OpType1)),
+ NewArgs = t_inf_lists(ArgTypes,
+ t_fun_args(OpType1, 'universe')),
case any_none(NewArgs) of
true ->
Msg = {fun_app_args,
@@ -378,7 +375,7 @@ handle_apply(Tree, Map, State) ->
{State3, enter_type(Op, OpType1, Map2), t_none()};
false ->
Map3 = enter_type_lists(Args, NewArgs, Map2),
- Range0 = t_fun_range(OpType1),
+ Range0 = t_fun_range(OpType1, 'universe'),
Range =
case t_is_unit(Range0) of
true -> t_none();
@@ -423,83 +420,55 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
{M, F, A} = Fun,
case erl_bif_types:is_known(M, F, A) of
true ->
- IsBIF = true,
BArgs = erl_bif_types:arg_types(M, F, A),
BRange =
fun(FunArgs) ->
- ArgPos = erl_bif_types:structure_inspecting_args(M, F, A),
- NewFunArgs =
- case ArgPos =:= [] of
- true -> FunArgs;
- false -> % some positions need to be un-opaqued
- N = length(FunArgs),
- PFs = lists:zip(lists:seq(1, N), FunArgs),
- [case ordsets:is_element(P, ArgPos) of
- true -> erl_types:t_unopaque(FArg, Opaques);
- false -> FArg
- end || {P, FArg} <- PFs]
- end,
- erl_bif_types:type(M, F, A, NewFunArgs)
+ erl_bif_types:type(M, F, A, FunArgs, Opaques)
end,
{BArgs, BRange};
- false -> IsBIF = false, GenSig
+ false ->
+ GenSig
end;
- local -> IsBIF = false, GenSig
+ local -> GenSig
end,
{SigArgs, SigRange} =
- %% if there is hard-coded or contract information with opaque types,
- %% the checking for possible type violations needs to take place w.r.t.
- %% this information and not w.r.t. the structure-based success typing.
- case prefer_opaque_types(CArgs, BifArgs) of
- true -> {AnyArgs, t_any()}; % effectively forgets the success typing
- false ->
- case Sig of
- {value, {SR, SA}} -> {SA, SR};
- none -> {AnyArgs, t_any()}
- end
- end,
- ArgModeMask = [case lists:member(Arg, Opaques) of
- true -> opaque;
- false -> structured
- end || Arg <- ArgTypes],
- NewArgsSig = t_inf_lists_masked(SigArgs, ArgTypes, ArgModeMask),
- NewArgsContract = t_inf_lists_masked(CArgs, ArgTypes, ArgModeMask),
- NewArgsBif = t_inf_lists_masked(BifArgs, ArgTypes, ArgModeMask),
- NewArgTypes0 = t_inf_lists_masked(NewArgsSig, NewArgsContract, ArgModeMask),
- NewArgTypes = t_inf_lists_masked(NewArgTypes0, NewArgsBif, ArgModeMask),
- BifRet = BifRange(NewArgTypes),
- {TmpArgTypes, TmpArgsContract} =
- case (TypeOfApply =:= remote) andalso (not IsBIF) of
- true ->
- List1 = lists:zip(CArgs, NewArgTypes),
- List2 = lists:zip(CArgs, NewArgsContract),
- {[erl_types:t_unopaque_on_mismatch(T1, T2, Opaques)
- || {T1, T2} <- List1],
- [erl_types:t_unopaque_on_mismatch(T1, T2, Opaques)
- || {T1, T2} <- List2]};
- false -> {NewArgTypes, NewArgsContract}
- end,
- ContrRet = CRange(TmpArgTypes),
- RetMode =
- case t_contains_opaque(ContrRet) orelse t_contains_opaque(BifRet) of
- true -> opaque;
- false -> structured
+ case Sig of
+ {value, {SR, SA}} -> {SA, SR};
+ none -> {AnyArgs, t_any()}
end,
- RetWithoutContr = t_inf(SigRange, BifRet, RetMode),
- RetWithoutLocal = t_inf(ContrRet, RetWithoutContr, RetMode),
+
?debug("--------------------------------------------------------\n", []),
- ?debug("Fun: ~p\n", [Fun]),
- ?debug("Args: ~s\n", [erl_types:t_to_string(t_product(ArgTypes))]),
+ ?debug("Fun: ~p\n", [state__lookup_name(Fun, State)]),
+ ?debug("Module ~p\n", [State#state.module]),
+ ?debug("CArgs ~s\n", [erl_types:t_to_string(t_product(CArgs))]),
+ ?debug("ArgTypes ~s\n", [erl_types:t_to_string(t_product(ArgTypes))]),
+ ?debug("BifArgs ~p\n", [erl_types:t_to_string(t_product(BifArgs))]),
+
+ NewArgsSig = t_inf_lists(SigArgs, ArgTypes, Opaques),
+ ?debug("SigArgs ~s\n", [erl_types:t_to_string(t_product(SigArgs))]),
?debug("NewArgsSig: ~s\n", [erl_types:t_to_string(t_product(NewArgsSig))]),
+ NewArgsContract = t_inf_lists(CArgs, ArgTypes, Opaques),
?debug("NewArgsContract: ~s\n",
[erl_types:t_to_string(t_product(NewArgsContract))]),
+ NewArgsBif = t_inf_lists(BifArgs, ArgTypes, Opaques),
?debug("NewArgsBif: ~s\n", [erl_types:t_to_string(t_product(NewArgsBif))]),
- ?debug("NewArgTypes: ~s\n", [erl_types:t_to_string(t_product(NewArgTypes))]),
+ NewArgTypes0 = t_inf_lists(NewArgsSig, NewArgsContract),
+ NewArgTypes = t_inf_lists(NewArgTypes0, NewArgsBif, Opaques),
+ ?debug("NewArgTypes ~s\n", [erl_types:t_to_string(t_product(NewArgTypes))]),
+ ?debug("\n", []),
+
+ BifRet = BifRange(NewArgTypes),
+ ContrRet = CRange(NewArgTypes),
+ RetWithoutContr = t_inf(SigRange, BifRet),
+ RetWithoutLocal = t_inf(ContrRet, RetWithoutContr),
+
?debug("RetWithoutContr: ~s\n",[erl_types:t_to_string(RetWithoutContr)]),
?debug("RetWithoutLocal: ~s\n", [erl_types:t_to_string(RetWithoutLocal)]),
?debug("BifRet: ~s\n", [erl_types:t_to_string(BifRange(NewArgTypes))]),
- ?debug("ContrRet: ~s\n", [erl_types:t_to_string(CRange(TmpArgTypes))]),
- ?debug("SigRet: ~s\n", [erl_types:t_to_string(SigRange)]),
+ ?debug("SigRange: ~s\n", [erl_types:t_to_string(SigRange)]),
+ ?debug("ContrRet: ~s\n", [erl_types:t_to_string(CRange(NewArgTypes))]),
+ ?debug("LocalRet: ~s\n", [erl_types:t_to_string(LocalRet)]),
+
State1 =
case is_race_analysis_enabled(State) of
true ->
@@ -513,6 +482,9 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
FailedConj = any_none([RetWithoutLocal|NewArgTypes]),
IsFailBif = t_is_none(BifRange(BifArgs)),
IsFailSig = t_is_none(SigRange),
+ ?debug("FailedConj: ~p~n", [FailedConj]),
+ ?debug("IsFailBif: ~p~n", [IsFailBif]),
+ ?debug("IsFailSig: ~p~n", [IsFailSig]),
State2 =
case FailedConj andalso not (IsFailBif orelse IsFailSig) of
true ->
@@ -532,14 +504,14 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
false ->
FailedSig = any_none(NewArgsSig),
FailedContract =
- any_none([CRange(TmpArgsContract)|NewArgsContract]),
+ any_none([CRange(NewArgsContract)|NewArgsContract]),
FailedBif = any_none([BifRange(NewArgsBif)|NewArgsBif]),
InfSig = t_inf(t_fun(SigArgs, SigRange),
- t_fun(BifArgs, BifRange(BifArgs))),
+ t_fun(BifArgs, BifRange(BifArgs))),
FailReason =
apply_fail_reason(FailedSig, FailedBif, FailedContract),
Msg = get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes, InfSig,
- Contr, CArgs, State1, FailReason),
+ Contr, CArgs, State1, FailReason, Opaques),
WarnType = case Msg of
{call, _} -> ?WARN_FAILING_CALL;
{apply, _} -> ?WARN_FAILING_CALL;
@@ -547,7 +519,8 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
{call_without_opaque, _} -> ?WARN_OPAQUE;
{opaque_type_test, _} -> ?WARN_OPAQUE
end,
- state__add_warning(State1, WarnType, Tree, Msg)
+ Frc = {erlang, is_record, 3} =:= state__lookup_name(Fun, State),
+ state__add_warning(State1, WarnType, Tree, Msg, Frc)
end;
false -> State1
end,
@@ -571,7 +544,7 @@ handle_apply_or_call([{TypeOfApply, {Fun, Sig, Contr, LocalRet}}|Left],
TotalRet =
case t_is_none(LocalRet) andalso t_is_unit(RetWithoutLocal) of
true -> RetWithoutLocal;
- false -> t_inf(RetWithoutLocal, LocalRet, opaque)
+ false -> t_inf(RetWithoutLocal, LocalRet)
end,
NewAccRet = t_sup(AccRet, TotalRet),
?debug("NewAccRet: ~s\n", [t_to_string(NewAccRet)]),
@@ -590,7 +563,7 @@ apply_fail_reason(FailedSig, FailedBif, FailedContract) ->
end.
get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes,
- Sig, Contract, ContrArgs, State, FailReason) ->
+ Sig, Contract, ContrArgs, State, FailReason, Opaques) ->
ArgStrings = format_args(Args, ArgTypes, State),
ContractInfo =
case Contract of
@@ -599,44 +572,52 @@ get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes,
dialyzer_contracts:contract_to_string(C)};
none -> {false, none}
end,
- EnumArgTypes =
- case NewArgTypes of
- [] -> [];
- _ -> lists:zip(lists:seq(1, length(NewArgTypes)), NewArgTypes)
- end,
+ EnumArgTypes = lists:zip(lists:seq(1, length(NewArgTypes)), NewArgTypes),
ArgNs = [Arg || {Arg, Type} <- EnumArgTypes, t_is_none(Type)],
case state__lookup_name(Fun, State) of
- {M, F, _A} ->
- case is_opaque_type_test_problem(Fun, NewArgTypes, State) of
- true ->
- [Opaque] = NewArgTypes,
- {opaque_type_test, [atom_to_list(F), erl_types:t_to_string(Opaque)]};
- false ->
+ {M, F, A} ->
+ case is_opaque_type_test_problem(Fun, Args, NewArgTypes, State) of
+ {yes, Arg, ArgType} ->
+ {opaque_type_test, [atom_to_list(F), ArgStrings,
+ format_arg(Arg), format_type(ArgType, State)]};
+ no ->
SigArgs = t_fun_args(Sig),
- case is_opaque_related_problem(ArgNs, ArgTypes) of
- true -> %% an opaque term is used where a structured term is expected
- ExpectedArgs =
- case FailReason of
- only_sig -> SigArgs;
- _ -> ContrArgs
- end,
- {call_with_opaque, [M, F, ArgStrings, ArgNs, ExpectedArgs]};
- false ->
- case is_opaque_related_problem(ArgNs, SigArgs) orelse
- is_opaque_related_problem(ArgNs, ContrArgs) of
- true -> %% a structured term is used where an opaque is expected
- ExpectedTriples =
- case FailReason of
- only_sig -> expected_arg_triples(ArgNs, SigArgs, State);
- _ -> expected_arg_triples(ArgNs, ContrArgs, State)
- end,
- {call_without_opaque, [M, F, ArgStrings, ExpectedTriples]};
- false -> %% there is a structured term clash in some argument
- {call, [M, F, ArgStrings,
- ArgNs, FailReason,
- format_sig_args(Sig, State),
- format_type(t_fun_range(Sig), State),
- ContractInfo]}
+ BadOpaque =
+ opaque_problems([SigArgs, ContrArgs], ArgTypes, Opaques, ArgNs),
+ %% In fact *both* 'call_with_opaque' and
+ %% 'call_without_opaque' are possible.
+ case lists:keyfind(decl, 1, BadOpaque) of
+ {decl, BadArgs} ->
+ %% a structured term is used where an opaque is expected
+ ExpectedTriples =
+ case FailReason of
+ only_sig -> expected_arg_triples(BadArgs, SigArgs, State);
+ _ -> expected_arg_triples(BadArgs, ContrArgs, State)
+ end,
+ {call_without_opaque, [M, F, ArgStrings, ExpectedTriples]};
+ false ->
+ case lists:keyfind(use, 1, BadOpaque) of
+ {use, BadArgs} ->
+ %% an opaque term is used where a structured term is expected
+ ExpectedArgs =
+ case FailReason of
+ only_sig -> SigArgs;
+ _ -> ContrArgs
+ end,
+ {call_with_opaque, [M, F, ArgStrings, BadArgs, ExpectedArgs]};
+ false ->
+ case
+ erl_bif_types:opaque_args(M, F, A, ArgTypes, Opaques)
+ of
+ [] -> %% there is a structured term clash in some argument
+ {call, [M, F, ArgStrings,
+ ArgNs, FailReason,
+ format_sig_args(Sig, State),
+ format_type(t_fun_range(Sig), State),
+ ContractInfo]};
+ Ns ->
+ {call_with_opaque, [M, F, ArgStrings, Ns, ContrArgs]}
+ end
end
end
end;
@@ -648,20 +629,28 @@ get_apply_fail_msg(Fun, Args, ArgTypes, NewArgTypes,
ContractInfo]}
end.
-%% returns 'true' if we are running with opaque on (not checked yet),
-%% and there is either a contract or hard-coded type information with
-%% opaque types
-%% TODO: check that we are running with opaque types
-%% TODO: check the return type also
-prefer_opaque_types(CArgs, BifArgs) ->
- t_contains_opaque(t_product(CArgs))
- orelse t_contains_opaque(t_product(BifArgs)).
-
-is_opaque_related_problem(ArgNs, ArgTypes) ->
- Fun = fun (N) -> erl_types:t_contains_opaque(lists:nth(N, ArgTypes)) end,
- ArgNs =/= [] andalso lists:all(Fun, ArgNs).
-
-is_opaque_type_test_problem(Fun, ArgTypes, State) ->
+%% -> [{ElementI, [ArgN]}] where [ArgN] is a non-empty list of
+%% arguments containing unknown opaque types and Element is 1 or 2.
+opaque_problems(ContractOrSigList, ArgTypes, Opaques, ArgNs) ->
+ ArgElementList = find_unknown(ContractOrSigList, ArgTypes, Opaques, ArgNs),
+ F = fun(1) -> decl; (2) -> use end,
+ [{F(ElementI), lists:usort([ArgN || {ArgN, EI} <- ArgElementList,
+ EI =:= ElementI])} ||
+ ElementI <- lists:usort([EI || {_, EI} <- ArgElementList])].
+
+%% -> [{ArgN, ElementI}] where ElementI = 1 means there is an unknown
+%% opaque type in argument ArgN of the the contract/signature,
+%% and ElementI = 2 means that there is an unknown opaque type in
+%% argument ArgN of the the (current) argument types.
+find_unknown(ContractOrSigList, ArgTypes, Opaques, NoneArgNs) ->
+ ArgNs = lists:seq(1, length(ArgTypes)),
+ [{ArgN, ElementI} ||
+ ContractOrSig <- ContractOrSigList,
+ {E1, E2, ArgN} <- lists:zip3(ContractOrSig, ArgTypes, ArgNs),
+ lists:member(ArgN, NoneArgNs),
+ ElementI <- erl_types:t_find_unknown_opaque(E1, E2, Opaques)].
+
+is_opaque_type_test_problem(Fun, Args, ArgTypes, State) ->
case Fun of
{erlang, FN, 1} when FN =:= is_atom; FN =:= is_boolean;
FN =:= is_binary; FN =:= is_bitstring;
@@ -669,10 +658,18 @@ is_opaque_type_test_problem(Fun, ArgTypes, State) ->
FN =:= is_integer; FN =:= is_list;
FN =:= is_number; FN =:= is_pid; FN =:= is_port;
FN =:= is_reference; FN =:= is_tuple ->
- [Type] = ArgTypes,
- erl_types:t_is_opaque(Type) andalso
- not lists:member(Type, State#state.opaques);
- _ -> false
+ type_test_opaque_arg(Args, ArgTypes, State#state.opaques);
+ {erlang, FN, 2} when FN =:= is_function ->
+ type_test_opaque_arg(Args, ArgTypes, State#state.opaques);
+ _ -> no
+ end.
+
+type_test_opaque_arg([], [], _Opaques) ->
+ no;
+type_test_opaque_arg([Arg|Args], [ArgType|ArgTypes], Opaques) ->
+ case erl_types:t_has_opaque_subtype(ArgType, Opaques) of
+ true -> {yes, Arg, ArgType};
+ false -> type_test_opaque_arg(Args, ArgTypes, Opaques)
end.
expected_arg_triples(ArgNs, ArgTypes, State) ->
@@ -683,47 +680,56 @@ expected_arg_triples(ArgNs, ArgTypes, State) ->
add_bif_warnings({erlang, Op, 2}, [T1, T2] = Ts, Tree, State)
when Op =:= '=:='; Op =:= '==' ->
- Type1 = erl_types:t_unopaque(T1, State#state.opaques),
- Type2 = erl_types:t_unopaque(T2, State#state.opaques),
- Inf = t_inf(T1, T2),
- Inf1 = t_inf(Type1, Type2),
- case t_is_none(Inf) andalso t_is_none(Inf1) andalso(not any_none(Ts))
- andalso (not is_int_float_eq_comp(T1, Op, T2)) of
+ Opaques = State#state.opaques,
+ Inf = t_inf(T1, T2, Opaques),
+ case
+ t_is_none(Inf) andalso (not any_none(Ts))
+ andalso (not is_int_float_eq_comp(T1, Op, T2, Opaques))
+ of
true ->
- Args = case erl_types:t_is_opaque(T1) of
- true -> [format_type(T2, State), Op, format_type(T1, State)];
- false -> [format_type(T1, State), Op, format_type(T2, State)]
- end,
- case any_opaque(Ts) of
- true ->
- state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_eq, Args});
- false ->
- state__add_warning(State, ?WARN_MATCHING, Tree, {exact_eq, Args})
+ %% Give priority to opaque warning (as usual).
+ case erl_types:t_find_unknown_opaque(T1, T2, Opaques) of
+ [] ->
+ Args = comp_format_args([], T1, Op, T2, State),
+ state__add_warning(State, ?WARN_MATCHING, Tree, {exact_eq, Args});
+ Ns ->
+ Args = comp_format_args(Ns, T1, Op, T2, State),
+ state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_eq, Args})
end;
false ->
State
end;
add_bif_warnings({erlang, Op, 2}, [T1, T2] = Ts, Tree, State)
when Op =:= '=/='; Op =:= '/=' ->
- Inf = t_inf(T1, T2),
- case t_is_none(Inf) andalso (not any_none(Ts))
- andalso (not is_int_float_eq_comp(T1, Op, T2)) andalso any_opaque(Ts) of
+ Opaques = State#state.opaques,
+ case
+ (not any_none(Ts))
+ andalso (not is_int_float_eq_comp(T1, Op, T2, Opaques))
+ of
true ->
- Args = case erl_types:t_is_opaque(T1) of
- true -> [format_type(T2, State), Op, format_type(T1, State)];
- false -> [format_type(T1, State), Op, format_type(T2, State)]
- end,
- state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_neq, Args});
+ case erl_types:t_find_unknown_opaque(T1, T2, Opaques) of
+ [] -> State;
+ Ns ->
+ Args = comp_format_args(Ns, T1, Op, T2, State),
+ state__add_warning(State, ?WARN_OPAQUE, Tree, {opaque_neq, Args})
+ end;
false ->
State
end;
add_bif_warnings(_, _, _, State) ->
State.
-is_int_float_eq_comp(T1, Op, T2) ->
+is_int_float_eq_comp(T1, Op, T2, Opaques) ->
(Op =:= '==' orelse Op =:= '/=') andalso
- ((erl_types:t_is_float(T1) andalso erl_types:t_is_integer(T2)) orelse
- (erl_types:t_is_integer(T1) andalso erl_types:t_is_float(T2))).
+ ((erl_types:t_is_float(T1, Opaques)
+ andalso t_is_integer(T2, Opaques)) orelse
+ (t_is_integer(T1, Opaques)
+ andalso erl_types:t_is_float(T2, Opaques))).
+
+comp_format_args([1|_], T1, Op, T2, State) ->
+ [format_type(T2, State), Op, format_type(T1, State)];
+comp_format_args(_, T1, Op, T2, State) ->
+ [format_type(T1, State), Op, format_type(T2, State)].
%%----------------------------------------
@@ -784,16 +790,27 @@ handle_bitstr(Tree, Map, State) ->
{State3, Map2, t_none()};
false ->
UnitVal = cerl:concrete(cerl:bitstr_unit(Tree)),
- Type =
- case t_number_vals(SizeType) of
- [OneSize] -> t_bitstr(0, OneSize * UnitVal);
- _ ->
- MinSize = erl_types:number_min(SizeType),
- t_bitstr(UnitVal, UnitVal * MinSize)
- end,
+ Opaques = State2#state.opaques,
+ NumberVals = t_number_vals(SizeType, Opaques),
+ {State3, Type} =
+ case t_contains_opaque(SizeType, Opaques) of
+ true ->
+ Msg = {opaque_size, [format_type(SizeType, State2),
+ format_cerl(Size)]},
+ {state__add_warning(State2, ?WARN_OPAQUE, Size, Msg),
+ t_none()};
+ false ->
+ case NumberVals of
+ [OneSize] -> {State2, t_bitstr(0, OneSize * UnitVal)};
+ unknown -> {State2, t_bitstr()};
+ _ ->
+ MinSize = erl_types:number_min(SizeType, Opaques),
+ {State2, t_bitstr(UnitVal, UnitVal * MinSize)}
+ end
+ end,
Map3 = enter_type_lists([Val, Size, Tree],
[ValType, SizeType, Type], Map2),
- {State2, Map3, Type}
+ {State3, Map3, Type}
end
end.
@@ -805,34 +822,47 @@ handle_call(Tree, Map, State) ->
Args = cerl:call_args(Tree),
MFAList = [M, F|Args],
{State1, Map1, [MType0, FType0|As]} = traverse_list(MFAList, Map, State),
- %% Module and function names should be treated as *structured terms*
- %% even if they happen to be identical to an atom (or tuple) which
- %% is also involved in the definition of an opaque data type.
- MType = t_inf(t_module(), t_unopaque(MType0)),
- FType = t_inf(t_atom(), t_unopaque(FType0)),
+ Opaques = State#state.opaques,
+ MType = t_inf(t_module(), MType0, Opaques),
+ FType = t_inf(t_atom(), FType0, Opaques),
Map2 = enter_type_lists([M, F], [MType, FType], Map1),
+ MOpaque = t_is_none(MType) andalso (not t_is_none(MType0)),
+ FOpaque = t_is_none(FType) andalso (not t_is_none(FType0)),
case any_none([MType, FType|As]) of
true ->
State2 =
- case t_is_none(MType) andalso (not t_is_none(MType0)) of
- true -> % This is a problem we just detected; not a known one
- MS = format_cerl(M),
- Msg = {app_call, [MS, format_cerl(F),
- format_args(Args, As, State1),
- MS, format_type(t_module(), State1),
- format_type(MType0, State1)]},
- state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg);
- false ->
- case t_is_none(FType) andalso (not t_is_none(FType0)) of
- true ->
- FS = format_cerl(F),
- Msg = {app_call, [format_cerl(M), FS,
- format_args(Args, As, State1),
- FS, format_type(t_atom(), State1),
- format_type(FType0, State1)]},
- state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg);
- false -> State1
- end
+ if
+ MOpaque -> % This is a problem we just detected; not a known one
+ MS = format_cerl(M),
+ case t_is_none(t_inf(t_module(), MType0)) of
+ true ->
+ Msg = {app_call, [MS, format_cerl(F),
+ format_args(Args, As, State1),
+ MS, format_type(t_module(), State1),
+ format_type(MType0, State1)]},
+ state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg);
+ false ->
+ Msg = {opaque_call, [MS, format_cerl(F),
+ format_args(Args, As, State1),
+ MS, format_type(MType0, State1)]},
+ state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg)
+ end;
+ FOpaque ->
+ FS = format_cerl(F),
+ case t_is_none(t_inf(t_atom(), FType0)) of
+ true ->
+ Msg = {app_call, [format_cerl(M), FS,
+ format_args(Args, As, State1),
+ FS, format_type(t_atom(), State1),
+ format_type(FType0, State1)]},
+ state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg);
+ false ->
+ Msg = {opaque_call, [format_cerl(M), FS,
+ format_args(Args, As, State1),
+ FS, format_type(FType0, State1)]},
+ state__add_warning(State1, ?WARN_FAILING_CALL, Tree, Msg)
+ end;
+ true -> State1
end,
{State2, Map2, t_none()};
false ->
@@ -874,7 +904,7 @@ handle_case(Tree, Map, State) ->
handle_clauses(Clauses, Arg, ArgType, ArgType, State2,
[], Map2, [], []),
Map3 = join_maps_end(MapList, Map2),
- debug_pp_map(Map2),
+ debug_pp_map(Map3),
{State3, Map3, Type}
end.
@@ -886,7 +916,7 @@ handle_cons(Tree, Map, State) ->
{State1, Map1, HdType} = traverse(Hd, Map, State),
{State2, Map2, TlType} = traverse(Tl, Map1, State1),
State3 =
- case t_is_none(t_inf(TlType, t_list())) of
+ case t_is_none(t_inf(TlType, t_list(), State2#state.opaques)) of
true ->
Msg = {improper_list_constr, [format_type(TlType, State2)]},
state__add_warning(State2, ?WARN_NON_PROPER_LIST, Tree, Msg);
@@ -979,8 +1009,9 @@ handle_receive(Tree, Map, State) ->
[], []),
Map1 = join_maps(MapList, Map),
{State3, Map2, TimeoutType} = traverse(Timeout, Map1, State2),
- case (t_is_atom(TimeoutType) andalso
- (t_atom_vals(TimeoutType) =:= ['infinity'])) of
+ Opaques = State3#state.opaques,
+ case (t_is_atom(TimeoutType, Opaques) andalso
+ (t_atom_vals(TimeoutType, Opaques) =:= ['infinity'])) of
true ->
{State3, Map2, ReceiveType};
false ->
@@ -1031,55 +1062,46 @@ handle_tuple(Tree, Map, State) ->
true ->
{State1, Map1, t_none()};
false ->
- %% Let's find out if this is a record or opaque construction.
+ %% Let's find out if this is a record
case Elements of
[Tag|Left] ->
case cerl:is_c_atom(Tag) of
true ->
TagVal = cerl:atom_val(Tag),
- case t_opaque_match_record(TupleType, State1#state.opaques) of
- [Opaque] ->
- RecStruct = t_opaque_matching_structure(TupleType, Opaque),
- RecFields = t_tuple_args(RecStruct),
- case bind_pat_vars(Elements, RecFields, [], Map1, State1) of
- {error, _, ErrorPat, ErrorType, _} ->
- Msg = {record_constr,
- [TagVal, format_patterns(ErrorPat),
- format_type(ErrorType, State1)]},
- State2 = state__add_warning(State1, ?WARN_MATCHING,
- Tree, Msg),
- {State2, Map1, t_none()};
- {Map2, _ETypes} ->
- {State1, Map2, Opaque}
- end;
- _ ->
- case state__lookup_record(TagVal, length(Left), State1) of
- error -> {State1, Map1, TupleType};
- {ok, RecType} ->
- InfTupleType = t_inf(RecType, TupleType),
- case t_is_none(InfTupleType) of
- true ->
- RecC = format_type(TupleType, State1),
- FieldDiffs = format_field_diffs(TupleType, State1),
- Msg = {record_constr, [RecC, FieldDiffs]},
- State2 = state__add_warning(State1, ?WARN_MATCHING,
- Tree, Msg),
- {State2, Map1, t_none()};
- false ->
- case bind_pat_vars(Elements, t_tuple_args(RecType),
- [], Map1, State1) of
- {error, bind, ErrorPat, ErrorType, _} ->
- Msg = {record_constr,
- [TagVal, format_patterns(ErrorPat),
- format_type(ErrorType, State1)]},
- State2 = state__add_warning(State1, ?WARN_MATCHING,
- Tree, Msg),
- {State2, Map1, t_none()};
- {Map2, ETypes} ->
- {State1, Map2, t_tuple(ETypes)}
- end
- end
- end
+ case state__lookup_record(TagVal, length(Left), State1) of
+ error -> {State1, Map1, TupleType};
+ {ok, RecType} ->
+ InfTupleType = t_inf(RecType, TupleType),
+ case t_is_none(InfTupleType) of
+ true ->
+ RecC = format_type(TupleType, State1),
+ FieldDiffs = format_field_diffs(TupleType, State1),
+ Msg = {record_constr, [RecC, FieldDiffs]},
+ State2 = state__add_warning(State1, ?WARN_MATCHING,
+ Tree, Msg),
+ {State2, Map1, t_none()};
+ false ->
+ case bind_pat_vars(Elements, t_tuple_args(RecType),
+ [], Map1, State1) of
+ {error, bind, ErrorPat, ErrorType, _} ->
+ Msg = {record_constr,
+ [TagVal, format_patterns(ErrorPat),
+ format_type(ErrorType, State1)]},
+ State2 = state__add_warning(State1, ?WARN_MATCHING,
+ Tree, Msg),
+ {State2, Map1, t_none()};
+ {error, opaque, ErrorPat, ErrorType, OpaqueType} ->
+ Msg = {opaque_match,
+ [format_patterns(ErrorPat),
+ format_type(ErrorType, State1),
+ format_type(OpaqueType, State1)]},
+ State2 = state__add_warning(State1, ?WARN_OPAQUE,
+ Tree, Msg),
+ {State2, Map1, t_none()};
+ {Map2, ETypes} ->
+ {State1, Map2, t_tuple(ETypes)}
+ end
+ end
end;
false ->
{State1, Map1, t_tuple(EsType)}
@@ -1356,7 +1378,9 @@ bind_pat_vars_reverse(Pats, Types, Acc, Map, State) ->
end.
bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
- ?debug("Binding pat: ~w to ~s\n", [cerl:type(Pat), format_type(Type, State)]),
+ ?debug("Binding pat: ~w to ~s\n", [cerl:type(Pat), format_type(Type, State)]
+),
+ Opaques = State#state.opaques,
{NewMap, TypeOut} =
case cerl:type(Pat) of
alias ->
@@ -1372,9 +1396,15 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
case Rev of
true -> {Map, t_bitstr()};
false ->
- BinType = t_inf(t_bitstr(), Type),
+ BinType = t_inf(t_bitstr(), Type, Opaques),
case t_is_none(BinType) of
- true -> bind_error([Pat], Type, t_none(), bind);
+ true ->
+ case t_find_opaque_mismatch(t_bitstr(), Type) of
+ {ok, T1, T2} ->
+ bind_error([Pat], T1, T2, opaque);
+ error ->
+ bind_error([Pat], Type, t_none(), bind)
+ end;
false ->
Segs = cerl:binary_segments(Pat),
{Map1, SegTypes} = bind_bin_segs(Segs, BinType, Map, State),
@@ -1382,28 +1412,24 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
end
end;
cons ->
- Cons = t_inf(Type, t_cons()),
+ Cons = t_inf(Type, t_cons(), Opaques),
case t_is_none(Cons) of
true ->
bind_opaque_pats(t_cons(), Type, Pat, Map, State, Rev);
false ->
{Map1, [HdType, TlType]} =
bind_pat_vars([cerl:cons_hd(Pat), cerl:cons_tl(Pat)],
- [t_cons_hd(Cons), t_cons_tl(Cons)],
+ [t_cons_hd(Cons, Opaques),
+ t_cons_tl(Cons, Opaques)],
[], Map, State, Rev),
{Map1, t_cons(HdType, TlType)}
end;
literal ->
Literal = literal_type(Pat),
- LiteralOrOpaque =
- case t_opaque_match_atom(Literal, State#state.opaques) of
- [Opaque] -> Opaque;
- _ -> Literal
- end,
- case t_is_none(t_inf(LiteralOrOpaque, Type)) of
+ case t_is_none(t_inf(Literal, Type, Opaques)) of
true ->
bind_opaque_pats(Literal, Type, Pat, Map, State, Rev);
- false -> {Map, LiteralOrOpaque}
+ false -> {Map, Literal}
end;
tuple ->
Es = cerl:tuple_es(Pat),
@@ -1419,27 +1445,28 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
{ok, Record} ->
[_Head|AnyTail] = [t_any() || _ <- Es],
UntypedRecord = t_tuple([t_atom(TagAtom)|AnyTail]),
- {not erl_types:t_is_equal(Record, UntypedRecord), Record}
+ {not t_is_equal(Record, UntypedRecord), Record}
end;
false -> {false, t_tuple(length(Es))}
end
end,
- Tuple = t_inf(Prototype, Type),
+ Tuple = t_inf(Prototype, Type, Opaques),
case t_is_none(Tuple) of
true ->
bind_opaque_pats(Prototype, Type, Pat, Map, State, Rev);
false ->
- SubTuples = t_tuple_subtypes(Tuple),
+ SubTuples = t_tuple_subtypes(Tuple, Opaques),
%% Need to call the top function to get the try-catch wrapper
MapJ = join_maps_begin(Map),
Results =
case Rev of
true ->
- [bind_pat_vars_reverse(Es, t_tuple_args(SubTuple), [],
- MapJ, State)
+ [bind_pat_vars_reverse(Es, t_tuple_args(SubTuple, Opaques),
+ [], MapJ, State)
|| SubTuple <- SubTuples];
false ->
- [bind_pat_vars(Es, t_tuple_args(SubTuple), [], MapJ, State)
+ [bind_pat_vars(Es, t_tuple_args(SubTuple, Opaques), [],
+ MapJ, State)
|| SubTuple <- SubTuples]
end,
case lists:keyfind(opaque, 2, Results) of
@@ -1466,37 +1493,14 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
bind_pat_vars(Es, t_to_tlist(Type), [], Map, State, Rev),
{Map1, t_product(EsTypes)};
var ->
- Opaques = State#state.opaques,
VarType1 =
case state__lookup_type_for_letrec(Pat, State) of
- error ->
- LType = lookup_type(Pat, Map),
- case t_opaque_match_record(LType, Opaques) of
- [Opaque] -> Opaque;
- _ ->
- case t_opaque_match_atom(LType, Opaques) of
- [Opaque] -> Opaque;
- _ -> LType
- end
- end;
+ error -> lookup_type(Pat, Map);
{ok, RecType} -> RecType
end,
%% Must do inf when binding args to pats. Vars in pats are fresh.
- VarType2 = t_inf(VarType1, Type),
- VarType3 =
- case Opaques =/= [] of
- true ->
- case t_opaque_match_record(VarType2, Opaques) of
- [OpaqueRec] -> OpaqueRec;
- _ ->
- case t_opaque_match_atom(VarType2, Opaques) of
- [OpaqueAtom] -> OpaqueAtom;
- _ -> VarType2
- end
- end;
- false -> VarType2
- end,
- case t_is_none(VarType3) of
+ VarType2 = t_inf(VarType1, Type, Opaques),
+ case t_is_none(VarType2) of
true ->
case t_find_opaque_mismatch(VarType1, Type) of
{ok, T1, T2} ->
@@ -1505,8 +1509,8 @@ bind_pat_vars([Pat|PatLeft], [Type|TypeLeft], Acc, Map, State, Rev) ->
bind_error([Pat], Type, t_none(), bind)
end;
false ->
- Map1 = enter_type(Pat, VarType3, Map),
- {Map1, VarType3}
+ Map1 = enter_type(Pat, VarType2, Map),
+ {Map1, VarType2}
end;
_Other ->
%% Catch all is needed when binding args to pats
@@ -1529,7 +1533,8 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
binary = SegType, [] = Segs, %% just an assert
T = t_inf(t_bitstr(UnitVal, 0), BinType),
{Map1, [Type]} = bind_pat_vars([Val], [T], [], Map, State, false),
- bind_bin_segs(Segs, t_bitstr(0, 0), [Type|Acc], Map1, State);
+ Type1 = remove_local_opaque_types(Type, State#state.opaques),
+ bind_bin_segs(Segs, t_bitstr(0, 0), [Type1|Acc], Map1, State);
utf -> % XXX: possibly can be strengthened
true = lists:member(SegType, [utf8, utf16, utf32]),
{Map1, [_]} = bind_pat_vars([Val], [t_integer()], [], Map, State, false),
@@ -1539,11 +1544,17 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
Size = cerl:bitstr_size(Seg),
{Map1, [SizeType]} =
bind_pat_vars([Size], [t_non_neg_integer()], [], Map, State, false),
+ Opaques = State#state.opaques,
+ NumberVals = t_number_vals(SizeType, Opaques),
+ case t_contains_opaque(SizeType, Opaques) of
+ true -> bind_error([Seg], SizeType, t_none(), opaque);
+ false -> ok
+ end,
Type =
- case t_number_vals(SizeType) of
+ case NumberVals of
[OneSize] -> t_bitstr(0, UnitVal * OneSize);
- _ ->
- MinSize = erl_types:number_min(SizeType),
+ _ -> % 'unknown' too
+ MinSize = erl_types:number_min(SizeType, Opaques),
t_bitstr(UnitVal, UnitVal * MinSize)
end,
ValConstr =
@@ -1551,7 +1562,7 @@ bind_bin_segs([Seg|Segs], BinType, Acc, Map, State) ->
binary -> Type; %% The same constraints as for the whole bitstr
float -> t_float();
integer ->
- case t_number_vals(SizeType) of
+ case NumberVals of
unknown -> t_integer();
List ->
SizeVal = lists:max(List),
@@ -1579,7 +1590,7 @@ bind_error(Pats, Type, OpaqueType, Error) ->
bind_opaque_pats(GenType, Type, Pat, Map, State, Rev) ->
case t_find_opaque_mismatch(GenType, Type) of
{ok, T1, T2} ->
- case lists:member(T2, State#state.opaques) of
+ case erl_types:is_opaque_type(T2, State#state.opaques) of
true ->
NewType = erl_types:t_struct_from_opaque(Type, [T2]),
{Map1, _} =
@@ -1700,19 +1711,9 @@ handle_guard_call(Guard, Map, Env, Eval, State) ->
handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
Args = cerl:call_args(Guard),
- {Map1, As0} = bind_guard_list(Args, Map, Env, dont_know, State),
- MapFun = fun(Type) ->
- case lists:member(Type, State#state.opaques) of
- true -> erl_types:t_opaque_structure(Type);
- false -> Type
- end
- end,
- As = lists:map(MapFun, As0),
- Mode = case As =:= As0 of
- true -> structured;
- false -> opaque
- end,
- BifRet = erl_bif_types:type(M, F, A, As),
+ {Map1, As} = bind_guard_list(Args, Map, Env, dont_know, State),
+ Opaques = State#state.opaques,
+ BifRet = erl_bif_types:type(M, F, A, As, Opaques),
case t_is_none(BifRet) of
true ->
%% Is this an error-bif?
@@ -1721,11 +1722,8 @@ handle_guard_gen_fun({M, F, A}, Guard, Map, Env, Eval, State) ->
false -> signal_guard_fatal_fail(Eval, Guard, As, State)
end;
false ->
- BifArgs = case erl_bif_types:arg_types(M, F, A) of
- unknown -> lists:duplicate(A, t_any());
- List -> List
- end,
- Map2 = enter_type_lists(Args, t_inf_lists(BifArgs, As0, Mode), Map1),
+ BifArgs = bif_args(M, F, A),
+ Map2 = enter_type_lists(Args, t_inf_lists(BifArgs, As, Opaques), Map1),
Ret =
case Eval of
pos -> t_inf(t_atom(true), BifRet);
@@ -1771,29 +1769,19 @@ bind_type_test(Eval, TypeTest, ArgType, State) ->
is_reference -> t_reference();
is_tuple -> t_tuple()
end,
- Mode = determine_mode(ArgType, State#state.opaques),
case Eval of
pos ->
- Inf = t_inf(Type, ArgType, Mode),
+ Inf = t_inf(Type, ArgType, State#state.opaques),
case t_is_none(Inf) of
true -> error;
false -> {ok, Inf, t_atom(true)}
end;
neg ->
- case Mode of
- opaque ->
- Struct = erl_types:t_opaque_structure(ArgType),
- case t_is_none(t_subtract(Struct, Type)) of
- true -> error;
- false -> {ok, ArgType, t_atom(false)}
- end;
- structured ->
- Sub = t_subtract(ArgType, Type),
- case t_is_none(Sub) of
- true -> error;
- false -> {ok, Sub, t_atom(false)}
- end
- end;
+ Sub = t_subtract(ArgType, Type),
+ case t_is_none(Sub) of
+ true -> error;
+ false -> {ok, Sub, t_atom(false)}
+ end;
dont_know ->
{ok, ArgType, t_boolean()}
end.
@@ -1802,9 +1790,10 @@ handle_guard_comp(Guard, Comp, Map, Env, Eval, State) ->
Args = cerl:call_args(Guard),
[Arg1, Arg2] = Args,
{Map1, ArgTypes} = bind_guard_list(Args, Map, Env, dont_know, State),
+ Opaques = State#state.opaques,
[Type1, Type2] = ArgTypes,
- IsInt1 = t_is_integer(Type1),
- IsInt2 = t_is_integer(Type2),
+ IsInt1 = t_is_integer(Type1, Opaques),
+ IsInt2 = t_is_integer(Type2, Opaques),
case {cerl:type(Arg1), cerl:type(Arg2)} of
{literal, literal} ->
case erlang:Comp(cerl:concrete(Arg1), cerl:concrete(Arg2)) of
@@ -1817,12 +1806,13 @@ handle_guard_comp(Guard, Comp, Map, Env, Eval, State) ->
false when Eval =:= neg -> {Map, t_atom(false)}
end;
{literal, var} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
- case bind_comp_literal_var(Arg1, Arg2, Type2, Comp, Map1) of
+ case bind_comp_literal_var(Arg1, Arg2, Type2, Comp, Map1, Opaques) of
error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
{ok, NewMap} -> {NewMap, t_atom(true)}
end;
{var, literal} when IsInt1 andalso IsInt2 andalso (Eval =:= pos) ->
- case bind_comp_literal_var(Arg2, Arg1, Type1, invert_comp(Comp), Map1) of
+ case bind_comp_literal_var(Arg2, Arg1, Type1, invert_comp(Comp),
+ Map1, Opaques) of
error -> signal_guard_fail(Eval, Guard, ArgTypes, State);
{ok, NewMap} -> {NewMap, t_atom(true)}
end;
@@ -1835,10 +1825,10 @@ invert_comp('<') -> '>';
invert_comp('>=') -> '=<';
invert_comp('>') -> '<'.
-bind_comp_literal_var(Lit, Var, VarType, CompOp, Map) ->
+bind_comp_literal_var(Lit, Var, VarType, CompOp, Map, Opaques) ->
LitVal = cerl:concrete(Lit),
NewVarType =
- case t_number_vals(VarType) of
+ case t_number_vals(VarType, Opaques) of
unknown ->
Range =
case CompOp of
@@ -1847,7 +1837,7 @@ bind_comp_literal_var(Lit, Var, VarType, CompOp, Map) ->
'>=' -> t_from_range(neg_inf, LitVal);
'>' -> t_from_range(neg_inf, LitVal - 1)
end,
- t_inf(Range, VarType);
+ t_inf(Range, VarType, Opaques);
NumberVals ->
NewNumberVals = [X || X <- NumberVals, erlang:CompOp(LitVal, X)],
t_integers(NewNumberVals)
@@ -1861,17 +1851,18 @@ handle_guard_is_function(Guard, Map, Env, Eval, State) ->
Args = cerl:call_args(Guard),
{Map1, ArgTypes0} = bind_guard_list(Args, Map, Env, dont_know, State),
[FunType0, ArityType0] = ArgTypes0,
- ArityType = t_inf(ArityType0, t_integer()),
+ Opaques = State#state.opaques,
+ ArityType = t_inf(ArityType0, t_integer(), Opaques),
case t_is_none(ArityType) of
true -> signal_guard_fail(Eval, Guard, ArgTypes0, State);
false ->
FunTypeConstr =
- case t_number_vals(ArityType) of
+ case t_number_vals(ArityType, State#state.opaques) of
unknown -> t_fun();
Vals ->
t_sup([t_fun(lists:duplicate(X, t_any()), t_any()) || X <- Vals])
end,
- FunType = t_inf(FunType0, FunTypeConstr),
+ FunType = t_inf(FunType0, FunTypeConstr, Opaques),
case t_is_none(FunType) of
true ->
case Eval of
@@ -1896,33 +1887,45 @@ handle_guard_is_record(Guard, Map, Env, Eval, State) ->
Arity = cerl:int_val(Arity0),
{Map1, RecType} = bind_guard(Rec, Map, Env, dont_know, State),
ArityMin1 = Arity - 1,
- TupleType =
- case state__lookup_record(Tag, ArityMin1, State) of
- error -> t_tuple([t_atom(Tag)|lists:duplicate(ArityMin1, t_any())]);
- {ok, Prototype} -> Prototype
- end,
- Mode = determine_mode(RecType, State#state.opaques),
- NewTupleType =
- case t_opaque_match_record(TupleType, State#state.opaques) of
- [Opaque] -> Opaque;
- _ -> TupleType
- end,
- Type = t_inf(NewTupleType, RecType, Mode),
- case t_is_none(Type) of
+ Opaques = State#state.opaques,
+ Tuple = t_tuple([t_atom(Tag)|lists:duplicate(ArityMin1, t_any())]),
+ case t_is_none(t_inf(Tuple, RecType, Opaques)) of
true ->
- case Eval of
- pos -> signal_guard_fail(Eval, Guard,
- [RecType, t_from_term(Tag),
- t_from_term(Arity)],
- State);
- neg -> {Map1, t_atom(false)};
- dont_know -> {Map1, t_atom(false)}
+ case erl_types:t_has_opaque_subtype(RecType, Opaques) of
+ true ->
+ signal_guard_fail(Eval, Guard,
+ [RecType, t_from_term(Tag),
+ t_from_term(Arity)],
+ State);
+ false ->
+ case Eval of
+ pos -> signal_guard_fail(Eval, Guard,
+ [RecType, t_from_term(Tag),
+ t_from_term(Arity)],
+ State);
+ neg -> {Map1, t_atom(false)};
+ dont_know -> {Map1, t_atom(false)}
+ end
end;
false ->
- case Eval of
- pos -> {enter_type(Rec, Type, Map1), t_atom(true)};
- neg -> {Map1, t_atom(false)};
- dont_know -> {Map1, t_boolean()}
+ TupleType =
+ case state__lookup_record(Tag, ArityMin1, State) of
+ error -> Tuple;
+ {ok, Prototype} -> Prototype
+ end,
+ Type = t_inf(TupleType, RecType, State#state.opaques),
+ case t_is_none(Type) of
+ true ->
+ %% No special handling of opaque errors.
+ FArgs = "record " ++ format_type(RecType, State),
+ Msg = {record_matching, [FArgs, Tag]},
+ throw({fail, {Guard, Msg}});
+ false ->
+ case Eval of
+ pos -> {enter_type(Rec, Type, Map1), t_atom(true)};
+ neg -> {Map1, t_atom(false)};
+ dont_know -> {Map1, t_boolean()}
+ end
end
end.
@@ -1975,14 +1978,24 @@ handle_guard_eq(Guard, Map, Env, Eval, State) ->
bind_eq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) ->
{Map1, Type1} = bind_guard(Arg1, Map, Env, dont_know, State),
{Map2, Type2} = bind_guard(Arg2, Map1, Env, dont_know, State),
- case (t_is_nil(Type1) orelse t_is_nil(Type2) orelse
- t_is_atom(Type1) orelse t_is_atom(Type2)) of
+ Opaques = State#state.opaques,
+ case
+ t_is_nil(Type1, Opaques) orelse t_is_nil(Type2, Opaques)
+ orelse t_is_atom(Type1, Opaques) orelse t_is_atom(Type2, Opaques)
+ of
true -> bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State);
false ->
- case Eval of
- pos -> {Map2, t_atom(true)};
- neg -> {Map2, t_atom(false)};
- dont_know -> {Map2, t_boolean()}
+ %% XXX. Is this test OK?
+ OpArgs = erl_types:t_find_unknown_opaque(Type1, Type2, Opaques),
+ case OpArgs =:= [] of
+ true ->
+ case Eval of
+ pos -> {Map2, t_atom(true)};
+ neg -> {Map2, t_atom(false)};
+ dont_know -> {Map2, t_boolean()}
+ end;
+ false ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end
end.
@@ -2021,44 +2034,52 @@ bind_eqeq_guard(Guard, Arg1, Arg2, Map, Env, Eval, State) ->
{Map2, Type2} = bind_guard(Arg2, Map1, Env, dont_know, State),
?debug("Types are:~s =:= ~s\n", [t_to_string(Type1),
t_to_string(Type2)]),
- Inf = t_inf(Type1, Type2),
+ Opaques = State#state.opaques,
+ Inf = t_inf(Type1, Type2, Opaques),
case t_is_none(Inf) of
true ->
- case Eval of
- neg -> {Map2, t_atom(false)};
- dont_know -> {Map2, t_atom(false)};
- pos -> signal_guard_fail(Eval, Guard, [Type1, Type2], State)
+ OpArgs = erl_types:t_find_unknown_opaque(Type1, Type2, Opaques),
+ case OpArgs =:= [] of
+ true ->
+ case Eval of
+ neg -> {Map2, t_atom(false)};
+ dont_know -> {Map2, t_atom(false)};
+ pos -> signal_guard_fail(Eval, Guard, [Type1, Type2], State)
+ end;
+ false ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end;
false ->
case Eval of
- pos ->
- case {cerl:type(Arg1), cerl:type(Arg2)} of
- {var, var} ->
- Map3 = enter_subst(Arg1, Arg2, Map2),
- Map4 = enter_type(Arg2, Inf, Map3),
- {Map4, t_atom(true)};
- {var, _} ->
- Map3 = enter_type(Arg1, Inf, Map2),
- {Map3, t_atom(true)};
- {_, var} ->
- Map3 = enter_type(Arg2, Inf, Map2),
- {Map3, t_atom(true)};
- {_, _} ->
- {Map2, t_atom(true)}
- end;
- neg ->
- {Map2, t_atom(false)};
- dont_know ->
- {Map2, t_boolean()}
+ pos ->
+ case {cerl:type(Arg1), cerl:type(Arg2)} of
+ {var, var} ->
+ Map3 = enter_subst(Arg1, Arg2, Map2),
+ Map4 = enter_type(Arg2, Inf, Map3),
+ {Map4, t_atom(true)};
+ {var, _} ->
+ Map3 = enter_type(Arg1, Inf, Map2),
+ {Map3, t_atom(true)};
+ {_, var} ->
+ Map3 = enter_type(Arg2, Inf, Map2),
+ {Map3, t_atom(true)};
+ {_, _} ->
+ {Map2, t_atom(true)}
+ end;
+ neg ->
+ {Map2, t_atom(false)};
+ dont_know ->
+ {Map2, t_boolean()}
end
end.
bind_eqeq_guard_lit_other(Guard, Arg1, Arg2, Map, Env, State) ->
Eval = dont_know,
+ Opaques = State#state.opaques,
case cerl:concrete(Arg1) of
true ->
{_, Type} = MT = bind_guard(Arg2, Map, Env, pos, State),
- case t_is_atom(true, Type) of
+ case t_is_any_atom(true, Type, Opaques) of
true -> MT;
false ->
{_, Type0} = bind_guard(Arg2, Map, Env, Eval, State),
@@ -2066,7 +2087,7 @@ bind_eqeq_guard_lit_other(Guard, Arg1, Arg2, Map, Env, State) ->
end;
false ->
{Map1, Type} = bind_guard(Arg2, Map, Env, neg, State),
- case t_is_atom(false, Type) of
+ case t_is_any_atom(false, Type, Opaques) of
true -> {Map1, t_atom(true)};
false ->
{_, Type0} = bind_guard(Arg2, Map, Env, Eval, State),
@@ -2087,14 +2108,15 @@ bind_eqeq_guard_lit_other(Guard, Arg1, Arg2, Map, Env, State) ->
handle_guard_and(Guard, Map, Env, Eval, State) ->
[Arg1, Arg2] = cerl:call_args(Guard),
+ Opaques = State#state.opaques,
case Eval of
pos ->
{Map1, Type1} = bind_guard(Arg1, Map, Env, Eval, State),
- case t_is_atom(true, Type1) of
+ case t_is_any_atom(true, Type1, Opaques) of
false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State);
true ->
{Map2, Type2} = bind_guard(Arg2, Map1, Env, Eval, State),
- case t_is_atom(true, Type2) of
+ case t_is_any_atom(true, Type2, Opaques) of
false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State);
true -> {Map2, t_atom(true)}
end
@@ -2109,7 +2131,10 @@ handle_guard_and(Guard, Map, Env, Eval, State) ->
try bind_guard(Arg2, MapJ, Env, neg, State)
catch throw:{fail, _} -> bind_guard(Arg1, MapJ, Env, pos, State)
end,
- case t_is_atom(false, Type1) orelse t_is_atom(false, Type2) of
+ case
+ t_is_any_atom(false, Type1, Opaques)
+ orelse t_is_any_atom(false, Type2, Opaques)
+ of
true -> {join_maps_end([Map1, Map2], MapJ), t_atom(false)};
false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State)
end;
@@ -2124,11 +2149,16 @@ handle_guard_and(Guard, Map, Env, Eval, State) ->
false ->
NewMap = join_maps_end([Map1, Map2], MapJ),
NewType =
- case {t_atom_vals(Bool1), t_atom_vals(Bool2)} of
+ case {t_atom_vals(Bool1, Opaques), t_atom_vals(Bool2, Opaques)} of
{['true'] , ['true'] } -> t_atom(true);
{['false'], _ } -> t_atom(false);
{_ , ['false']} -> t_atom(false);
+ {unknown , _ } ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State);
+ {_ , unknown } ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State);
{_ , _ } -> t_boolean()
+
end,
{NewMap, NewType}
end
@@ -2136,6 +2166,7 @@ handle_guard_and(Guard, Map, Env, Eval, State) ->
handle_guard_or(Guard, Map, Env, Eval, State) ->
[Arg1, Arg2] = cerl:call_args(Guard),
+ Opaques = State#state.opaques,
case Eval of
pos ->
MapJ = join_maps_begin(Map),
@@ -2149,19 +2180,23 @@ handle_guard_or(Guard, Map, Env, Eval, State) ->
catch
throw:{fail,_} -> bind_guard(Arg2, MapJ, Env, dont_know, State)
end,
- case ((t_is_atom(true, Bool1) andalso t_is_boolean(Bool2))
- orelse
- (t_is_atom(true, Bool2) andalso t_is_boolean(Bool1))) of
+ case
+ ((t_is_any_atom(true, Bool1, Opaques)
+ andalso t_is_boolean(Bool2, Opaques))
+ orelse
+ (t_is_any_atom(true, Bool2, Opaques)
+ andalso t_is_boolean(Bool1, Opaques)))
+ of
true -> {join_maps_end([Map1, Map2], MapJ), t_atom(true)};
false -> signal_guard_fail(Eval, Guard, [Bool1, Bool2], State)
end;
neg ->
{Map1, Type1} = bind_guard(Arg1, Map, Env, neg, State),
- case t_is_atom(false, Type1) of
+ case t_is_any_atom(false, Type1, Opaques) of
false -> signal_guard_fail(Eval, Guard, [Type1, t_any()], State);
true ->
{Map2, Type2} = bind_guard(Arg2, Map1, Env, neg, State),
- case t_is_atom(false, Type2) of
+ case t_is_any_atom(false, Type2, Opaques) of
false -> signal_guard_fail(Eval, Guard, [Type1, Type2], State);
true -> {Map2, t_atom(false)}
end
@@ -2177,10 +2212,14 @@ handle_guard_or(Guard, Map, Env, Eval, State) ->
false ->
NewMap = join_maps_end([Map1, Map2], MapJ),
NewType =
- case {t_atom_vals(Bool1), t_atom_vals(Bool2)} of
+ case {t_atom_vals(Bool1, Opaques), t_atom_vals(Bool2, Opaques)} of
{['false'], ['false']} -> t_atom(false);
{['true'] , _ } -> t_atom(true);
{_ , ['true'] } -> t_atom(true);
+ {unknown , _ } ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State);
+ {_ , unknown } ->
+ signal_guard_fail(Eval, Guard, [Type1, Type2], State);
{_ , _ } -> t_boolean()
end,
{NewMap, NewType}
@@ -2189,10 +2228,11 @@ handle_guard_or(Guard, Map, Env, Eval, State) ->
handle_guard_not(Guard, Map, Env, Eval, State) ->
[Arg] = cerl:call_args(Guard),
+ Opaques = State#state.opaques,
case Eval of
neg ->
{Map1, Type} = bind_guard(Arg, Map, Env, pos, State),
- case t_is_atom(true, Type) of
+ case t_is_any_atom(true, Type, Opaques) of
true -> {Map1, t_atom(false)};
false ->
{_, Type0} = bind_guard(Arg, Map, Env, Eval, State),
@@ -2200,7 +2240,7 @@ handle_guard_not(Guard, Map, Env, Eval, State) ->
end;
pos ->
{Map1, Type} = bind_guard(Arg, Map, Env, neg, State),
- case t_is_atom(false, Type) of
+ case t_is_any_atom(false, Type, Opaques) of
true -> {Map1, t_atom(true)};
false ->
{_, Type0} = bind_guard(Arg, Map, Env, Eval, State),
@@ -2212,10 +2252,11 @@ handle_guard_not(Guard, Map, Env, Eval, State) ->
case t_is_none(Bool) of
true -> throw({fatal_fail, none});
false ->
- case t_atom_vals(Bool) of
+ case t_atom_vals(Bool, Opaques) of
['true'] -> {Map1, t_atom(false)};
['false'] -> {Map1, t_atom(true)};
- [_, _] -> {Map1, Bool}
+ [_, _] -> {Map1, Bool};
+ unknown -> signal_guard_fail(Eval, Guard, [Type], State)
end
end
end.
@@ -2235,27 +2276,40 @@ bind_guard_list([], Map, _Env, _Eval, _State, Acc) ->
state()) -> no_return().
signal_guard_fail(Eval, Guard, ArgTypes, State) ->
+ signal_guard_failure(Eval, Guard, ArgTypes, fail, State).
+
+signal_guard_fatal_fail(Eval, Guard, ArgTypes, State) ->
+ signal_guard_failure(Eval, Guard, ArgTypes, fatal_fail, State).
+
+signal_guard_failure(Eval, Guard, ArgTypes, Tag, State) ->
Args = cerl:call_args(Guard),
F = cerl:atom_val(cerl:call_name(Guard)),
- MFA = {cerl:atom_val(cerl:call_module(Guard)), F, length(Args)},
- Msg =
+ {M, F, A} = MFA = {cerl:atom_val(cerl:call_module(Guard)), F, length(Args)},
+ Opaques = State#state.opaques,
+ {Kind, XInfo} =
+ case erl_bif_types:opaque_args(M, F, A, ArgTypes, Opaques) of
+ [] ->
+ {case Eval of
+ neg -> neg_guard_fail;
+ pos -> guard_fail;
+ dont_know -> guard_fail
+ end,
+ []};
+ Ns -> {opaque_guard, [Ns]}
+ end,
+ FArgs =
case is_infix_op(MFA) of
true ->
[ArgType1, ArgType2] = ArgTypes,
[Arg1, Arg2] = Args,
- Kind =
- case Eval of
- neg -> neg_guard_fail;
- pos -> guard_fail;
- dont_know -> guard_fail
- end,
- {Kind, [format_args_1([Arg1], [ArgType1], State),
- atom_to_list(F),
- format_args_1([Arg2], [ArgType2], State)]};
+ [format_args_1([Arg1], [ArgType1], State),
+ atom_to_list(F),
+ format_args_1([Arg2], [ArgType2], State)] ++ XInfo;
false ->
- mk_guard_msg(Eval, F, Args, ArgTypes, State)
+ [F, format_args(Args, ArgTypes, State)]
end,
- throw({fail, {Guard, Msg}}).
+ Msg = {Kind, FArgs},
+ throw({Tag, {Guard, Msg}}).
is_infix_op({erlang, '=:=', 2}) -> true;
is_infix_op({erlang, '==', 2}) -> true;
@@ -2268,25 +2322,10 @@ is_infix_op({erlang, '>=', 2}) -> true;
is_infix_op({M, F, A}) when is_atom(M), is_atom(F),
is_integer(A), 0 =< A, A =< 255 -> false.
--spec signal_guard_fatal_fail(eval(), cerl:c_call(), [erl_types:erl_type()],
- state()) -> no_return().
-
-signal_guard_fatal_fail(Eval, Guard, ArgTypes, State) ->
- Args = cerl:call_args(Guard),
- F = cerl:atom_val(cerl:call_name(Guard)),
- Msg = mk_guard_msg(Eval, F, Args, ArgTypes, State),
- throw({fatal_fail, {Guard, Msg}}).
-
-mk_guard_msg(Eval, F, Args, ArgTypes, State) ->
- FArgs = [F, format_args(Args, ArgTypes, State)],
- case any_has_opaque_subtype(ArgTypes) of
- true -> {opaque_guard, FArgs};
- false ->
- case Eval of
- neg -> {neg_guard_fail, FArgs};
- pos -> {guard_fail, FArgs};
- dont_know -> {guard_fail, FArgs}
- end
+bif_args(M, F, A) ->
+ case erl_bif_types:arg_types(M, F, A) of
+ unknown -> lists:duplicate(A, t_any());
+ List -> List
end.
bind_guard_case_clauses(Arg, Clauses, Map0, Env, Eval, State) ->
@@ -2366,14 +2405,15 @@ bind_guard_case_clauses(GenArgType, GenMap, ArgExpr, [Clause|Left],
end,
{NewMap3, CType} = bind_guard(cerl:clause_body(Clause), NewMap2,
Env, Eval, State),
+ Opaques = State#state.opaques,
case Eval of
pos ->
- case t_is_atom(true, CType) of
+ case t_is_any_atom(true, CType, Opaques) of
true -> ok;
false -> throw({fail, none})
end;
neg ->
- case t_is_atom(false, CType) of
+ case t_is_any_atom(false, CType, Opaques) of
true -> ok;
false -> throw({fail, none})
end;
@@ -2501,8 +2541,11 @@ enter_type(Key, Val, MS) ->
error ->
?debug("Entering ~p :: ~s\n", [KeyLabel, t_to_string(Val)]),
case dict:find(KeyLabel, Dict) of
- {ok, Val} -> MS;
- {ok, _OldVal} -> store_map(KeyLabel, Val, MS);
+ {ok, Value} ->
+ case erl_types:t_is_equal(Val, Value) of
+ true -> MS;
+ false -> store_map(KeyLabel, Val, MS)
+ end;
error -> store_map(KeyLabel, Val, MS)
end
end
@@ -2611,10 +2654,15 @@ get_label(L) when is_integer(L) ->
get_label(T) ->
cerl_trees:get_label(T).
-t_is_simple(ArgType) ->
- t_is_atom(ArgType) orelse t_is_number(ArgType) orelse t_is_port(ArgType)
- orelse t_is_pid(ArgType) orelse t_is_reference(ArgType)
- orelse t_is_nil(ArgType).
+t_is_simple(ArgType, State) ->
+ Opaques = State#state.opaques,
+ t_is_atom(ArgType, Opaques) orelse t_is_number(ArgType, Opaques)
+ orelse t_is_port(ArgType, Opaques)
+ orelse t_is_pid(ArgType, Opaques) orelse t_is_reference(ArgType, Opaques)
+ orelse t_is_nil(ArgType, Opaques).
+
+remove_local_opaque_types(Type, Opaques) ->
+ t_unopaque(Type, Opaques).
%% t_is_structured(ArgType) ->
%% case t_is_nil(ArgType) of
@@ -2638,12 +2686,6 @@ is_call_to_send(Tree) ->
andalso (Arity =:= 2)
end.
-any_opaque(Ts) ->
- lists:any(fun erl_types:t_is_opaque/1, Ts).
-
-any_has_opaque_subtype(Ts) ->
- lists:any(fun erl_types:t_has_opaque_subtype/1, Ts).
-
filter_match_fail([Clause] = Cls) ->
Body = cerl:clause_body(Clause),
case cerl:type(Body) of
@@ -2662,12 +2704,6 @@ filter_match_fail([]) ->
%% receive after 1 -> ok end
[].
-determine_mode(Type, Opaques) ->
- case lists:member(Type, Opaques) of
- true -> opaque;
- false -> structured
- end.
-
%%% ===========================================================================
%%%
%%% The State.
@@ -2679,7 +2715,7 @@ state__new(Callgraph, Tree, Plt, Module, Records) ->
erl_types:t_opaque_from_records(Records),
TreeMap = build_tree_map(Tree),
Funs = dict:fetch_keys(TreeMap),
- FunTab = init_fun_tab(Funs, dict:new(), TreeMap, Callgraph, Plt, Opaques),
+ FunTab = init_fun_tab(Funs, dict:new(), TreeMap, Callgraph, Plt),
ExportedFuns =
[Fun || Fun <- Funs--[top], dialyzer_callgraph:is_escaping(Fun, Callgraph)],
Work = init_work(ExportedFuns),
@@ -2740,12 +2776,14 @@ state__add_warning(#state{warnings = Warnings, warning_mode = true} = State,
case Force of
true ->
Warn = {Tag, {get_file(Ann), abs(get_line(Ann))}, Msg},
+ ?debug("MSG ~s\n", [dialyzer:format_warning(Warn)]),
State#state{warnings = [Warn|Warnings]};
false ->
case is_compiler_generated(Ann) of
true -> State;
false ->
Warn = {Tag, {get_file(Ann), get_line(Ann)}, Msg},
+ ?debug("MSG ~s\n", [dialyzer:format_warning(Warn)]),
State#state{warnings = [Warn|Warnings]}
end
end.
@@ -2875,10 +2913,10 @@ build_tree_map(Tree) ->
end,
cerl_trees:fold(Fun, dict:new(), Tree).
-init_fun_tab([top|Left], Dict, TreeMap, Callgraph, Plt, Opaques) ->
+init_fun_tab([top|Left], Dict, TreeMap, Callgraph, Plt) ->
NewDict = dict:store(top, {[], t_none()}, Dict),
- init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt, Opaques);
-init_fun_tab([Fun|Left], Dict, TreeMap, Callgraph, Plt, Opaques) ->
+ init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt);
+init_fun_tab([Fun|Left], Dict, TreeMap, Callgraph, Plt) ->
Arity = cerl:fun_arity(dict:fetch(Fun, TreeMap)),
FunEntry =
case dialyzer_callgraph:is_escaping(Fun, Callgraph) of
@@ -2895,8 +2933,8 @@ init_fun_tab([Fun|Left], Dict, TreeMap, Callgraph, Plt, Opaques) ->
false -> {not_handled, {lists:duplicate(Arity, t_none()), t_unit()}}
end,
NewDict = dict:store(Fun, FunEntry, Dict),
- init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt, Opaques);
-init_fun_tab([], Dict, _TreeMap, _Callgraph, _Plt, _Opaques) ->
+ init_fun_tab(Left, NewDict, TreeMap, Callgraph, Plt);
+init_fun_tab([], Dict, _TreeMap, _Callgraph, _Plt) ->
?debug("DICT:~p\n",[dict:to_list(Dict)]),
Dict.
@@ -2945,34 +2983,27 @@ state__update_fun_entry(Tree, ArgTypes, Out0,
if Fun =:= top -> Out0;
true ->
case lookup_fun_sig(Fun, CG, Plt) of
- {value, {SigRet, _}} -> t_inf(SigRet, Out0, opaque);
+ {value, {SigRet, _}} -> t_inf(SigRet, Out0);
none -> Out0
end
end,
Out = t_limit(Out1, ?TYPE_LIMIT),
- case dict:find(Fun, FunTab) of
- {ok, {ArgTypes, OldOut}} ->
- case t_is_equal(OldOut, Out) of
- true ->
- ?debug("Fixpoint for ~w: ~s\n",
- [state__lookup_name(Fun, State),
- t_to_string(t_fun(ArgTypes, Out))]),
- State;
- false ->
- NewEntry = {ArgTypes, Out},
- ?debug("New Entry for ~w: ~s\n",
- [state__lookup_name(Fun, State),
- t_to_string(t_fun(ArgTypes, Out))]),
- NewFunTab = dict:store(Fun, NewEntry, FunTab),
- State1 = State#state{fun_tab = NewFunTab},
- state__add_work_from_fun(Tree, State1)
- end;
- {ok, {NewArgTypes, _OldOut}} ->
- %% Can only happen in self-recursive functions. Only update the out type.
- NewEntry = {NewArgTypes, Out},
+ {ok, {OldArgTypes, OldOut}} = dict:find(Fun, FunTab),
+ SameArgs = lists:all(fun({A, B}) -> erl_types:t_is_equal(A, B)
+ end, lists:zip(OldArgTypes, ArgTypes)),
+ SameOut = t_is_equal(OldOut, Out),
+ if
+ SameArgs, SameOut ->
+ ?debug("Fixpoint for ~w: ~s\n",
+ [state__lookup_name(Fun, State),
+ t_to_string(t_fun(ArgTypes, Out))]),
+ State;
+ true ->
+ %% Can only happen in self-recursive functions.
+ NewEntry = {OldArgTypes, Out},
?debug("New Entry for ~w: ~s\n",
[state__lookup_name(Fun, State),
- t_to_string(t_fun(NewArgTypes, Out))]),
+ t_to_string(t_fun(OldArgTypes, Out))]),
NewFunTab = dict:store(Fun, NewEntry, FunTab),
State1 = State#state{fun_tab = NewFunTab},
state__add_work_from_fun(Tree, State1)
@@ -2993,7 +3024,7 @@ state__add_work_from_fun(Tree, #state{callgraph = Callgraph,
%% Must filter the result for results in this module.
FilteredList = [L || {ok, L} <- LabelList, dict:is_key(L, TreeMap)],
?debug("~w: Will try to add:~w\n",
- [state__lookup_name(get_label(Tree), State), MFAList]),
+ [state__lookup_name(Label, State), MFAList]),
lists:foldl(fun(L, AccState) ->
state__add_work(L, AccState)
end, State, FilteredList)
@@ -3054,7 +3085,8 @@ forward_args(Fun, ArgTypes, #state{work = Work, fun_tab = FunTab} = State) ->
case Fixpoint of
true -> State;
false ->
- NewArgTypes = [t_sup(X, Y) || {X, Y} <- lists:zip(ArgTypes, OldArgTypes)],
+ NewArgTypes = [t_sup(X, Y) ||
+ {X, Y} <- lists:zip(ArgTypes, OldArgTypes)],
NewWork = add_work(Fun, Work),
?debug("~w: forwarding args ~s\n",
[state__lookup_name(Fun, State),
@@ -3238,13 +3270,13 @@ format_field_diffs(RecConstruction, #state{records = R}) ->
-spec format_sig_args(erl_types:erl_type(), state()) -> string().
-format_sig_args(Type, #state{records = R}) ->
- SigArgs = t_fun_args(Type),
+format_sig_args(Type, #state{opaques = Opaques} = State) ->
+ SigArgs = t_fun_args(Type, Opaques),
case SigArgs of
[] -> "()";
[SArg|SArgs] ->
- lists:flatten("(" ++ t_to_string(SArg, R)
- ++ ["," ++ t_to_string(T, R) || T <- SArgs] ++ ")")
+ lists:flatten("(" ++ format_type(SArg, State)
+ ++ ["," ++ format_type(T, State) || T <- SArgs] ++ ")")
end.
format_cerl(Tree) ->
diff --git a/lib/dialyzer/src/dialyzer_dep.erl b/lib/dialyzer/src/dialyzer_dep.erl
index 1a477f4388..05f81399fb 100644
--- a/lib/dialyzer/src/dialyzer_dep.erl
+++ b/lib/dialyzer/src/dialyzer_dep.erl
@@ -58,7 +58,8 @@
%% separatedly.
%%
--spec analyze(cerl:c_module()) -> {dict(), ordset('external' | label()), dict()}.
+-spec analyze(cerl:c_module()) ->
+ {dict(), ordset('external' | label()), dict(), dict()}.
analyze(Tree) ->
%% io:format("Handling ~w\n", [cerl:atom_val(cerl:module_name(Tree))]),
diff --git a/lib/dialyzer/src/dialyzer_gui.erl b/lib/dialyzer/src/dialyzer_gui.erl
deleted file mode 100644
index 97e5752577..0000000000
--- a/lib/dialyzer/src/dialyzer_gui.erl
+++ /dev/null
@@ -1,1381 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%------------------------------------------------------------------------
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2006-2013. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%%-----------------------------------------------------------------------
-%%% File : dialyzer_gui.erl
-%%% Authors : Tobias Lindahl <[email protected]>
-%%% Kostis Sagonas <[email protected]>
-%%% Description : The graphical user interface for the Dialyzer tool.
-%%%
-%%% Created : 27 Apr 2004 by Tobias Lindahl <[email protected]>
-%%%-----------------------------------------------------------------------
-
--module(dialyzer_gui).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,entry,2}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,radiobutton,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,stop,0}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
--export([start/1]).
-
--include("dialyzer.hrl").
-
-%%------------------------------------------------------------------------
-
--define(DIALYZER_ERROR_TITLE, "Dialyzer Error").
--define(DIALYZER_MESSAGE_TITLE, "Dialyzer Message").
-
-%%------------------------------------------------------------------------
-
--type gs_object() :: any(). %% XXX: should be imported from gs
-
--record(mode, {start_byte_code :: gs_object(),
- start_src_code :: gs_object()}).
-
--record(menu, {file_save_log :: gs_object(),
- file_save_warn :: gs_object(),
- file_quit :: gs_object(),
- help_about :: gs_object(),
- help_manual :: gs_object(),
- help_warnings :: gs_object(),
- opts_macros :: gs_object(),
- opts_includes :: gs_object(),
- plt_empty :: gs_object(),
- plt_search_doc :: gs_object(),
- plt_show_doc :: gs_object(),
- warnings :: gs_object()}).
-
--record(gui_state, {add_all :: gs_object(),
- add_file :: gs_object(),
- add_rec :: gs_object(),
- chosen_box :: gs_object(),
- analysis_pid :: pid(),
- del_file :: gs_object(),
- doc_plt :: dialyzer_plt:plt(),
- clear_chosen :: gs_object(),
- clear_log :: gs_object(),
- clear_warn :: gs_object(),
- init_plt :: dialyzer_plt:plt(),
- dir_entry :: gs_object(),
- file_box :: gs_object(),
- file_wd :: gs_object(),
- gs :: gs_object(),
- log :: gs_object(),
- menu :: #menu{},
- mode :: #mode{},
- options :: #options{},
- packer :: gs_object(),
- run :: gs_object(),
- stop :: gs_object(),
- top :: gs_object(),
- warnings_box :: gs_object(),
- backend_pid :: pid()}).
-
-%%------------------------------------------------------------------------
-
--spec start(#options{}) -> ?RET_NOTHING_SUSPICIOUS.
-
-start(#options{from = From, init_plts = InitPltFiles,
- legal_warnings = LegalWarnings} = DialyzerOptions) ->
- process_flag(trap_exit, true),
-
- GS = gs:start(),
- code:add_pathsa(["."]),
- WH = [{width, 1000}, {height, 550}],
- EmptySpace = {stretch, 1},
-
- {ok, Host} = inet:gethostname(),
- %% --------- Top Window --------------
- TopWin = gs:window(GS, [{title, "Dialyzer " ++ ?VSN ++ " @ " ++ Host},
- {configure, true},
- {default, listbox, {bg, white}},
- {default, editor, {bg, white}},
- {default, entry, {bg, white}},
- {default, button, {font, {helvetica, bold, 12}}},
- {default, label, {font, {helvetica, bold, 12}}}
- |WH]),
- Packer = gs:frame(TopWin, [{packer_x, [{stretch, 3},{fixed, 200},
- {stretch, 7}]},
- {packer_y, [{fixed, 25}, {fixed, 20},
- {stretch, 1, 50},
- {fixed, 25}, {fixed, 20},
- {stretch, 1, 50},
- {fixed, 25}]}]),
-
- %% --------- Chosen box --------------
- gs:label(Packer, [{label, {text, "Directories or modules to analyze"}},
- {height, 20}, {pack_xy, {1, 2}}]),
- ChosenBox = gs:listbox(Packer, [{pack_xy, {1, 3}}, {vscroll, right},
- {selectmode, multiple}]),
-
- %% --------- File box --------------
- gs:label(Packer, [{label, {text, "File"}}, {height, 20}, {pack_xy, {1,5}}]),
- FilePacker = gs:frame(Packer, [{packer_x, [{fixed, 30}, {stretch, 1, 100}]},
- {packer_y, [{fixed, 25}, {stretch, 1, 25}]},
- {pack_xy, {1, 6}}]),
- gs:label(FilePacker, [{label, {text, "Dir:"}}, {pack_xy, {1, 1}}]),
- DirEntry = gs:entry(FilePacker, [{height, 30}, {pack_xy, {2, 1}},
- {keypress, true}]),
- File = gs:listbox(FilePacker, [{pack_x, {1,2}}, {pack_y, 2},
- {selectmode, multiple}, {doubleclick, true},
- {vscroll, right}]),
-
- %% --------- Options --------------
- gs:label(Packer, [{label, {text, "Analysis Options"}},
- {height, 20}, {pack_xy, {2, 2}}]),
- ModePacker = gs:frame(Packer, [{packer_x, [{fixed, 75}, {fixed, 120}]},
- {packer_y, [{fixed, 20}, {fixed, 20},
- {fixed, 20},
- %% EmptySpace,
- {fixed, 20}, {fixed, 20},
- {fixed, 20}, EmptySpace]},
- {bw, 10}, {relief, flat},
- {default, {radiobutton, {align, w}}},
- {default, {label, {align, w}}},
- {pack_xy, {2, 3}}]),
-
- %% Bytecode vs. Source code
- gs:label(ModePacker, [{label, {text, "File Type:"}},
- {height, 20}, {pack_xy, {1,1}}]),
- {ByteSel, SrcSel} = case From of
- byte_code -> {[{select, true}], []};
- src_code -> {[], [{select, true}]}
- end,
- ModeByteCode = gs:radiobutton(ModePacker,
- ByteSel ++ [{group, start_from},
- {label, {text,"BeamFiles"}},
- {pack_xy, {2,1}}]),
- ModeSrcCode = gs:radiobutton(ModePacker,
- SrcSel ++ [{group, start_from},
- {label, {text,"SourceFiles"}},
- {pack_xy, {2,2}}]),
- Mode = #mode{start_byte_code = ModeByteCode,
- start_src_code = ModeSrcCode},
-
- %% --------- Log box --------------
- gs:label(Packer, [{label, {text, "Log"}}, {height, 20}, {pack_xy, {3,2}}]),
- Log = gs:editor(Packer, [{pack_x, 3}, {pack_y, 3}, {enable, false},
- {font, {courier, 12}}, {vscroll, right},
- {wrap, word}]),
-
- %% --------- Warnings box --------------
- gs:label(Packer, [{label, {text, "Warnings"}},{height, 20},{pack_xy, {3,5}}]),
- WarningsBox = gs:editor(Packer, [{pack_x, {2,3}}, {pack_y, 6},
- {enable, false},
- {font, {courier, 12}}, {vscroll, right},
- {wrap, word}]),
-
- %% --------- Buttons --------------
- ButtonPackerHighLeft =
- gs:frame(Packer, [{packer_x, [{fixed, 50}, {fixed, 65}, EmptySpace]},
- {pack_xy, {1,4}}]),
- ButtonPackerHighRight =
- gs:frame(Packer, [{packer_x, [{fixed, 70}, {fixed, 70}, EmptySpace]},
- {pack_xy, {3,4}}]),
- ButtonPackerLowLeft =
- gs:frame(Packer, [{packer_x, [{fixed, 50},
- {fixed, 60},
- {fixed, 110},
- EmptySpace]},
- {pack_xy, {1,7}}]),
- ButtonPackerLowRight =
- gs:frame(Packer, [{packer_x, [{fixed, 100},
- {fixed, 70},
- EmptySpace,
- {fixed, 70},
- {fixed, 70}]},
- {pack_x, {2,3}}, {pack_y, 7}]),
-
- WHButton = [{width, 60}, {height, 20}],
- AddFile = gs:button(ButtonPackerLowLeft, [{pack_xy, {1, 1}},
- {label, {text,"Add"}}|WHButton]),
- AddAll = gs:button(ButtonPackerLowLeft, [{pack_xy, {2, 1}},
- {label, {text,"Add All"}}|WHButton]),
- AddRec = gs:button(ButtonPackerLowLeft, [{pack_xy, {3, 1}},
- {label, {text,"Add Recursively"}}
- |WHButton]),
- DelFile = gs:button(ButtonPackerHighLeft, [{pack_xy, {1, 1}},
- {label, {text,"Delete"}}|WHButton]),
- ClearChosen = gs:button(ButtonPackerHighLeft, [{pack_xy, {2, 1}},
- {label, {text,"Delete All"}}
- |WHButton]),
- ClearLog = gs:button(ButtonPackerHighRight, [{pack_xy, {1, 1}},
- {label, {text,"Clear Log"}}
- |WHButton]),
- ClearWarn = gs:button(ButtonPackerLowRight, [{pack_xy, {1, 1}},
- {label, {text,"Clear Warnings"}}
- |WHButton]),
-
- Run = gs:button(ButtonPackerLowRight, [{pack_xy, {4, 1}},
- {label, {text,"Run"}}|WHButton]),
- Stop = gs:button(ButtonPackerLowRight, [{pack_xy, {5, 1}}, {enable, false},
- {label, {text,"Stop"}}|WHButton]),
-
- %% --------- Menu --------------
- MenuBar = gs:menubar(TopWin, []),
-
- %% File Menu
- MenuBarFile = gs:menubutton(MenuBar, [{label, {text, "File"}}]),
- MenuFile = gs:menu(MenuBarFile, []),
- MenuFileSaveWarn = gs:menuitem(MenuFile, [{label, {text, "Save Warnings"}}]),
- MenuFileSaveLog = gs:menuitem(MenuFile, [{label, {text, "Save Log"}}]),
- MenuFileQuit = gs:menuitem(MenuFile, [{label, {text, "Quit"}}]),
-
- %% Warnings Menu
- MenuBarWarn = gs:menubutton(MenuBar, [{label, {text, "Warnings"}}]),
- MenuWarn = gs:menu(MenuBarWarn, []),
- MenuWarnMatch = gs:menuitem(MenuWarn, [{label, {text, "Match failures"}},
- {itemtype, check}, {select, true}]),
- MenuWarnFailingCall = gs:menuitem(MenuWarn,
- [{label, {text, "Failing function calls"}},
- {itemtype, check}, {select, true}]),
- MenuWarnFunApp = gs:menuitem(MenuWarn, [{label,
- {text, "Bad fun applications"}},
- {itemtype, check}, {select, true}]),
- MenuWarnOpaque = gs:menuitem(MenuWarn, [{label,
- {text, "Opaqueness violations"}},
- {itemtype, check}, {select, true}]),
- MenuWarnLists = gs:menuitem(MenuWarn,
- [{label, {text, "Improper list constructions"}},
- {itemtype, check}, {select, true}]),
- MenuWarnNotCalled = gs:menuitem(MenuWarn,
- [{label, {text, "Unused functions"}},
- {itemtype, check}, {select, true}]),
- MenuWarnReturnOnlyExit = gs:menuitem(MenuWarn,
- [{label,
- {text, "Error handling functions"}},
- {itemtype, check}, {select, false}]),
- MenuWarnReturnNoReturn = gs:menuitem(MenuWarn,
- [{label,
- {text, "Functions of no return"}},
- {itemtype, check}, {select, true}]),
- MenuWarnCallNonExported = gs:menuitem(MenuWarn,
- [{label,
- {text, "Call to unexported function"}},
- {itemtype, check}, {select, true}]),
- MenuWarnRaceCondition = gs:menuitem(MenuWarn,
- [{label,
- {text,"Possible race conditions"}},
- {itemtype, check}, {select, false}]),
- MenuWarnContractTypes = gs:menuitem(MenuWarn,
- [{label, {text, "Wrong contracts"}},
- {itemtype, check}, {select, true}]),
- MenuWarnContractSyntax = gs:menuitem(MenuWarn,
- [{label,
- {text, "Wrong contract syntax"}},
- {itemtype, check}, {select, true}]),
-
- %% PLT Menu
- MenuBarPLT = gs:menubutton(MenuBar, [{label, {text,"PLT"}}]),
- MenuPLT = gs:menu(MenuBarPLT, []),
- MenuPLTEmpty = gs:menuitem(MenuPLT, [{label, {text, "Init with empty PLT"}},
- {itemtype, check}, {select, false}]),
- MenuPLTShow = gs:menuitem(MenuPLT, [{label, {text, "Show contents"}}]),
- MenuPLTSearch = gs:menuitem(MenuPLT, [{label, {text, "Search contents"}}]),
-
- %% Options Menu
- MenuBarOpts = gs:menubutton(MenuBar, [{label,{text,"Options"}}]),
- MenuOpts = gs:menu(MenuBarOpts, []),
- MenuOptsMacros = gs:menuitem(MenuOpts,
- [{label, {text, "Manage Macro Definitions"}}]),
- MenuOptsIncludes = gs:menuitem(MenuOpts,
- [{label, {text, "Manage Include Directories"}}]),
-
- %% Help
- MenuBarHelp = gs:menubutton(MenuBar, [{label, {text, "Help"}}, {side, right}]),
- MenuHelp = gs:menu(MenuBarHelp, []),
- MenuHelpManual = gs:menuitem(MenuHelp, [{label, {text, "Manual"}}]),
- MenuHelpWarnings = gs:menuitem(MenuHelp, [{label, {text, "Warning Options"}}]),
- MenuHelpAbout = gs:menuitem(MenuHelp, [{label, {text, "About"}}]),
-
- Warnings = [{?WARN_RETURN_NO_RETURN, MenuWarnReturnNoReturn},
- {?WARN_RETURN_ONLY_EXIT, MenuWarnReturnOnlyExit},
- {?WARN_NOT_CALLED, MenuWarnNotCalled},
- {?WARN_NON_PROPER_LIST, MenuWarnLists},
- {?WARN_FUN_APP, MenuWarnFunApp},
- {?WARN_MATCHING, MenuWarnMatch},
- {?WARN_OPAQUE, MenuWarnOpaque},
- {?WARN_FAILING_CALL, MenuWarnFailingCall},
- {?WARN_CALLGRAPH, MenuWarnCallNonExported},
- {?WARN_RACE_CONDITION, MenuWarnRaceCondition},
- %% For contracts.
- {?WARN_CONTRACT_TYPES, MenuWarnContractTypes},
- {?WARN_CONTRACT_SYNTAX, MenuWarnContractSyntax}
- ],
-
- init_warnings(Warnings, LegalWarnings),
-
- Menu = #menu{file_quit = MenuFileQuit,
- plt_empty = MenuPLTEmpty,
- help_manual = MenuHelpManual,
- help_about = MenuHelpAbout,
- help_warnings = MenuHelpWarnings,
- opts_macros = MenuOptsMacros,
- opts_includes = MenuOptsIncludes,
- plt_search_doc = MenuPLTSearch,
- plt_show_doc = MenuPLTShow,
- file_save_log = MenuFileSaveLog,
- file_save_warn = MenuFileSaveWarn,
- warnings = Warnings},
-
- %% --------- Init --------------
- gs:config(TopWin, [{map, true}]),
- gs:config(Packer, WH),
- {ok, CWD} = file:get_cwd(),
-
- InitPlt =
- case InitPltFiles of
- [] -> dialyzer_plt:new();
- _ ->
- Plts = [dialyzer_plt:from_file(F) || F <- InitPltFiles],
- dialyzer_plt:merge_plts_or_report_conflicts(InitPltFiles, Plts)
- end,
-
- State = #gui_state{add_all = AddAll,
- add_file = AddFile,
- add_rec = AddRec,
- chosen_box = ChosenBox,
- clear_chosen = ClearChosen,
- clear_log = ClearLog,
- clear_warn = ClearWarn,
- del_file = DelFile,
- doc_plt = dialyzer_plt:new(),
- dir_entry = DirEntry,
- file_box = File,
- file_wd = CWD,
- gs = GS,
- init_plt = InitPlt,
- log = Log,
- menu = Menu,
- mode = Mode,
- options = DialyzerOptions,
- packer = Packer,
- run = Run,
- stop = Stop,
- top = TopWin,
- warnings_box = WarningsBox},
- NewState = change_dir_or_add_file(State, "."),
- gui_loop(NewState).
-
-%% ----------------------------------------------------------------
-%%
-%% Main GUI Loop
-%%
-
--spec gui_loop(#gui_state{}) -> ?RET_NOTHING_SUSPICIOUS.
-
-gui_loop(#gui_state{add_all = AddAll, add_file = AddFile, add_rec = AddRec,
- backend_pid = BackendPid, chosen_box = ChosenBox,
- clear_chosen = ClearChosen, clear_log = ClearLog,
- clear_warn = ClearWarn, del_file = DelFile,
- dir_entry = DirEntry, file_box = File, log = Log,
- menu = Menu, packer = Packer, run = Run, stop = Stop,
- top = TopWin, warnings_box = Warn} = State) ->
- %% --- Menu ---
- Quit = Menu#menu.file_quit,
- Manual = Menu#menu.help_manual,
- Warnings = Menu#menu.help_warnings,
- About = Menu#menu.help_about,
- SaveLog = Menu#menu.file_save_log,
- SaveWarn = Menu#menu.file_save_warn,
- SearchPlt = Menu#menu.plt_search_doc,
- ShowPlt = Menu#menu.plt_show_doc,
- Macros = Menu#menu.opts_macros,
- Includes = Menu#menu.opts_includes,
-
- receive
- {gs, TopWin, configure, _Data, [W, H|_]} ->
- gs:config(Packer, [{width, W}, {height, H}]),
- gui_loop(State);
- {gs, TopWin, destroy, _Data, _Args} ->
- ?RET_NOTHING_SUSPICIOUS;
- {gs, File, doubleclick, _, [_Id, Text|_]} ->
- NewState = change_dir_or_add_file(State, Text),
- gui_loop(NewState);
- {gs, DirEntry, keypress, _, ['Return'|_]} ->
- gs:config(TopWin, [{setfocus, true}]),
- NewState = change_dir_absolute(State, gs:read(DirEntry, text)),
- gui_loop(NewState);
- {gs, DirEntry, keypress, _, _} ->
- gui_loop(State);
- %% ----- Buttons -----
- {gs, AddFile, click, _, _} ->
- handle_add_files(State),
- gui_loop(State);
- {gs, AddAll, click, _, _} ->
- handle_add_all_click(State),
- gui_loop(State);
- {gs, AddRec, click, _, _} ->
- handle_add_rec_click(State),
- gui_loop(State);
- {gs, DelFile, click, _, _} ->
- handle_file_delete(State),
- gui_loop(State);
- {gs, ClearChosen, click, _, _} ->
- gs:config(ChosenBox, [clear]),
- gui_loop(State);
- {gs, ClearLog, click, _, _} ->
- Log = State#gui_state.log,
- gs:config(Log, [{enable, true}]),
- gs:config(Log, [clear]),
- gs:config(Log, [{enable, false}]),
- gui_loop(State);
- {gs, ClearWarn, click, _, _} ->
- Warn = State#gui_state.warnings_box,
- gs:config(Warn, [{enable, true}]),
- gs:config(Warn, [clear]),
- gs:config(Warn, [{enable, false}]),
- gui_loop(State);
- {gs, Run, click, _, _} ->
- NewState = start_analysis(State),
- gui_loop(NewState);
- {gs, Stop, click, _, _} ->
- config_gui_stop(State),
- BackendPid ! {self(), stop},
- update_editor(Log, "\n***** Analysis stopped ****\n"),
- gui_loop(State);
- %% ----- Menu -----
- {gs, Quit, click, _, _} ->
- case maybe_quit(State) of
- true -> ?RET_NOTHING_SUSPICIOUS;
- false -> gui_loop(State)
- end;
- {gs, Manual, click, _, _} ->
- spawn_link(fun() -> manual(State) end),
- gui_loop(State);
- {gs, Warnings, click, _, _} ->
- spawn_link(fun() -> warnings(State) end),
- gui_loop(State);
- {gs, About, click, _, _} ->
- spawn_link(fun() -> about(State) end),
- gui_loop(State);
- {gs, SaveLog, click, _, _} ->
- save_log(State),
- gui_loop(State);
- {gs, SaveWarn, click, _, _} ->
- save_warn(State),
- gui_loop(State);
- {gs, SearchPlt, click, _, _} ->
- spawn_link(fun() -> search_doc_plt(State) end),
- gui_loop(State);
- {gs, ShowPlt, click, _, _} ->
- spawn_link(fun() -> show_doc_plt(State) end),
- gui_loop(State);
- {gs, Macros, click, _, _} ->
- Self = self(),
- spawn_link(fun() -> macro_dialog(State, Self) end),
- gui_loop(State);
- {gs, Includes, click, _, _} ->
- Self = self(),
- spawn_link(fun() -> include_dialog(State, Self) end),
- gui_loop(State);
- {new_options, NewOptions} ->
- NewState = State#gui_state{options = NewOptions},
- gui_loop(NewState);
- %% ----- Analysis -----
- {BackendPid, ext_calls, ExtCalls} ->
- Msg = io_lib:format("The following functions are called "
- "but type information about them is not available.\n"
- "The analysis might get more precise by including "
- "the modules containing these functions:\n\n\t~p\n",
- [ExtCalls]),
- free_editor(State, "Analysis done", Msg),
- gui_loop(State);
- {BackendPid, ext_types, ExtTypes} ->
- Map = fun({M,F,A}) -> io_lib:format("~p:~p/~p",[M,F,A]) end,
- ExtTypeString = string:join(lists:map(Map, ExtTypes), "\n"),
- Msg = io_lib:format("The following remote types are being used "
- "but information about them is not available.\n"
- "The analysis might get more precise by including "
- "the modules containing these types and making sure "
- "that they are exported:\n~s\n", [ExtTypeString]),
- free_editor(State, "Analysis done", Msg),
- gui_loop(State);
- {BackendPid, log, LogMsg} ->
- update_editor(Log, LogMsg),
- gui_loop(State);
- {BackendPid, warnings, Warns} ->
- SortedWarns = lists:keysort(2, Warns), %% Sort on file/line
- WarnList = [dialyzer:format_warning(W) || W <- SortedWarns],
- update_editor(Warn, lists:flatten(WarnList)),
- gui_loop(State);
- {BackendPid, done, _NewPlt, NewDocPlt} ->
- message(State, "Analysis done"),
- config_gui_stop(State),
- gui_loop(State#gui_state{doc_plt = NewDocPlt});
- {'EXIT', BackendPid, {error, Reason}} ->
- free_editor(State, ?DIALYZER_ERROR_TITLE, Reason),
- config_gui_stop(State),
- gui_loop(State);
- {'EXIT', BackendPid, Reason} when Reason =/= 'normal' ->
- free_editor(State, ?DIALYZER_ERROR_TITLE, io_lib:format("~p", [Reason])),
- config_gui_stop(State),
- gui_loop(State);
- _Other ->
- %% io:format("Received ~p\n", [Other]),
- gui_loop(State)
- end.
-
-%% ----------------------------------------------------------------
-%%
-%% Main window actions
-%%
-
-%% ---- Adding and deleting files ----
-
-handle_add_all_click(#gui_state{chosen_box = ChosenBox, file_box = File,
- file_wd = FWD, mode = Mode}) ->
- case gs:read(File, items) of
- [] ->
- ok;
- Add0 ->
- gs:config(File, [{selection, clear}]),
- Add1 = ordsets:subtract(Add0, [".."]),
- Add = ordsets:from_list([filename:join(FWD, X) || X <- Add1]),
- case gs:read(Mode#mode.start_byte_code, select) of
- true ->
- add_files(filter_mods(Add, ".beam"), ChosenBox, byte_code);
- false ->
- add_files(filter_mods(Add, ".erl"), ChosenBox, src_code)
- end
- end.
-
-all_subdirs(Dirs) ->
- all_subdirs(Dirs, []).
-
-all_subdirs([Dir|T], Acc) ->
- {ok, Files} = file:list_dir(Dir),
- SubDirs = lists:zf(fun(F) ->
- SubDir = filename:join(Dir, F),
- case filelib:is_dir(SubDir) of
- true -> {true, SubDir};
- false -> false
- end
- end, Files),
- NewAcc = ordsets:union(ordsets:from_list(SubDirs), Acc),
- all_subdirs(T ++ SubDirs, NewAcc);
-all_subdirs([], Acc) ->
- Acc.
-
-handle_add_rec_click(#gui_state{chosen_box = ChosenBox, file_box = File,
- file_wd = FWD, mode = Mode}) ->
- case gs:read(File, selection) of
- [] ->
- ok;
- List ->
- gs:config(File, [{selection, clear}]),
- Dirs1 = [gs:read(File, {get, X}) || X <- List],
- Dirs2 = ordsets:from_list([filename:join(FWD, X) || X <- Dirs1]),
- Dirs3 = ordsets:filter(fun(X) -> filelib:is_dir(X) end, Dirs2),
- TargetDirs = ordsets:union(Dirs3, all_subdirs(Dirs3)),
- {Code, Ext} = case gs:read(Mode#mode.start_byte_code, select) of
- true -> {byte_code, ".beam"};
- false -> {src_code, ".erl"}
- end,
- add_files(filter_mods(TargetDirs, Ext), ChosenBox, Code)
- end.
-
-handle_add_files(#gui_state{chosen_box = ChosenBox, file_box = File,
- file_wd = FWD, mode = Mode}) ->
- case gs:read(File, selection) of
- [] ->
- ok;
- List ->
- gs:config(File, [{selection, clear}]),
- Add0 = [gs:read(File, {get, X}) || X <- List],
- Add = ordsets:from_list([filename:join(FWD, X) || X <- Add0]),
- case gs:read(Mode#mode.start_byte_code, select) of
- true ->
- add_files(filter_mods(Add, ".beam"), ChosenBox, byte_code);
- false ->
- add_files(filter_mods(Add, ".erl"), ChosenBox, src_code)
- end
- end.
-
-filter_mods(Mods, Extension) ->
- Fun = fun(X) ->
- filename:extension(X) =:= Extension
- orelse
- (filelib:is_dir(X) andalso
- contains_files(X, Extension))
- end,
- ordsets:filter(Fun, Mods).
-
-contains_files(Dir, Extension) ->
- {ok, Files} = file:list_dir(Dir),
- lists:any(fun(X) -> filename:extension(X) =:= Extension end, Files).
-
-add_files(Add, ChosenBox, Type) ->
- Set = gs:read(ChosenBox, items),
- Set1 =
- case Type of
- byte_code -> filter_mods(Set, ".beam");
- src_code -> filter_mods(Set, ".erl")
- end,
- Files = ordsets:union(Add, Set1),
- gs:config(ChosenBox, [{items, Files}]),
- ok.
-
-handle_file_delete(#gui_state{chosen_box = ChosenBox}) ->
- List = gs:read(ChosenBox, selection),
- lists:foreach(fun(X) -> gs:config(ChosenBox, [{del, X}]) end,
- lists:reverse(lists:sort(List))).
-
-%% ---- Other ----
-
-change_dir_or_add_file(#gui_state{file_wd = FWD, mode = Mode, dir_entry = Dir,
- chosen_box = CBox, file_box = File} = State,
- Text) ->
- NewWDorFile =
- case Text of
- ".." -> filename:join(butlast(filename:split(FWD)));
- "." -> FWD;
- _ -> filename:join(FWD, Text)
- end,
- case filelib:is_dir(NewWDorFile) of
- true ->
- gs:config(Dir, [{text, NewWDorFile}]),
- {ok, List} = file:list_dir(NewWDorFile),
- gs:config(File, [{items, [".."|lists:sort(List)]}]),
- State#gui_state{file_wd = NewWDorFile};
- false ->
- case gs:read(Mode#mode.start_byte_code, select) of
- true ->
- case filter_mods([NewWDorFile], ".beam") of
- [] -> ok;
- RealFiles -> add_files(RealFiles, CBox, byte_code)
- end;
- false ->
- case filter_mods([NewWDorFile], ".erl") of
- [] -> ok;
- RealFiles -> add_files(RealFiles, CBox, src_code)
- end
- end,
- State
- end.
-
-butlast([H1, H2 | T]) ->
- [H1 | butlast([H2|T])];
-butlast([_]) ->
- [];
-butlast([]) ->
- ["/"].
-
-change_dir_absolute(#gui_state{file_wd = FWD, dir_entry = Dir,
- file_box = File} = State,
- Text) ->
- case filelib:is_dir(Text) of
- true ->
- WD = filename:join(FWD, Text),
- gs:config(Dir, [{text, WD}]),
- {ok, List} = file:list_dir(WD),
- gs:config(File, [{items, [".."|lists:sort(List)]}]),
- State#gui_state{file_wd = WD};
- false ->
- State
- end.
-
-init_warnings([{Tag, GSItem}|Left], LegalWarnings) ->
- Select = ordsets:is_element(Tag, LegalWarnings),
- gs:config(GSItem, [{select, Select}]),
- init_warnings(Left, LegalWarnings);
-init_warnings([], _LegalWarnings) ->
- ok.
-
-config_gui_start(State) ->
- Enabled = [{enable, true}],
- Disabled = [{enable, false}],
- gs:config(State#gui_state.stop, Enabled),
- gs:config(State#gui_state.run, Disabled),
- gs:config(State#gui_state.del_file, Disabled),
- gs:config(State#gui_state.clear_chosen, Disabled),
- gs:config(State#gui_state.add_file, Disabled),
- gs:config(State#gui_state.add_all, Disabled),
- gs:config(State#gui_state.add_rec, Disabled),
- gs:config(State#gui_state.clear_warn, Disabled),
- gs:config(State#gui_state.clear_log, Disabled),
- Menu = State#gui_state.menu,
- gs:config(Menu#menu.file_save_warn, Disabled),
- gs:config(Menu#menu.file_save_log, Disabled),
- gs:config(Menu#menu.opts_macros, Disabled),
- gs:config(Menu#menu.opts_includes, Disabled),
- gs:config(Menu#menu.plt_empty, Disabled),
- gs:config(Menu#menu.plt_search_doc, Disabled),
- gs:config(Menu#menu.plt_show_doc, Disabled),
- Mode = State#gui_state.mode,
- gs:config(Mode#mode.start_byte_code, Disabled),
- gs:config(Mode#mode.start_src_code, Disabled).
-
-config_gui_stop(State) ->
- Enabled = [{enable, true}],
- Disabled = [{enable, false}],
- gs:config(State#gui_state.stop, Disabled),
- gs:config(State#gui_state.run, Enabled),
- gs:config(State#gui_state.del_file, Enabled),
- gs:config(State#gui_state.clear_chosen, Enabled),
- gs:config(State#gui_state.add_file, Enabled),
- gs:config(State#gui_state.add_all, Enabled),
- gs:config(State#gui_state.add_rec, Enabled),
- gs:config(State#gui_state.clear_warn, Enabled),
- gs:config(State#gui_state.clear_log, Enabled),
- Menu = State#gui_state.menu,
- gs:config(Menu#menu.file_save_warn, Enabled),
- gs:config(Menu#menu.file_save_log, Enabled),
- gs:config(Menu#menu.opts_macros, Enabled),
- gs:config(Menu#menu.opts_includes, Enabled),
- gs:config(Menu#menu.plt_empty, Enabled),
- gs:config(Menu#menu.plt_search_doc, Enabled),
- gs:config(Menu#menu.plt_show_doc, Enabled),
- Mode = State#gui_state.mode,
- gs:config(Mode#mode.start_byte_code, Enabled),
- gs:config(Mode#mode.start_src_code, Enabled).
-
-%% ----------------------------------------------------------------
-%%
-%% Messages
-%%
-
-message(State, Message) ->
- output_sms(State, ?DIALYZER_MESSAGE_TITLE, Message).
-
-error_sms(State, Message) ->
- output_sms(State, ?DIALYZER_ERROR_TITLE, Message).
-
-%%
-%% This function is to be used *only* for small messages because lines
-%% are not wrapped and the created window has a limited area for text.
-%% For bigger messages, the function free_editor/3 is to be used.
-%%
-output_sms(#gui_state{gs = GS, top = TopWin}, Title, Message) ->
- %% Lines = string:words(Message, $\n),
- %% io:format("The message has ~w lines\n", [Lines]),
- WH = [{width, 400}, {height, 100}],
- MessageWin = gs:window(GS, [{title, Title},
- {default, button, {font, {helvetica, bold, 12}}}
- |WH]),
- MessagePacker = gs:frame(MessageWin, [{packer_y, [{fixed, 75}, {fixed, 25}]},
- {packer_x, [{fixed, 175},{fixed, 50},
- {fixed, 175}]}]),
- gs:label(MessagePacker, [{pack_x, {1, 3}}, {pack_y, 1},
- {label, {text, Message}}]),
- OK = gs:button(MessagePacker, [{label, {text, "OK"}}, {pack_xy, {2, 2}}]),
- gs:config(MessageWin, [{map, true}]),
- gs:config(MessagePacker, WH),
- message_loop(OK, MessageWin, TopWin).
-
-message_loop(Ok, Win, TopWin) ->
- receive
- {gs, Ok, click, _, _} ->
- gs:destroy(Win);
- {gs, Win, destroy, _, _} ->
- ok;
- {gs, TopWin, destroy, _, _} ->
- exit(normal);
- {gs, _, _, _, _} ->
- message_loop(Ok, Win, TopWin)
- end.
-
-dialog(#gui_state{gs = GS, top = TopWin}, Message, OkLabel, CancelLabel) ->
- WH = [{width, 400}, {height, 100}],
- WHButton = [{width, 70}, {height, 20}],
- DialogWin = gs:window(GS, [{title, "Dialyzer Message"},
- {default, button, {font, {helvetica, bold, 12}}}
- |WH]),
- DialogPacker = gs:frame(DialogWin, [{packer_y, [{fixed, 75}, {fixed, 25}]},
- {packer_x, [{fixed, 150}, {fixed, 50},
- {fixed, 50}, {fixed, 150}]}]),
- gs:label(DialogPacker, [{pack_x, {1,4}}, {pack_y, 1},
- {label, {text, Message}}]),
- Ok = gs:button(DialogPacker, [{label, {text, OkLabel}},
- {pack_xy, {2,2}}|WHButton]),
- Cancel = gs:button(DialogPacker, [{label, {text, CancelLabel}},
- {pack_xy, {3,2}}|WHButton]),
- gs:config(DialogWin, [{map, true}]),
- gs:config(DialogPacker, WH),
- dialog_loop(Ok, Cancel, DialogWin, TopWin).
-
-dialog_loop(Ok, Cancel, Win, TopWin) ->
- receive
- {gs, Ok, click, _, _} ->
- gs:destroy(Win),
- true;
- {gs, Cancel, click, _, _} ->
- gs:destroy(Win),
- false;
- {gs, Win, destroy, _, _} ->
- false;
- {gs, TopWin, destroy, _, _} ->
- exit(normal);
- {gs, _, _, _, _} ->
- dialog_loop(Ok, Cancel, Win, TopWin)
- end.
-
-maybe_quit(#gui_state{top = TopWin} = State) ->
- case dialog(State, "Do you really want to quit?", "Yes", "No") of
- true ->
- flush(),
- gs:destroy(TopWin),
- gs:stop(),
- true;
- false ->
- false
- end.
-
-
-%% ----------------------------------------------------------------
-%%
-%% Menu actions
-%%
-
-%% ---- Help Menu ----
-
-manual(State) ->
- help_menu_common(State, "Dialyzer Manual", 500, "manual.txt", white).
-
-warnings(State) ->
- help_menu_common(State, "Dialyzer Warnings", 500, "warnings.txt", white).
-
-about(State) ->
- help_menu_common(State, "About Dialyzer", 160, "about.txt", yellow).
-
-help_menu_common(#gui_state{gs = GS, top = TopWin} = State,
- Title, Height, TxtFileName, BackGroundColor) ->
- WH = [{width, 600}, {height, Height}],
- Win = gs:window(GS, [{title, Title}, {configure, true},
- {default, editor, {bg, BackGroundColor}} | WH]),
- EmptySpace = {stretch, 1},
- Frame = gs:frame(Win, [{packer_x, [EmptySpace, {fixed, 60}, EmptySpace]},
- {packer_y, [EmptySpace, {fixed, 30}]} | WH]),
- Editor = gs:editor(Frame, [{pack_x, {1, 3}}, {pack_y, 1},
- {font, {courier, 12}}, {vscroll, right},
- {wrap, word}]),
- Button = gs:button(Frame, [{label, {text, "Ok"}}, {pack_xy, {2, 2}}]),
- gs:config(Win, [{map, true}]),
- gs:config(Frame, WH),
- AboutFile = filename:join([code:lib_dir(dialyzer), "doc", TxtFileName]),
- case gs:config(Editor, {load, AboutFile}) of
- {error, Reason} ->
- gs:destroy(Win),
- error_sms(State,
- io_lib:format("Could not find doc/~s file!\n\n ~p",
- [TxtFileName, Reason]));
- ok ->
- gs:config(Editor, [{enable, false}]),
- show_info_loop(TopWin, Win, Frame, Button)
- end.
-
-%% ---- File Menu ----
-
-save_log(#gui_state{file_wd = CWD, log = Log} = State) ->
- {Win, Entry, OkButton, CancelButton} = file_box(State, "Save Log", CWD),
- save_loop(State, OkButton, CancelButton, Entry, Win, Log).
-
-save_warn(#gui_state{file_wd = CWD, warnings_box = WBox} = State) ->
- {Win, Entry, OkButton, CancelButton} = file_box(State, "Save Warnings", CWD),
- save_loop(State, OkButton, CancelButton, Entry, Win, WBox).
-
-file_box(#gui_state{gs = GS}, Title, Default) ->
- WH = [{width, 400}, {height, 75}],
- Win = gs:window(GS, [{title, Title}|WH]),
- Fix25 = {fixed, 27}, Fix75 = {fixed, 75},
- WinPacker = gs:frame(Win, [{packer_y, [Fix25, Fix25, Fix25]},
- {packer_x, [Fix75, Fix75, Fix75, {fixed, 175}]}]),
- gs:label(WinPacker, [{pack_xy, {1,2}}, {label, {text, "Enter file:"}}]),
- Entry = gs:entry(WinPacker, [{pack_x, {2,4}}, {pack_y, 2}, {keypress, true}]),
- OkButton = gs:button(WinPacker, [{label, {text, "Ok"}}, {pack_xy, {2,3}}]),
- CancelButton = gs:button(WinPacker, [{label, {text, "Cancel"}},
- {pack_xy, {3,3}}]),
- gs:config(Entry, [{text, Default}]),
- gs:config(Win, [{map, true}]),
- gs:config(WinPacker, WH),
- {Win, Entry, OkButton, CancelButton}.
-
-save_loop(#gui_state{top = TopWin} = State,
- OkButton, CancelButton, Entry, Save, Editor) ->
- receive
- {gs, OkButton, click, _, _} ->
- File = gs:read(Entry, text),
- case gs:config(Editor, [{save, File}]) of
- {error, _} ->
- error_sms(State, "Could not write to file:\n" ++ File),
- save_loop(State, OkButton, CancelButton, Entry, Save, Editor);
- _ ->
- gs:destroy(Save)
- end;
- {gs, Entry, keypress, _, ['Return'|_]} ->
- File = gs:read(Entry, text),
- case gs:config(Editor, [{save, File}]) of
- {error, _} ->
- error_sms(State, "Could not write to file:\n" ++ File),
- save_loop(State, OkButton, CancelButton, Entry, Save, Editor);
- _ ->
- gs:destroy(Save)
- end;
- {gs, Entry, keypress, _, _} ->
- save_loop(State, OkButton, CancelButton, Entry, Save, Editor);
- {gs, CancelButton, click, _, _} ->
- gs:destroy(Save);
- {gs, TopWin, destroy, _, _} ->
- exit(normal);
- {gs, Save, destroy, _, _} ->
- ok;
- {gs, _, _, _, _} ->
- save_loop(State, OkButton, CancelButton, Entry, Save, Editor)
- end.
-
-%% ---- Plt Menu ----
-
-search_doc_plt(#gui_state{gs = GS, top = TopWin} = State) ->
- WH = [{width, 400}, {height, 100}],
- WHB = [{width, 120}, {height, 30}],
- Title = io_lib:format("Search the PLT", []),
- Win = gs:window(GS, [{title, Title}, {configure, true},
- {default, editor, {bg, white}} | WH]),
- EmptySpace = {stretch, 1},
- Frame = gs:frame(Win, [{packer_x, [EmptySpace, EmptySpace, EmptySpace]},
- {packer_y, [{fixed, 30}, {fixed, 30},
- EmptySpace, {fixed, 30}]} | WH]),
- gs:label(Frame, [{pack_xy, {1,1}}, {label, {text, "Module"}}]),
- ModEntry = gs:entry(Frame, [{pack_xy, {1,2}}]),
- gs:label(Frame, [{pack_xy, {2,1}}, {label, {text, "Function"}}]),
- FunEntry = gs:entry(Frame, [{pack_xy, {2,2}}]),
- gs:label(Frame, [{pack_xy, {3,1}}, {label, {text, "Arity"}}]),
- ArityEntry = gs:entry(Frame, [{pack_xy, {3,2}}]),
- ButtonPacker = gs:frame(Frame, [{pack_xy, {2,4}},
- {packer_x, [{fixed, 60}, {fixed, 60}]},
- {packer_y, {fixed, 30}}]),
- SearchButton = gs:button(ButtonPacker, [{label, {text, "Search"}},
- {pack_xy, {1,1}}]),
- CancelButton = gs:button(ButtonPacker, [{label, {text, "Cancel"}},
- {pack_xy, {2,1}}]),
- gs:config(Win, [{map, true}]),
- gs:config(Frame, WH),
- gs:config(ButtonPacker, WHB),
- search_doc_plt_loop(State, CancelButton, SearchButton, ModEntry,
- FunEntry, ArityEntry, Win, TopWin).
-
-search_doc_plt_loop(State, CancelButton, SearchButton, ModEntry,
- FunEntry, ArityEntry, Win, TopWin) ->
- receive
- {gs, CancelButton, click, _, _} ->
- gs:destroy(Win),
- ok;
- {gs, TopWin, destroy, _, _} ->
- exit(normal);
- {gs, SearchButton, click, _, _} ->
- M = format_search(gs:read(ModEntry, text)),
- F = format_search(gs:read(FunEntry, text)),
- A = format_search(gs:read(ArityEntry, text)),
- case dialyzer_plt:get_specs(State#gui_state.doc_plt, M, F, A) of
- "" ->
- error_sms(State, "No such function"),
- search_doc_plt_loop(State, CancelButton, SearchButton, ModEntry,
- FunEntry, ArityEntry, Win, TopWin);
- NonEmptyString ->
- gs:destroy(Win),
- free_editor(State, "Content of PLT", NonEmptyString)
- end
- end.
-
-format_search([]) ->
- '_';
-format_search(String) ->
- try list_to_integer(String)
- catch error:_ -> list_to_atom(String)
- end.
-
-show_doc_plt(#gui_state{doc_plt = DocPLT} = State) ->
- case dialyzer_plt:get_specs(DocPLT) of
- "" -> error_sms(State, "No analysis has been made yet!\n");
- NonEmptyString -> free_editor(State, "Content of PLT", NonEmptyString)
- end.
-
-free_editor(#gui_state{gs = GS, top = TopWin}, Title, Contents0) ->
- Contents = lists:flatten(Contents0),
- Tokens = string:tokens(Contents, "\n"),
- NofLines = length(Tokens),
- LongestLine = lists:max([length(X) || X <- Tokens]),
- Height0 = NofLines * 25 + 80,
- Height = if Height0 > 500 -> 500; true -> Height0 end,
- Width0 = LongestLine * 7 + 60,
- Width = if Width0 > 800 -> 800; true -> Width0 end,
- WH = [{width, Width}, {height, Height}],
- Win = gs:window(GS, [{title, Title}, {configure, true},
- {default, editor, {bg, white}} | WH]),
- EmptySpace = {stretch, 1},
- Frame = gs:frame(Win, [{packer_x, [EmptySpace, {fixed, 60}, EmptySpace]},
- {packer_y, [EmptySpace, {fixed, 30}]}
- | WH]),
- Editor = gs:editor(Frame, [{pack_x, {1,3}}, {pack_y, 1},
- {font, {courier, 12}}, {vscroll, right},
- {wrap, word}, {enable, true}]),
- Button = gs:button(Frame, [{label, {text, "Ok"}}, {pack_xy, {2,2}}]),
- gs:config(Editor, [{insert, {insert, Contents}}]),
- gs:config(Editor, [{enable, false}]),
- gs:config(Win, [{map, true}]),
- gs:config(Frame, WH),
- show_info_loop(TopWin, Win, Frame, Button).
-
-%% ---- Common ----
-
-show_info_loop(TopWin, Win, Frame, Button) ->
- receive
- {gs, Button, click, _, _} ->
- gs:destroy(Win);
- {gs, TopWin, destroy, _, _} ->
- exit(normal);
- {gs, Win, destroy, _, _} ->
- ok;
- {gs, Win, configure, _Data, [W, H|_]} ->
- gs:config(Frame, [{width, W}, {height, H}]),
- show_info_loop(TopWin, Win, Frame, Button)
- end.
-
-include_dialog(#gui_state{gs = GS, options = Options}, Parent) ->
- WH = [{width, 300}, {height, 400}],
- Title = io_lib:format("Include Directories", []),
- Win = gs:window(GS, [{title, Title}, {configure, true},
- {default, entry, {bg, white}}| WH]),
- EmptySpace = {stretch, 1},
- Frame = gs:frame(Win, [{packer_x, [EmptySpace]},
- {packer_y, [{fixed, 30}, {fixed, 30}, {fixed, 30},
- EmptySpace, {fixed, 30}, {fixed, 30}]}
- | WH]),
- gs:label(Frame, [{pack_xy, {1,1}}, {label, {text, "Directory"}}]),
- DirEntry = gs:entry(Frame, [{pack_xy, {1,2}}]),
- ButtonPacker1 = gs:frame(Frame, [{pack_xy, {1,3}},
- {packer_x, [{fixed, 70}, {fixed, 70},
- EmptySpace]},
- {packer_y, {fixed, 30}}]),
- AddButton = gs:button(ButtonPacker1, [{label, {text, "Add"}},
- {pack_xy, {1,1}}]),
- Dirs = [io_lib:format("~s", [X]) || X <- Options#options.include_dirs],
- DirBox = gs:listbox(Frame, [{pack_xy, {1,4}}, {vscroll, right},
- {bg, white}, {configure, true},
- {selectmode, multiple}, {items, Dirs}]),
- ButtonPacker2 = gs:frame(Frame, [{pack_xy, {1,5}},
- {packer_x, [{fixed, 60}, {fixed, 70},
- EmptySpace]},
- {packer_y, {fixed, 30}}]),
- DeleteButton = gs:button(ButtonPacker2, [{label, {text, "Delete"}},
- {pack_xy, {1,1}}]),
- DeleteAllButton = gs:button(ButtonPacker2, [{label, {text, "Delete All"}},
- {pack_xy, {2,1}}]),
- ButtonPacker3 = gs:frame(Frame, [{pack_xy, {1,6}},
- {packer_x, [EmptySpace,
- {fixed, 60}, {fixed, 60}]},
- {packer_y, {fixed, 30}}]),
- OkButton = gs:button(ButtonPacker3, [{label, {text, "Ok"}},
- {pack_xy, {2,1}}]),
- CancelButton = gs:button(ButtonPacker3, [{label, {text, "Cancel"}},
- {pack_xy, {3,1}}]),
- gs:config(Win, [{map, true}]),
- gs:config(Frame, WH),
- include_loop(Parent, Options, Frame, AddButton, DeleteAllButton, DeleteButton,
- DirBox, DirEntry, OkButton, CancelButton, Win).
-
-include_loop(Parent, Options, Frame, AddButton, DeleteAllButton, DeleteButton,
- DirBox, DirEntry, OkButton, CancelButton, Win) ->
- receive
- {gs, CancelButton, click, _, _} ->
- gs:destroy(Win),
- ok;
- {gs, OkButton, click, _, _} ->
- gs:destroy(Win),
- Parent ! {new_options, Options},
- ok;
- {gs, Win, configure, _Data, [W, H|_]} ->
- gs:config(Frame, [{width, W}, {height, H}]),
- include_loop(Parent, Options, Frame, AddButton, DeleteAllButton,
- DeleteButton, DirBox, DirEntry, OkButton, CancelButton, Win);
- {gs, AddButton, click, _, _} ->
- Dirs = Options#options.include_dirs,
- NewDirs =
- case gs:read(DirEntry, text) of
- [] -> Dirs;
- Add -> [Add|Dirs]
- end,
- NewOptions = Options#options{include_dirs = NewDirs},
- gs:config(DirBox, [{items, NewDirs}]),
- include_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, DirBox, DirEntry, OkButton, CancelButton, Win);
- {gs, DeleteAllButton, click, _, _} ->
- gs:config(DirBox, [clear]),
- NewOptions = Options#options{include_dirs = []},
- include_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, DirBox, DirEntry, OkButton, CancelButton, Win);
- {gs, DeleteButton, click, _, _} ->
- NewOptions =
- case gs:read(DirBox, selection) of
- [] ->
- Options;
- List ->
- lists:foreach(fun(X) -> gs:config(DirBox, [{del, X}]) end,
- lists:sort(List)),
- NewDirs = gs:read(DirBox, items),
- Options#options{include_dirs = NewDirs}
- end,
- include_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, DirBox, DirEntry, OkButton, CancelButton, Win);
- {gs, Win, destroy, _, _} ->
- ok
- end.
-
-macro_dialog(#gui_state{gs = GS, options = Options}, Parent) ->
- WH = [{width, 300}, {height, 400}],
- Title = io_lib:format("Macro Definitions", []),
- Win = gs:window(GS, [{title, Title}, {configure, true},
- {default, entry, {bg, white}}| WH]),
- EmptySpace = {stretch, 1},
- Frame = gs:frame(Win, [{packer_x, [EmptySpace, EmptySpace]},
- {packer_y, [{fixed, 30}, {fixed, 30}, {fixed, 30},
- EmptySpace, {fixed, 30}, {fixed, 30}]}
- | WH]),
- gs:label(Frame, [{pack_xy, {1,1}}, {label, {text, "Macro"}}]),
- MacroEntry = gs:entry(Frame, [{pack_xy, {1,2}}]),
- gs:label(Frame, [{pack_xy, {2,1}}, {label, {text, "Term"}}]),
- TermEntry = gs:entry(Frame, [{pack_xy, {2,2}}]),
- ButtonPacker1 = gs:frame(Frame, [{pack_x, {1,2}}, {pack_y, 3},
- {packer_x, [{fixed, 70},{fixed, 70},
- EmptySpace]},
- {packer_y, {fixed, 30}}]),
- AddButton = gs:button(ButtonPacker1, [{label, {text, "Add"}},
- {pack_xy, {1,1}}]),
- Macros = [io_lib:format("~p = ~p",[X,Y]) || {X,Y} <- Options#options.defines],
- MacroBox = gs:listbox(Frame, [{pack_x, {1,2}}, {pack_y, 4}, {vscroll, right},
- {bg, white}, {configure, true},
- {selectmode, multiple},
- {items, Macros}]),
- ButtonPacker2 = gs:frame(Frame, [{pack_x, {1,2}}, {pack_y, 5},
- {packer_x, [{fixed, 60}, {fixed, 70},
- EmptySpace]},
- {packer_y, {fixed, 30}}]),
- DeleteButton = gs:button(ButtonPacker2, [{label, {text, "Delete"}},
- {pack_xy, {1,1}}]),
- DeleteAllButton = gs:button(ButtonPacker2, [{label, {text, "Delete All"}},
- {pack_xy, {2,1}}]),
- ButtonPacker3 = gs:frame(Frame, [{pack_x, {1,2}}, {pack_y, 6},
- {packer_x, [EmptySpace,
- {fixed, 60}, {fixed, 60}]},
- {packer_y, {fixed, 30}}]),
- OkButton = gs:button(ButtonPacker3, [{label, {text, "Ok"}},
- {pack_xy, {2,1}}]),
- CancelButton = gs:button(ButtonPacker3, [{label, {text, "Cancel"}},
- {pack_xy, {3,1}}]),
- gs:config(Win, [{map, true}]),
- gs:config(Frame, WH),
- macro_loop(Parent, Options, Frame, AddButton, DeleteAllButton, DeleteButton,
- MacroBox, MacroEntry, TermEntry, OkButton, CancelButton, Win).
-
-macro_loop(Parent, Options, Frame, AddButton, DeleteAllButton, DeleteButton,
- MacroBox, MacroEntry, TermEntry, OkButton, CancelButton, Win) ->
- receive
- {gs, CancelButton, click, _, _} ->
- gs:destroy(Win),
- ok;
- {gs, OkButton, click, _, _} ->
- gs:destroy(Win),
- Parent ! {new_options, Options},
- ok;
- {gs, Win, configure, _Data, [W, H|_]} ->
- gs:config(Frame, [{width, W}, {height, H}]),
- macro_loop(Parent, Options, Frame, AddButton, DeleteAllButton,
- DeleteButton, MacroBox, MacroEntry, TermEntry, OkButton,
- CancelButton, Win);
- {gs, AddButton, click, _, _} ->
- Defines = Options#options.defines,
- NewDefines =
- case gs:read(MacroEntry, text) of
- "" -> Defines;
- Macro ->
- Empty = [{text, ""}],
- case gs:read(TermEntry, text) of
- "" ->
- gs:config(MacroEntry, Empty),
- orddict:store(list_to_atom(Macro), true, Defines);
- String ->
- case parse(String) of
- {ok, Term} ->
- gs:config(MacroEntry, Empty),
- gs:config(TermEntry, Empty),
- orddict:store(list_to_atom(Macro), Term, Defines);
- {error, _Reason} ->
- Defines
- end
- end
- end,
- NewOptions = Options#options{defines = NewDefines},
- NewEntries = [io_lib:format("~p = ~p", [X, Y]) || {X, Y} <- NewDefines],
- gs:config(MacroBox, [{items, NewEntries}]),
- macro_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, MacroBox, MacroEntry, TermEntry, OkButton,
- CancelButton, Win);
- {gs, DeleteAllButton, click, _, _} ->
- gs:config(MacroBox, [clear]),
- NewOptions = Options#options{defines = []},
- macro_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, MacroBox, MacroEntry, TermEntry, OkButton,
- CancelButton, Win);
- {gs, DeleteButton, click, _, _} ->
- NewOptions =
- case gs:read(MacroBox, selection) of
- [] ->
- Options;
- List ->
- gs:config(MacroBox, [{selection, clear}]),
- Fun =
- fun(X) ->
- Val = gs:read(MacroBox, {get, X}),
- [MacroName|_] = re:split(Val, " ", [{return, list}]),
- list_to_atom(MacroName)
- end,
- Delete = [Fun(X) || X <- List],
- lists:foreach(fun(X) -> gs:config(MacroBox, [{del, X}]) end,
- lists:reverse(lists:sort(List))),
- Defines = Options#options.defines,
- NewDefines = lists:foldl(fun(X, Acc) ->
- orddict:erase(X, Acc)
- end,
- Defines, Delete),
- Options#options{defines = NewDefines}
- end,
- macro_loop(Parent, NewOptions, Frame, AddButton, DeleteAllButton,
- DeleteButton, MacroBox, MacroEntry, TermEntry, OkButton,
- CancelButton, Win);
- {gs, Win, destroy, _, _} ->
- ok
- end.
-
-parse(String) ->
- case erl_scan:string(String ++ ".", 1) of
- {ok, Ts, _} ->
- case erl_parse:parse_exprs(Ts) of
- {ok, [Expr]} ->
- try erl_parse:normalise(Expr)
- catch error:Reason -> {error, Reason}
- end;
- {error, E} ->
- parse_error(E)
- end;
- {error, E, _} ->
- parse_error(E)
- end.
-
-parse_error(E) ->
- S = io_lib:fwrite("Error parsing expression: ~P.", [E,15]),
- {error, S}.
-
-%% ----------------------------------------------------------------
-%%
-%% Run the analysis
-%%
-
-start_analysis(State) ->
- Analysis = build_analysis_record(State),
- case get_anal_files(State, Analysis#analysis.start_from) of
- error ->
- Msg = "You must choose one or more files or dirs\n"
- "before starting the analysis!",
- error_sms(State, Msg),
- config_gui_stop(State),
- State;
- {ok, Files} ->
- Msg = "\n========== Starting Analysis ==========\n\n",
- update_editor(State#gui_state.log, Msg),
- NewAnalysis = Analysis#analysis{files = Files},
- run_analysis(State, NewAnalysis)
- end.
-
-build_analysis_record(#gui_state{mode = Mode, menu = Menu, options = Options,
- init_plt = InitPlt0}) ->
- StartFrom =
- case gs:read(Mode#mode.start_byte_code, select) of
- true -> byte_code;
- false -> src_code
- end,
- InitPlt =
- case gs:read(Menu#menu.plt_empty, select) of
- true -> dialyzer_plt:new();
- false -> InitPlt0
- end,
- #analysis{defines = Options#options.defines,
- include_dirs = Options#options.include_dirs,
- plt = InitPlt,
- start_from = StartFrom,
- solvers = Options#options.solvers}.
-
-get_anal_files(#gui_state{chosen_box = ChosenBox}, StartFrom) ->
- Files = gs:read(ChosenBox, items),
- FilteredMods =
- case StartFrom of
- src_code -> filter_mods(Files, ".erl");
- byte_code -> filter_mods(Files, ".beam")
- end,
- FilteredDirs = [X || X <- Files, filelib:is_dir(X)],
- case ordsets:union(FilteredMods, FilteredDirs) of
- [] -> error;
- Set -> {ok, Set}
- end.
-
-run_analysis(State, Analysis) ->
- config_gui_start(State),
- Self = self(),
- NewAnalysis = Analysis#analysis{doc_plt = dialyzer_plt:new()},
- LegalWarnings = find_legal_warnings(State),
- Fun =
- fun() ->
- dialyzer_analysis_callgraph:start(Self, LegalWarnings, NewAnalysis)
- end,
- BackendPid = spawn_link(Fun),
- State#gui_state{backend_pid = BackendPid}.
-
-find_legal_warnings(#gui_state{menu = #menu{warnings = Warnings}}) ->
- ordsets:from_list([Tag || {Tag, GSItem} <- Warnings,
- gs:read(GSItem, select) =:= true]).
-
-flush() ->
- receive
- _ -> flush()
- after
- 0 -> ok
- end.
-
-update_editor(Editor, Msg) ->
- gs:config(Editor, [{enable, true}]),
- NofRows = gs:read(Editor, size),
- gs:config(Editor, [{insertpos, 'end'}]),
- gs:config(Editor, [{insert, {insert, Msg}}]),
- NewNofRows = gs:read(Editor, size),
- ScrollPos = gs:read(Editor, vscrollpos),
- gs:config(Editor, [{vscrollpos, ScrollPos + NewNofRows - NofRows}]),
- gs:config(Editor, [{enable, false}]).
diff --git a/lib/dialyzer/src/dialyzer_succ_typings.erl b/lib/dialyzer/src/dialyzer_succ_typings.erl
index 84379642bf..f0488b5ee3 100644
--- a/lib/dialyzer/src/dialyzer_succ_typings.erl
+++ b/lib/dialyzer/src/dialyzer_succ_typings.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2012. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -149,8 +149,10 @@ get_warnings(Callgraph, Plt, DocPlt, Codeserver,
NewState = InitState#st{no_warn_unused = NoWarnUnused},
Mods = dialyzer_callgraph:modules(NewState#st.callgraph),
MiniPlt = NewState#st.plt,
+ FindOpaques = lookup_and_find_opaques_fun(Codeserver),
CWarns =
- dialyzer_contracts:get_invalid_contract_warnings(Mods, Codeserver, MiniPlt),
+ dialyzer_contracts:get_invalid_contract_warnings(Mods, Codeserver,
+ MiniPlt, FindOpaques),
MiniDocPlt = dialyzer_plt:get_mini_plt(DocPlt),
ModWarns =
?timing(TimingServer, "warning",
@@ -261,7 +263,16 @@ refine_one_module(M, {CodeServer, Callgraph, Plt, _Solvers}) ->
FunTypes = get_fun_types_from_plt(AllFuns, Callgraph, Plt),
NewFunTypes =
dialyzer_dataflow:get_fun_types(ModCode, Plt, Callgraph, Records),
- case reached_fixpoint(FunTypes, NewFunTypes) of
+ Contracts1 = dialyzer_codeserver:lookup_mod_contracts(M, CodeServer),
+ Contracts = orddict:from_list(dict:to_list(Contracts1)),
+ FindOpaques = find_opaques_fun(Records),
+ DecoratedFunTypes =
+ decorate_succ_typings(Contracts, Callgraph, NewFunTypes, FindOpaques),
+ %% ?debug("NewFunTypes ~p\n ~n", [dict:to_list(NewFunTypes)]),
+ %% ?debug("refine DecoratedFunTypes ~p\n ~n", [dict:to_list(DecoratedFunTypes)]),
+ debug_pp_functions("Refine", NewFunTypes, DecoratedFunTypes, Callgraph),
+
+ case reached_fixpoint(FunTypes, DecoratedFunTypes) of
true -> [];
{false, NotFixpoint} ->
?debug("Not fixpoint\n", []),
@@ -357,9 +368,16 @@ find_succ_types_for_scc(SCC, {Codeserver, Callgraph, Plt, Solvers}) ->
AllFunSet = sets:from_list([X || {X, _} <- AllFuns]),
FilteredFunTypes =
dict:filter(fun(X, _) -> sets:is_element(X, AllFunSet) end, FunTypes),
+ FindOpaques = lookup_and_find_opaques_fun(Codeserver),
+ DecoratedFunTypes =
+ decorate_succ_typings(Contracts3, Callgraph, FilteredFunTypes, FindOpaques),
%% Check contracts
PltContracts =
- dialyzer_contracts:check_contracts(Contracts3, Callgraph, FilteredFunTypes),
+ dialyzer_contracts:check_contracts(Contracts3, Callgraph,
+ DecoratedFunTypes, FindOpaques),
+ %% ?debug("FilteredFunTypes ~p\n ~n", [dict:to_list(FilteredFunTypes)]),
+ %% ?debug("SCC DecoratedFunTypes ~p\n ~n", [dict:to_list(DecoratedFunTypes)]),
+ debug_pp_functions("SCC", FilteredFunTypes, DecoratedFunTypes, Callgraph),
ContractFixpoint =
lists:all(fun({MFA, _C}) ->
%% Check the non-deleted PLT
@@ -368,16 +386,47 @@ find_succ_types_for_scc(SCC, {Codeserver, Callgraph, Plt, Solvers}) ->
{value, _} -> true
end
end, PltContracts),
- Plt = insert_into_plt(FilteredFunTypes, Callgraph, Plt),
+ Plt = insert_into_plt(DecoratedFunTypes, Callgraph, Plt),
Plt = dialyzer_plt:insert_contract_list(Plt, PltContracts),
case (ContractFixpoint andalso
- reached_fixpoint_strict(PropTypes, FilteredFunTypes)) of
+ reached_fixpoint_strict(PropTypes, DecoratedFunTypes)) of
true -> [];
false ->
?debug("Not fixpoint for: ~w\n", [AllFuns]),
[Fun || {Fun, _Arity} <- AllFuns]
end.
+decorate_succ_typings(Contracts, Callgraph, FunTypes, FindOpaques) ->
+ F = fun(Label, Type) ->
+ case dialyzer_callgraph:lookup_name(Label, Callgraph) of
+ {ok, MFA} ->
+ case orddict:find(MFA, Contracts) of
+ {ok, {_FileLine, Contract}} ->
+ Args = dialyzer_contracts:get_contract_args(Contract),
+ Ret = dialyzer_contracts:get_contract_return(Contract),
+ C = erl_types:t_fun(Args, Ret),
+ {M, _, _} = MFA,
+ Opaques = FindOpaques(M),
+ erl_types:t_decorate_with_opaque(Type, C, Opaques);
+ error -> Type
+ end;
+ error -> Type
+ end
+ end,
+ dict:map(F, FunTypes).
+
+lookup_and_find_opaques_fun(Codeserver) ->
+ fun(Module) ->
+ Records = dialyzer_codeserver:lookup_mod_records(Module, Codeserver),
+ (find_opaques_fun(Records))(Module)
+ end.
+
+find_opaques_fun(Records) ->
+ fun(Module) ->
+ erl_types:module_builtin_opaques(Module) ++
+ erl_types:t_opaque_from_records(Records)
+ end.
+
get_fun_types_from_plt(FunList, Callgraph, Plt) ->
get_fun_types_from_plt(FunList, Callgraph, Plt, dict:new()).
@@ -443,9 +492,30 @@ debug_pp_succ_typings(SuccTypes) ->
|| {MFA, {contract, RetFun, ArgT}} <- SuccTypes],
?debug("\n", []),
ok.
+
+debug_pp_functions(Header, FunTypes, DecoratedFunTypes, Callgraph) ->
+ ?debug("FunTypes (~s)\n", [Header]),
+ FTypes = lists:keysort(1, dict:to_list(FunTypes)),
+ DTypes = lists:keysort(1, dict:to_list(DecoratedFunTypes)),
+ Fun = fun({{Label, Type},{Label, DecoratedType}}) ->
+ Name = lookup_name(Label, Callgraph),
+ ?debug("~w (~w): ~s\n",
+ [Name, Label, erl_types:t_to_string(Type)]),
+ case erl_types:t_is_equal(Type, DecoratedType) of
+ true -> ok;
+ false ->
+ ?debug(" With opaque types: ~s\n",
+ [erl_types:t_to_string(DecoratedType)])
+ end
+ end,
+ lists:foreach(Fun, lists:zip(FTypes, DTypes)),
+ ?debug("\n", []).
-else.
debug_pp_succ_typings(_) ->
ok.
+
+debug_pp_functions(_, _, _, _) ->
+ ok.
-endif.
lookup_name(F, CG) ->
diff --git a/lib/dialyzer/src/dialyzer_typesig.erl b/lib/dialyzer/src/dialyzer_typesig.erl
index a418a11e65..db7875704a 100644
--- a/lib/dialyzer/src/dialyzer_typesig.erl
+++ b/lib/dialyzer/src/dialyzer_typesig.erl
@@ -2,7 +2,7 @@
%%-----------------------------------------------------------------------
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -31,28 +31,30 @@
-export([analyze_scc/6]).
-export([get_safe_underapprox/2]).
+%%-import(helper, %% 'helper' could be any module doing sanity checks...
+-import(erl_types,
+ [t_has_var/1, t_inf/2, t_is_equal/2, t_is_subtype/2,
+ t_subtract/2, t_subtract_list/2, t_sup/1, t_sup/2,t_unify/2]).
+
-import(erl_types,
[t_any/0, t_atom/0, t_atom_vals/1,
t_binary/0, t_bitstr/0, t_bitstr/2, t_bitstr_concat/1, t_boolean/0,
t_collect_vars/1, t_cons/2, t_cons_hd/1, t_cons_tl/1,
t_float/0, t_from_range/2, t_from_term/1,
t_fun/0, t_fun/2, t_fun_args/1, t_fun_range/1,
- t_has_var/1,
- t_inf/2, t_inf/3, t_integer/0,
- t_is_any/1, t_is_atom/1, t_is_atom/2, t_is_cons/1, t_is_equal/2,
+ t_integer/0,
+ t_is_any/1, t_is_atom/1, t_is_any_atom/2, t_is_cons/1,
t_is_float/1, t_is_fun/1,
t_is_integer/1, t_non_neg_integer/0,
t_is_list/1, t_is_nil/1, t_is_none/1, t_is_number/1,
- t_is_subtype/2, t_limit/2, t_list/0, t_list/1,
+ t_limit/2, t_list/0, t_list/1,
t_list_elements/1, t_nonempty_list/1, t_maybe_improper_list/0,
t_module/0, t_number/0, t_number_vals/1,
- t_opaque_match_record/2, t_opaque_matching_structure/2,
- t_opaque_from_records/1,
t_pid/0, t_port/0, t_product/1, t_reference/0,
- t_subst/2, t_subtract/2, t_subtract_list/2, t_sup/1, t_sup/2,
+ t_subst/2,
t_timeout/0, t_tuple/0, t_tuple/1,
- t_unify/3, t_var/1, t_var_name/1,
+ t_var/1, t_var_name/1,
t_none/0, t_unit/0]).
-include("dialyzer.hrl").
@@ -105,11 +107,10 @@
module :: module(),
name_map = dict:new() :: dict(),
next_label = 0 :: label(),
- self_rec :: erl_types:erl_type(),
+ self_rec :: 'false' | erl_types:erl_type(),
plt :: dialyzer_plt:plt(),
prop_types = {'d', dict:new()} :: dict_or_ets(),
records = dict:new() :: dict(),
- opaques = [] :: [erl_types:erl_type()],
scc = [] :: [type_var()],
mfas :: [tuple()],
solvers = [] :: [solver()]
@@ -192,11 +193,10 @@ solvers(Solvers) -> Solvers.
%%
%% ============================================================================
-traverse_scc([{MFA, Def, Rec}|Left], DefSet, AccState) ->
+traverse_scc([{_MFA, Def, Rec}|Left], DefSet, AccState) ->
TmpState1 = state__set_rec_dict(AccState, Rec),
- TmpState2 = state__set_opaques(TmpState1, MFA),
DummyLetrec = cerl:c_letrec([Def], cerl:c_atom(foo)),
- {NewAccState, _} = traverse(DummyLetrec, DefSet, TmpState2),
+ {NewAccState, _} = traverse(DummyLetrec, DefSet, TmpState1),
traverse_scc(Left, DefSet, NewAccState);
traverse_scc([], _DefSet, AccState) ->
AccState.
@@ -386,12 +386,7 @@ traverse(Tree, DefinedVars, State) ->
case cerl:unfold_literal(Tree) of
Tree ->
Type = t_from_term(cerl:concrete(Tree)),
- NewType =
- case erl_types:t_opaque_match_atom(Type, State#state.opaques) of
- [Opaque] -> Opaque;
- _ -> Type
- end,
- {State, NewType};
+ {State, Type};
NewTree -> traverse(NewTree, DefinedVars, State)
end;
module ->
@@ -462,25 +457,17 @@ traverse(Tree, DefinedVars, State) ->
[Tag|Fields] ->
case cerl:is_c_atom(Tag) of
true ->
- %% Check if an opaque term is constructed.
- case t_opaque_match_record(TupleType, State#state.opaques) of
- [Opaque] ->
- OpStruct = t_opaque_matching_structure(TupleType, Opaque),
- State3 = state__store_conj(TupleType, sub, OpStruct, State2),
- {State3, Opaque};
- %% Check if a record is constructed.
- _ ->
- Arity = length(Fields),
- Records = State2#state.records,
- case lookup_record(Records, cerl:atom_val(Tag), Arity) of
- error -> {State2, TupleType};
- {ok, RecType} ->
- State3 = state__store_conj(TupleType, sub, RecType, State2),
- {State3, TupleType}
- end
- end;
+ %% Check if a record is constructed.
+ Arity = length(Fields),
+ Records = State2#state.records,
+ case lookup_record(Records, cerl:atom_val(Tag), Arity) of
+ error -> {State2, TupleType};
+ {ok, RecType} ->
+ State3 = state__store_conj(TupleType, sub, RecType, State2),
+ {State3, TupleType}
+ end;
false -> {State2, TupleType}
- end;
+ end;
[] -> {State2, TupleType}
end;
values ->
@@ -591,9 +578,13 @@ handle_try(Tree, DefinedVars, State) ->
case state__is_in_guard(State) of
true ->
Conj1 = mk_conj_constraint_list([ArgBodyCs,
- mk_constraint(BodyVar, eq, TreeVar)]),
+ mk_constraint(BodyVar,
+ eq,
+ TreeVar)]),
Disj = mk_disj_constraint_list([Conj1,
- mk_constraint(HandlerVar, eq, TreeVar)]),
+ mk_constraint(HandlerVar,
+ eq,
+ TreeVar)]),
NewState1 = state__new_constraint_context(HandlerState),
Conj2 = mk_conj_constraint_list([OldCs, Disj]),
NewState2 = state__store_conj(Conj2, NewState1),
@@ -604,19 +595,27 @@ handle_try(Tree, DefinedVars, State) ->
{false, false} ->
Conj1 =
mk_conj_constraint_list([ArgBodyCs,
- mk_constraint(TreeVar, eq, BodyVar)]),
+ mk_constraint(TreeVar,
+ eq,
+ BodyVar)]),
Conj2 =
mk_conj_constraint_list([HandlerCs,
- mk_constraint(TreeVar, eq, HandlerVar)]),
+ mk_constraint(TreeVar,
+ eq,
+ HandlerVar)]),
Disj = mk_disj_constraint_list([Conj1, Conj2]),
{Disj, TreeVar};
{false, true} ->
{mk_conj_constraint_list([ArgBodyCs,
- mk_constraint(TreeVar, eq, BodyVar)]),
+ mk_constraint(TreeVar,
+ eq,
+ BodyVar)]),
BodyVar};
{true, false} ->
{mk_conj_constraint_list([HandlerCs,
- mk_constraint(TreeVar, eq, HandlerVar)]),
+ mk_constraint(TreeVar,
+ eq,
+ HandlerVar)]),
HandlerVar};
{true, true} ->
?debug("Throw failed\n", []),
@@ -668,10 +667,7 @@ handle_call(Call, DefinedVars, State) ->
get_plt_constr(MFA, Dst, ArgVars, State) ->
Plt = state__plt(State),
PltRes = dialyzer_plt:lookup(Plt, MFA),
- Opaques = State#state.opaques,
- Module = State#state.module,
SCCMFAs = State#state.mfas,
- {FunModule, _, _} = MFA,
Contract =
case lists:member(MFA, SCCMFAs) of
true -> none;
@@ -691,28 +687,24 @@ get_plt_constr(MFA, Dst, ArgVars, State) ->
none ->
{?mk_fun_var(fun(Map) ->
ArgTypes = lookup_type_list(ArgVars, Map),
- dialyzer_contracts:get_contract_return(C, ArgTypes)
+ get_contract_return(C, ArgTypes)
end, ArgVars), GenArgs};
{value, {PltRetType, PltArgTypes}} ->
%% Need to combine the contract with the success typing.
{?mk_fun_var(
fun(Map) ->
- ArgTypes0 = lookup_type_list(ArgVars, Map),
- ArgTypes = case FunModule =:= Module of
- false ->
- List = lists:zip(PltArgTypes, ArgTypes0),
- [erl_types:t_unopaque_on_mismatch(T1, T2, Opaques)
- || {T1, T2} <- List];
- true -> ArgTypes0
- end,
- CRet = dialyzer_contracts:get_contract_return(C, ArgTypes),
- t_inf(CRet, PltRetType, opaque)
+ ArgTypes = lookup_type_list(ArgVars, Map),
+ CRet = get_contract_return(C, ArgTypes),
+ t_inf(CRet, PltRetType)
end, ArgVars),
- [t_inf(X, Y, opaque) || {X, Y} <- lists:zip(GenArgs, PltArgTypes)]}
+ [t_inf(X, Y) || {X, Y} <- lists:zip(GenArgs, PltArgTypes)]}
end,
state__store_conj_lists([Dst|ArgVars], sub, [RetType|ArgCs], State)
end.
+get_contract_return(C, ArgTypes) ->
+ dialyzer_contracts:get_contract_return(C, ArgTypes).
+
filter_match_fail([Clause] = Cls) ->
Body = cerl:clause_body(Clause),
case cerl:type(Body) of
@@ -1086,7 +1078,7 @@ get_bif_constr({erlang, Op, 2}, Dst, Args = [Arg1, Arg2], _State)
when Op =:= '+'; Op =:= '-'; Op =:= '*' ->
ReturnType = ?mk_fun_var(fun(Map) ->
TmpArgTypes = lookup_type_list(Args, Map),
- erl_bif_types:type(erlang, Op, 2, TmpArgTypes)
+ bif_return(erlang, Op, 2, TmpArgTypes)
end, Args),
ArgFun =
fun(A, Pos) ->
@@ -1128,8 +1120,8 @@ get_bif_constr({erlang, Op, 2}, Dst, [Arg1, Arg2] = Args, _State)
fun(LocalArg1, LocalArg2, LocalOp) ->
fun(Map) ->
DstType = lookup_type(Dst, Map),
- IsTrue = t_is_atom(true, DstType),
- IsFalse = t_is_atom(false, DstType),
+ IsTrue = t_is_any_atom(true, DstType),
+ IsFalse = t_is_any_atom(false, DstType),
case IsTrue orelse IsFalse of
true ->
Arg1Type = lookup_type(LocalArg1, Map),
@@ -1176,7 +1168,7 @@ get_bif_constr({erlang, Op, 2}, Dst, [Arg1, Arg2] = Args, _State)
Arg2Var = ?mk_fun_var(Arg2Fun, DstArgs),
DstVar = ?mk_fun_var(fun(Map) ->
TmpArgTypes = lookup_type_list(Args, Map),
- erl_bif_types:type(erlang, Op, 2, TmpArgTypes)
+ bif_return(erlang, Op, 2, TmpArgTypes)
end, Args),
mk_conj_constraint_list([mk_constraint(Dst, sub, DstVar),
mk_constraint(Arg1, sub, Arg1Var),
@@ -1218,7 +1210,7 @@ get_bif_constr({erlang, '++', 2}, Dst, [Hd, Tl] = Args, _State) ->
ArgTypes = erl_bif_types:arg_types(erlang, '++', 2),
ReturnType = ?mk_fun_var(fun(Map) ->
TmpArgTypes = lookup_type_list(Args, Map),
- erl_bif_types:type(erlang, '++', 2, TmpArgTypes)
+ bif_return(erlang, '++', 2, TmpArgTypes)
end, Args),
Cs = mk_constraints(Args, sub, ArgTypes),
mk_conj_constraint_list([mk_constraint(Dst, sub, ReturnType),
@@ -1240,7 +1232,7 @@ get_bif_constr({erlang, is_function, 1}, Dst, [Arg], State) ->
get_bif_constr({erlang, is_function, 2}, Dst, [Fun, Arity], _State) ->
ArgFun = fun(Map) ->
DstType = lookup_type(Dst, Map),
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true ->
ArityType = lookup_type(Arity, Map),
case t_number_vals(ArityType) of
@@ -1268,7 +1260,7 @@ get_bif_constr({erlang, is_reference, 1}, Dst, [Arg], State) ->
get_bif_test_constr(Dst, Arg, t_reference(), State);
get_bif_constr({erlang, is_record, 2}, Dst, [Var, Tag] = Args, _State) ->
ArgFun = fun(Map) ->
- case t_is_atom(true, lookup_type(Dst, Map)) of
+ case t_is_any_atom(true, lookup_type(Dst, Map)) of
true -> t_tuple();
false -> t_any()
end
@@ -1276,7 +1268,7 @@ get_bif_constr({erlang, is_record, 2}, Dst, [Var, Tag] = Args, _State) ->
ArgV = ?mk_fun_var(ArgFun, [Dst]),
DstFun = fun(Map) ->
TmpArgTypes = lookup_type_list(Args, Map),
- erl_bif_types:type(erlang, is_record, 2, TmpArgTypes)
+ bif_return(erlang, is_record, 2, TmpArgTypes)
end,
DstV = ?mk_fun_var(DstFun, Args),
mk_conj_constraint_list([mk_constraint(Dst, sub, DstV),
@@ -1285,10 +1277,9 @@ get_bif_constr({erlang, is_record, 2}, Dst, [Var, Tag] = Args, _State) ->
get_bif_constr({erlang, is_record, 3}, Dst, [Var, Tag, Arity] = Args, State) ->
%% TODO: Revise this to make it precise for Tag and Arity.
Records = State#state.records,
- AllOpaques = State#state.opaques,
ArgFun =
fun(Map) ->
- case t_is_atom(true, lookup_type(Dst, Map)) of
+ case t_is_any_atom(true, lookup_type(Dst, Map)) of
true ->
ArityType = lookup_type(Arity, Map),
case t_is_integer(ArityType) of
@@ -1304,10 +1295,7 @@ get_bif_constr({erlang, is_record, 3}, Dst, [Var, Tag, Arity] = Args, State) ->
[TagVal] ->
case lookup_record(Records, TagVal, ArityVal - 1) of
{ok, Type} ->
- case t_opaque_match_record(Type, AllOpaques) of
- [Opaque] -> Opaque;
- _ -> Type
- end;
+ Type;
error -> GenRecord
end;
_ -> GenRecord
@@ -1323,38 +1311,9 @@ get_bif_constr({erlang, is_record, 3}, Dst, [Var, Tag, Arity] = Args, State) ->
end,
ArgV = ?mk_fun_var(ArgFun, [Tag, Arity, Dst]),
DstFun = fun(Map) ->
- [TmpVar, TmpTag, TmpArity] = TmpArgTypes = lookup_type_list(Args, Map),
- TmpArgTypes2 =
- case lists:member(TmpVar, AllOpaques) of
- true ->
- case t_is_integer(TmpArity) of
- true ->
- case t_number_vals(TmpArity) of
- [TmpArityVal] ->
- case t_is_atom(TmpTag) of
- true ->
- case t_atom_vals(TmpTag) of
- [TmpTagVal] ->
- case lookup_record(Records, TmpTagVal,
- TmpArityVal - 1) of
- {ok, TmpType} ->
- case t_is_none(t_inf(TmpType, TmpVar, opaque)) of
- true -> TmpArgTypes;
- false -> [TmpType, TmpTag, TmpArity]
- end;
- error -> TmpArgTypes
- end;
- _ -> TmpArgTypes
- end;
- false -> TmpArgTypes
- end;
- _ -> TmpArgTypes
- end;
- false -> TmpArgTypes
- end;
- false -> TmpArgTypes
- end,
- erl_bif_types:type(erlang, is_record, 3, TmpArgTypes2)
+ [TmpVar, TmpTag, TmpArity] = lookup_type_list(Args, Map),
+ TmpArgTypes = [TmpVar,TmpTag,TmpArity],
+ bif_return(erlang, is_record, 3, TmpArgTypes)
end,
DstV = ?mk_fun_var(DstFun, Args),
mk_conj_constraint_list([mk_constraint(Dst, sub, DstV),
@@ -1369,12 +1328,14 @@ get_bif_constr({erlang, 'and', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
ArgFun = fun(Var) ->
fun(Map) ->
DstType = lookup_type(Dst, Map),
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true -> True;
false ->
- case t_is_atom(false, DstType) of
+ case t_is_any_atom(false, DstType) of
true ->
- case t_is_atom(true, lookup_type(Var, Map)) of
+ case
+ t_is_any_atom(true, lookup_type(Var, Map))
+ of
true -> False;
false -> t_boolean()
end;
@@ -1386,15 +1347,15 @@ get_bif_constr({erlang, 'and', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
end,
DstFun = fun(Map) ->
Arg1Type = lookup_type(Arg1, Map),
- case t_is_atom(false, Arg1Type) of
+ case t_is_any_atom(false, Arg1Type) of
true -> False;
false ->
Arg2Type = lookup_type(Arg2, Map),
- case t_is_atom(false, Arg2Type) of
+ case t_is_any_atom(false, Arg2Type) of
true -> False;
false ->
- case (t_is_atom(true, Arg1Type)
- andalso t_is_atom(true, Arg2Type)) of
+ case (t_is_any_atom(true, Arg1Type)
+ andalso t_is_any_atom(true, Arg2Type)) of
true -> True;
false -> t_boolean()
end
@@ -1413,12 +1374,14 @@ get_bif_constr({erlang, 'or', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
ArgFun = fun(Var) ->
fun(Map) ->
DstType = lookup_type(Dst, Map),
- case t_is_atom(false, DstType) of
+ case t_is_any_atom(false, DstType) of
true -> False;
false ->
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true ->
- case t_is_atom(false, lookup_type(Var, Map)) of
+ case
+ t_is_any_atom(false, lookup_type(Var, Map))
+ of
true -> True;
false -> t_boolean()
end;
@@ -1430,15 +1393,15 @@ get_bif_constr({erlang, 'or', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
end,
DstFun = fun(Map) ->
Arg1Type = lookup_type(Arg1, Map),
- case t_is_atom(true, Arg1Type) of
+ case t_is_any_atom(true, Arg1Type) of
true -> True;
false ->
Arg2Type = lookup_type(Arg2, Map),
- case t_is_atom(true, Arg2Type) of
+ case t_is_any_atom(true, Arg2Type) of
true -> True;
false ->
- case (t_is_atom(false, Arg1Type)
- andalso t_is_atom(false, Arg2Type)) of
+ case (t_is_any_atom(false, Arg1Type)
+ andalso t_is_any_atom(false, Arg2Type)) of
true -> False;
false -> t_boolean()
end
@@ -1465,10 +1428,10 @@ get_bif_constr({erlang, 'not', 1}, Dst, [Arg] = Args, _State) ->
Fun = fun(Var) ->
fun(Map) ->
Type = lookup_type(Var, Map),
- case t_is_atom(true, Type) of
+ case t_is_any_atom(true, Type) of
true -> False;
false ->
- case t_is_atom(false, Type) of
+ case t_is_any_atom(false, Type) of
true -> True;
false -> t_boolean()
end
@@ -1485,10 +1448,10 @@ get_bif_constr({erlang, '=:=', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
fun(Map) ->
DstType = lookup_type(Dst, Map),
OtherVarType = lookup_type(OtherVar, Map),
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true -> OtherVarType;
false ->
- case t_is_atom(false, DstType) of
+ case t_is_any_atom(false, DstType) of
true ->
case is_singleton_type(OtherVarType) of
true -> t_subtract(lookup_type(Self, Map), OtherVarType);
@@ -1518,7 +1481,7 @@ get_bif_constr({erlang, '=:=', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
get_bif_constr({erlang, '==', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
DstFun = fun(Map) ->
TmpArgTypes = lookup_type_list(Args, Map),
- erl_bif_types:type(erlang, '==', 2, TmpArgTypes)
+ bif_return(erlang, '==', 2, TmpArgTypes)
end,
ArgFun =
fun(Var, Self) ->
@@ -1527,16 +1490,16 @@ get_bif_constr({erlang, '==', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
DstType = lookup_type(Dst, Map),
case is_singleton_non_number_type(VarType) of
true ->
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true -> VarType;
false ->
- case t_is_atom(false, DstType) of
+ case t_is_any_atom(false, DstType) of
true -> t_subtract(lookup_type(Self, Map), VarType);
false -> t_any()
end
end;
false ->
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true ->
case t_is_number(VarType) of
true -> t_number();
@@ -1560,18 +1523,14 @@ get_bif_constr({erlang, '==', 2}, Dst, [Arg1, Arg2] = Args, _State) ->
mk_constraint(Arg1, sub, ArgV1),
mk_constraint(Arg2, sub, ArgV2)]);
get_bif_constr({erlang, element, 2} = _BIF, Dst, Args,
- #state{cs = Constrs, opaques = Opaques}) ->
+ #state{cs = Constrs}) ->
GenType = erl_bif_types:type(erlang, element, 2),
case t_is_none(GenType) of
true -> ?debug("Bif: ~w failed\n", [_BIF]), throw(error);
false ->
Fun = fun(Map) ->
- [I, T] = ATs = lookup_type_list(Args, Map),
- ATs2 = case lists:member(T, Opaques) of
- true -> [I, erl_types:t_opaque_structure(T)];
- false -> ATs
- end,
- erl_bif_types:type(erlang, element, 2, ATs2)
+ ATs2 = lookup_type_list(Args, Map),
+ bif_return(erlang, element, 2, ATs2)
end,
ReturnType = ?mk_fun_var(Fun, Args),
ArgTypes = erl_bif_types:arg_types(erlang, element, 2),
@@ -1583,22 +1542,14 @@ get_bif_constr({erlang, element, 2} = _BIF, Dst, Args,
end,
mk_conj_constraint_list([mk_constraint(Dst, sub, ReturnType)|NewCs])
end;
-get_bif_constr({M, F, A} = _BIF, Dst, Args, State) ->
+get_bif_constr({M, F, A} = _BIF, Dst, Args, _State) ->
GenType = erl_bif_types:type(M, F, A),
- Opaques = State#state.opaques,
case t_is_none(GenType) of
true -> ?debug("Bif: ~w failed\n", [_BIF]), throw(error);
false ->
- UnopaqueFun =
- fun(T) -> case lists:member(T, Opaques) of
- true -> erl_types:t_unopaque(T, [T]);
- false -> T
- end
- end,
ReturnType = ?mk_fun_var(fun(Map) ->
- TmpArgTypes0 = lookup_type_list(Args, Map),
- TmpArgTypes = [UnopaqueFun(T) || T<- TmpArgTypes0],
- erl_bif_types:type(M, F, A, TmpArgTypes)
+ TmpArgTypes = lookup_type_list(Args, Map),
+ bif_return(M, F, A, TmpArgTypes)
end, Args),
case erl_bif_types:is_known(M, F, A) of
false ->
@@ -1616,12 +1567,12 @@ get_bif_constr({M, F, A} = _BIF, Dst, Args, State) ->
end.
eval_inv_arith('+', _Pos, Dst, Arg) ->
- erl_bif_types:type(erlang, '-', 2, [Dst, Arg]);
+ bif_return(erlang, '-', 2, [Dst, Arg]);
eval_inv_arith('*', _Pos, Dst, Arg) ->
case t_number_vals(Arg) of
[0] -> t_integer();
_ ->
- TmpRet = erl_bif_types:type(erlang, 'div', 2, [Dst, Arg]),
+ TmpRet = bif_return(erlang, 'div', 2, [Dst, Arg]),
Zero = t_from_term(0),
%% If 0 is not part of the result, it cannot be part of the argument.
case t_is_subtype(Zero, Dst) of
@@ -1630,9 +1581,9 @@ eval_inv_arith('*', _Pos, Dst, Arg) ->
end
end;
eval_inv_arith('-', 1, Dst, Arg) ->
- erl_bif_types:type(erlang, '-', 2, [Arg, Dst]);
+ bif_return(erlang, '-', 2, [Arg, Dst]);
eval_inv_arith('-', 2, Dst, Arg) ->
- erl_bif_types:type(erlang, '+', 2, [Arg, Dst]).
+ bif_return(erlang, '+', 2, [Arg, Dst]).
range_inc(neg_inf) -> neg_inf;
range_inc(pos_inf) -> pos_inf;
@@ -1642,33 +1593,20 @@ range_dec(neg_inf) -> neg_inf;
range_dec(pos_inf) -> pos_inf;
range_dec(Int) when is_integer(Int) -> Int - 1.
-get_bif_test_constr(Dst, Arg, Type, State) ->
+get_bif_test_constr(Dst, Arg, Type, _State) ->
ArgFun = fun(Map) ->
DstType = lookup_type(Dst, Map),
- case t_is_atom(true, DstType) of
+ case t_is_any_atom(true, DstType) of
true -> Type;
false -> t_any()
end
end,
ArgV = ?mk_fun_var(ArgFun, [Dst]),
- Opaques = State#state.opaques,
DstFun = fun(Map) ->
ArgType = lookup_type(Arg, Map),
case t_is_none(t_inf(ArgType, Type)) of
true ->
- case lists:member(ArgType, Opaques) of
- true ->
- OpaqueStruct = erl_types:t_opaque_structure(ArgType),
- case t_is_none(t_inf(OpaqueStruct, Type)) of
- true -> t_from_term(false);
- false ->
- case t_is_subtype(ArgType, Type) of
- true -> t_from_term(true);
- false -> t_boolean()
- end
- end;
- false -> t_from_term(false)
- end;
+ t_from_term(false);
false ->
case t_is_subtype(ArgType, Type) of
true -> t_from_term(true);
@@ -1784,7 +1722,6 @@ minimize_state(#state{
fun_arities = FunArities,
self_rec = SelfRec,
prop_types = {d, PropTypes},
- opaques = Opaques,
solvers = Solvers
}) ->
Opts = [{read_concurrency, true}],
@@ -1798,7 +1735,6 @@ minimize_state(#state{
fun_arities = FunArities,
self_rec = SelfRec,
prop_types = {e, ETSPropTypes},
- opaques = Opaques,
solvers = Solvers
}.
@@ -1956,8 +1892,7 @@ v2_solve_ref(Fun, Map, State) ->
{ok, NewMap}.
v2_solve(#constraint{}=C, Map, V2State) ->
- State = V2State#v2_state.state,
- case solve_one_c(C, Map, State#state.opaques) of
+ case solve_one_c(C, Map) of
error ->
report_failed_constraint(C, Map),
{error, V2State};
@@ -2031,7 +1966,7 @@ v2_solve_self_recursive(Cs, Map, Id, RecType0, V2State0) ->
{ok, NewMap, V2State, U} ->
pp_map("recursive finished", NewMap),
NewRecType = unsafe_lookup_type(Id, NewMap),
- case t_is_equal(NewRecType, RecType0) of
+ case is_equal(NewRecType, RecType0) of
true ->
{NewMap2, U1} = enter_var_type(RecVar, NewRecType, NewMap),
{ok, NewMap2, V2State, lists:umerge(U, U1)};
@@ -2397,7 +2332,7 @@ solve_self_recursive(Cs, Map, MapDict, Id, RecType0, State) ->
{ok, NewMapDict, NewMap} ->
pp_map("NewMap", NewMap),
NewRecType = unsafe_lookup_type(Id, NewMap),
- case t_is_equal(NewRecType, RecType0) of
+ case is_equal(NewRecType, RecType0) of
true ->
{ok, NewMapDict, enter_type(RecVar, NewRecType, NewMap)};
false ->
@@ -2447,7 +2382,7 @@ solve_cs([#constraint_list{} = C|Tail], Map, MapDict, State) ->
{error, _NewMapDict} = Error -> Error
end;
solve_cs([#constraint{} = C|Tail], Map, MapDict, State) ->
- case solve_one_c(C, Map, State#state.opaques) of
+ case solve_one_c(C, Map) of
error ->
report_failed_constraint(C, Map),
{error, MapDict};
@@ -2457,10 +2392,10 @@ solve_cs([#constraint{} = C|Tail], Map, MapDict, State) ->
solve_cs([], Map, MapDict, _State) ->
{ok, MapDict, Map}.
-solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map, Opaques) ->
+solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map) ->
LhsType = lookup_type(Lhs, Map),
RhsType = lookup_type(Rhs, Map),
- Inf = t_inf(LhsType, RhsType, opaque),
+ Inf = t_inf(LhsType, RhsType),
?debug("Solving: ~s :: ~s ~w ~s :: ~s\n\tInf: ~s\n",
[format_type(Lhs), format_type(LhsType), Op,
format_type(Rhs), format_type(RhsType), format_type(Inf)]),
@@ -2468,12 +2403,12 @@ solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map, Opaques) ->
true -> error;
false ->
case Op of
- sub -> solve_subtype(Lhs, Inf, Map, Opaques);
+ sub -> solve_subtype(Lhs, Inf, Map);
eq ->
- case solve_subtype(Lhs, Inf, Map, Opaques) of
+ case solve_subtype(Lhs, Inf, Map) of
error -> error;
{ok, {Map1, U1}} ->
- case solve_subtype(Rhs, Inf, Map1, Opaques) of
+ case solve_subtype(Rhs, Inf, Map1) of
error -> error;
{ok, {Map2, U2}} -> {ok, {Map2, lists:umerge(U1, U2)}}
end
@@ -2481,7 +2416,7 @@ solve_one_c(#constraint{lhs = Lhs, rhs = Rhs, op = Op}, Map, Opaques) ->
end
end.
-solve_subtype(Type, Inf, Map, Opaques) ->
+solve_subtype(Type, Inf, Map) ->
%% case cerl:is_literal(Type) of
%% true ->
%% case t_is_subtype(t_from_term(cerl:concrete(Type)), Inf) of
@@ -2489,7 +2424,7 @@ solve_subtype(Type, Inf, Map, Opaques) ->
%% false -> error
%% end;
%% false ->
- try t_unify(Type, Inf, Opaques) of
+ try t_unify(Type, Inf) of
{_, List} -> {ok, enter_type_list(List, Map)}
catch
throw:{mismatch, _T1, _T2} ->
@@ -2540,7 +2475,7 @@ join_one_key(Key, [Map|Maps], Type) ->
true -> Type;
false ->
NewType = lookup_type(Key, Map),
- case t_is_equal(NewType, Type) of
+ case is_equal(NewType, Type) of
true -> join_one_key(Key, Maps, Type);
false -> join_one_key(Key, Maps, t_sup(NewType, Type))
end
@@ -2555,7 +2490,7 @@ maps_are_equal(Map1, Map2, Deps) ->
maps_are_equal_1(Map1, Map2, [H|Tail]) ->
T1 = lookup_type(H, Map1),
T2 = lookup_type(H, Map2),
- case t_is_equal(T1, T2) of
+ case is_equal(T1, T2) of
true -> maps_are_equal_1(Map1, Map2, Tail);
false ->
?debug("~w: ~s =/= ~s\n", [H, format_type(T1), format_type(T2)]),
@@ -2587,14 +2522,20 @@ prune_keys(Map1, Map2, Deps) ->
enter_type(Key, Val, Map) when is_integer(Key) ->
?debug("Entering ~s :: ~s\n", [format_type(t_var(Key)), format_type(Val)]),
- case t_is_any(Val) of
+ %% Keep any() in the map if it is opaque:
+ case is_equal(Val, t_any()) of
true ->
erase_type(Key, Map);
false ->
LimitedVal = t_limit(Val, ?INTERNAL_TYPE_LIMIT),
+ [?debug("LimitedVal ~s\n", [format_type(LimitedVal)]) ||
+ not is_equal(LimitedVal, Val)],
case dict:find(Key, Map) of
- {ok, LimitedVal} -> Map;
- {ok, _} -> map_store(Key, LimitedVal, Map);
+ {ok, Value} ->
+ case is_equal(Value, LimitedVal) of
+ true -> Map;
+ false -> map_store(Key, LimitedVal, Map)
+ end;
error -> map_store(Key, LimitedVal, Map)
end
end;
@@ -2681,7 +2622,10 @@ updated_vars_only(U, OldMap, NewMap) ->
[V || V <- U, not is_same(V, OldMap, NewMap)].
is_same(Key, Map1, Map2) ->
- t_is_equal(lookup_type(Key, Map1), lookup_type(Key, Map2)).
+ is_equal(lookup_type(Key, Map1), lookup_type(Key, Map2)).
+
+is_equal(Type1, Type2) ->
+ t_is_equal(Type1, Type2).
pp_map(_S, _Map) ->
?debug("\t~s: ~p\n",
@@ -2716,11 +2660,6 @@ new_state(SCC0, NextLabel, CallGraph, Plt, PropTypes, Solvers) ->
state__set_rec_dict(State, RecDict) ->
State#state{records = RecDict}.
-state__set_opaques(#state{records = RecDict} = State, {M, _F, _A}) ->
- Opaques =
- erl_types:module_builtin_opaques(M) ++ t_opaque_from_records(RecDict),
- State#state{opaques = Opaques, module = M}.
-
state__set_in_match(State, Bool) ->
State#state{in_match = Bool}.
@@ -2760,7 +2699,8 @@ state__lookup_undef_var(Tree, #state{callgraph = CG, plt = Plt}) ->
{ok, MFA} ->
case dialyzer_plt:lookup(Plt, MFA) of
none -> error;
- {value, {RetType, ArgTypes}} -> {ok, t_fun(ArgTypes, RetType)}
+ {value, {RetType, ArgTypes}} ->
+ {ok, t_fun(ArgTypes, RetType)}
end
end.
@@ -2897,7 +2837,7 @@ state__get_cs(Var, #state{cmap = {d, Dict}}) ->
dict:fetch(Var, Dict).
state__is_self_rec(Fun, #state{self_rec = SelfRec}) ->
- Fun =:= SelfRec.
+ not (SelfRec =:= 'false') andalso is_equal(Fun, SelfRec).
state__store_funs(Vars0, Funs0, #state{fun_map = Map} = State) ->
debug_make_name_map(Vars0, Funs0),
@@ -2923,7 +2863,9 @@ state__finalize(State) ->
%%
%% ============================================================================
--spec mk_constraint(erl_types:erl_type(), constr_op(), fvar_or_type()) -> #constraint{}.
+-spec mk_constraint(erl_types:erl_type(),
+ constr_op(),
+ fvar_or_type()) -> #constraint{}.
mk_constraint(Lhs, Op, Rhs) ->
case t_is_any(Lhs) orelse constraint_opnd_is_any(Rhs) of
@@ -2934,9 +2876,9 @@ mk_constraint(Lhs, Op, Rhs) ->
case Deps =:= [] of
true ->
%% This constraint is constant. Solve it immediately.
- case solve_one_c(C, map_new(), []) of
+ case solve_one_c(C, map_new()) of
error -> throw(error);
- _ ->
+ _R ->
%% This is always true, keep it anyway for logistic reasons
C
end;
@@ -2944,10 +2886,13 @@ mk_constraint(Lhs, Op, Rhs) ->
C
end;
true ->
- C = mk_constraint_1(t_any(), Op, t_any()),
- C#constraint{deps = []}
+ mk_constraint_any(Op)
end.
+mk_constraint_any(Op) ->
+ C = mk_constraint_1(t_any(), Op, t_any()),
+ C#constraint{deps = []}.
+
%% the following function is used so that we do not call
%% erl_types:t_is_any/1 with a term other than an erl_type()
-spec constraint_opnd_is_any(fvar_or_type()) -> boolean().
@@ -3002,7 +2947,8 @@ mk_constraint_1(Lhs, Op, Rhs) ->
#constraint{lhs = Lhs, op = Op, rhs = Rhs}.
mk_constraints([Lhs|LhsTail], Op, [Rhs|RhsTail]) ->
- [mk_constraint(Lhs, Op, Rhs)|mk_constraints(LhsTail, Op, RhsTail)];
+ [mk_constraint(Lhs, Op, Rhs) |
+ mk_constraints(LhsTail, Op, RhsTail)];
mk_constraints([], _Op, []) ->
[].
@@ -3017,7 +2963,7 @@ mk_constraint_list(Type, List) ->
Deps = calculate_deps(List2),
case Deps =:= [] of
true -> #constraint_list{type = conj,
- list = [mk_constraint(t_any(), eq, t_any())],
+ list = [mk_constraint_any(eq)],
deps = []};
false -> #constraint_list{type = Type, list = List2, deps = Deps}
end.
@@ -3236,6 +3182,9 @@ calculate_masks([], _I, L) ->
%%
%% ============================================================================
+bif_return(M, F, A, Xs) ->
+ erl_bif_types:type(M, F, A, Xs).
+
is_singleton_non_number_type(Type) ->
case t_is_number(Type) of
true -> false;
@@ -3265,7 +3214,7 @@ is_singleton_type(Type) ->
find_element(Args, Cs) ->
[Pos, Tuple] = Args,
- case erl_types:t_is_number(Pos) of
+ case t_is_number(Pos) of
true ->
case erl_types:t_number_vals(Pos) of
'unknown' -> 'unknown';
@@ -3301,8 +3250,10 @@ find_constraint(Tuple, [_|Cs]) ->
lookup_record(Records, Tag, Arity) ->
case erl_types:lookup_record(Tag, Arity, Records) of
{ok, Fields} ->
- {ok, t_tuple([t_from_term(Tag)|
- [FieldType || {_FieldName, FieldType} <- Fields]])};
+ RecType =
+ t_tuple([t_from_term(Tag)|
+ [FieldType || {_FieldName, FieldType} <- Fields]]),
+ {ok, RecType};
error ->
error
end.
diff --git a/lib/dialyzer/test/Makefile b/lib/dialyzer/test/Makefile
index 9f8a3f1194..27cabc8ef8 100644
--- a/lib/dialyzer/test/Makefile
+++ b/lib/dialyzer/test/Makefile
@@ -7,6 +7,7 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
AUXILIARY_FILES=\
dialyzer.spec\
+ dialyzer.cover\
dialyzer_test_constants.hrl\
dialyzer_common.erl\
file_utils.erl\
diff --git a/lib/dialyzer/test/dialyzer.cover b/lib/dialyzer/test/dialyzer.cover
new file mode 100644
index 0000000000..cc61ea1901
--- /dev/null
+++ b/lib/dialyzer/test/dialyzer.cover
@@ -0,0 +1,3 @@
+%% -*- erlang -*-
+{incl_app,dialyzer,details}.
+%{incl_mods,dialyzer,[erl_types,erl_bif_types]}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/crash b/lib/dialyzer/test/opaque_SUITE_data/results/crash
index 1ddae5149f..69bdc00257 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/crash
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/crash
@@ -1,6 +1,6 @@
crash_1.erl:45: Record construction #targetlist{list::[]} violates the declared type of field list::'undefined' | crash_1:target()
-crash_1.erl:48: The call crash_1:get_using_branch2(Branch::maybe_improper_list(),L::'undefined' | crash_1:target()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+crash_1.erl:48: The call crash_1:get_using_branch2(Branch::maybe_improper_list(),L::'undefined' | crash_1:target()) will never return since it differs in the 2nd argument from the success typing arguments: (any(),maybe_improper_list())
crash_1.erl:50: The pattern <_Branch, []> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
crash_1.erl:52: The pattern <Branch, [H = {'target', _, _} | _T]> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
crash_1.erl:54: The pattern <Branch, [{'target', _, _} | T]> can never match the type <maybe_improper_list(),'undefined' | crash_1:target()>
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/ets b/lib/dialyzer/test/opaque_SUITE_data/results/ets
index 5498ba1538..e79696bc30 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/ets
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/ets
@@ -1,3 +1,4 @@
ets_use.erl:12: Guard test is_integer(T::atom() | tid()) breaks the opaqueness of its argument
+ets_use.erl:20: The type test is_integer(atom() | tid()) breaks the opaqueness of the term atom() | tid()
ets_use.erl:7: Guard test is_integer(T::tid()) breaks the opaqueness of its argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/ewgi b/lib/dialyzer/test/opaque_SUITE_data/results/ewgi
index 3c8cfb59f8..5bc6b87fbb 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/ewgi
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/ewgi
@@ -1,4 +1,4 @@
ewgi_api.erl:55: The call gb_trees:to_list({non_neg_integer(),'nil' | {_,_,_,_}}) does not have an opaque term of type gb_tree() as 1st argument
-ewgi_testapp.erl:35: The call ewgi_testapp:htmlise_data("request_data",{non_neg_integer(),'nil' | {_,_,_,_}}) will never return since it differs in the 2nd argument from the success typing arguments: ([95 | 97 | 100 | 101 | 104 | 112 | 113 | 114 | 115 | 116 | 117,...],[{_,_}])
+ewgi_testapp.erl:35: The call ewgi_testapp:htmlise_data("request_data",{non_neg_integer(),'nil' | {_,_,_,_}}) does not have a term of type [{_,_}] | gb_tree() (with opaque subterms) as 2nd argument
ewgi_testapp.erl:43: The call gb_trees:to_list(T::{non_neg_integer(),'nil' | {_,_,_,_}}) does not have an opaque term of type gb_tree() as 1st argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1 b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1
index eb8f304905..4fe5fcfe2d 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop1
@@ -2,4 +2,4 @@
inf_loop1.erl:119: The pattern [{_, LNorms}] can never match the type []
inf_loop1.erl:121: The pattern [{LinksA, LNormA}, {LinksB, LNormB}] can never match the type []
inf_loop1.erl:129: The pattern [{_, Norm} | _] can never match the type []
-inf_loop1.erl:71: The call gb_trees:get(Edge::any(),Etab::array()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+inf_loop1.erl:71: The call gb_trees:get(Edge::any(),Etab::array()) does not have an opaque term of type gb_tree() as 2nd argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop2 b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop2
new file mode 100644
index 0000000000..4f0b79eb35
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/inf_loop2
@@ -0,0 +1,5 @@
+
+inf_loop2.erl:122: The pattern [{_, LNorms}] can never match the type []
+inf_loop2.erl:124: The pattern [{LinksA, LNormA}, {LinksB, LNormB}] can never match the type []
+inf_loop2.erl:132: The pattern [{_, Norm} | _] can never match the type []
+inf_loop2.erl:74: The call gb_trees:get(Edge::any(),Etab::array()) does not have an opaque term of type gb_tree() as 2nd argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/int b/lib/dialyzer/test/opaque_SUITE_data/results/int
index 3ee4def34b..dc806fa12c 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/int
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/int
@@ -1,3 +1,3 @@
-int_adt.erl:28: Invalid type specification for function int_adt:add_f/2. The success typing is (number(),float()) -> number()
-int_adt.erl:32: Invalid type specification for function int_adt:div_f/2. The success typing is (number(),number()) -> float()
+int_adt.erl:28: Invalid type specification for function int_adt:add_f/2. The success typing is (number() | int_adt:int(),float()) -> number() | int_adt:int()
+int_adt.erl:32: Invalid type specification for function int_adt:div_f/2. The success typing is (number() | int_adt:int(),number() | int_adt:int()) -> float()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque b/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque
index ab850b613e..0363be544d 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/mixed_opaque
@@ -1,2 +1,2 @@
-mixed_opaque_use.erl:31: The call mixed_opaque_rec_adt:get_a(Q::mixed_opaque_queue_adt:my_queue()) contains an opaque term as 1st argument when an opaque term of type mixed_opaque_rec_adt:rec() is expected
+mixed_opaque_use.erl:31: The call mixed_opaque_rec_adt:get_a(Q::mixed_opaque_queue_adt:my_queue()) does not have an opaque term of type mixed_opaque_rec_adt:rec() as 1st argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/modules b/lib/dialyzer/test/opaque_SUITE_data/results/modules
new file mode 100644
index 0000000000..f71334b9de
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/modules
@@ -0,0 +1,3 @@
+
+opaque_digraph.erl:353: Cons will produce an improper list since its 2nd argument is number()
+opaque_digraph.erl:365: Cons will produce an improper list since its 2nd argument is number()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/my_queue b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue
index 2860b91084..1f25a6f9c3 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/my_queue
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/my_queue
@@ -4,4 +4,4 @@ my_queue_use.erl:19: The call my_queue_adt:add(42,Q0::[]) does not have an opaqu
my_queue_use.erl:24: The attempt to match a term of type my_queue_adt:my_queue() against the pattern [42 | Q2] breaks the opaqueness of the term
my_queue_use.erl:30: Attempt to test for equality between a term of type [] and a term of opaque type my_queue_adt:my_queue()
my_queue_use.erl:34: Cons will produce an improper list since its 2nd argument is my_queue_adt:my_queue()
-my_queue_use.erl:34: The call my_queue_adt:dequeue(nonempty_improper_list(42,my_queue_adt:my_queue())) does not have an opaque term of type my_queue_adt:my_queue() as 1st argument
+my_queue_use.erl:34: The call my_queue_adt:dequeue(nonempty_maybe_improper_list(42,my_queue_adt:my_queue())) does not have an opaque term of type my_queue_adt:my_queue() as 1st argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/opaque b/lib/dialyzer/test/opaque_SUITE_data/results/opaque
index ca76f57b54..5747f9061f 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/opaque
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/opaque
@@ -1,2 +1,3 @@
+opaque_bug3.erl:19: The pattern 'a' can never match the type #c{}
opaque_bug4.erl:20: The attempt to match a term of type opaque_adt:abc() against the pattern 'a' breaks the opaqueness of the term
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/queue b/lib/dialyzer/test/opaque_SUITE_data/results/queue
index c3f04ea64d..59ce33f098 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/queue
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/queue
@@ -5,7 +5,6 @@ queue_use.erl:27: The attempt to match a term of type queue() against the patter
queue_use.erl:33: Attempt to test for equality between a term of type {[42,...],[]} and a term of opaque type queue()
queue_use.erl:36: The attempt to match a term of type queue() against the pattern {F, _R} breaks the opaqueness of the term
queue_use.erl:40: The call queue:out({[42,...],[]}) does not have an opaque term of type queue() as 1st argument
-queue_use.erl:48: The call queue_use:add_unique(42,#db{p::[],q::queue()}) contains an opaque term as 2nd argument when terms of different types are expected in these positions
queue_use.erl:51: The call queue_use:is_in_queue(E::42,DB::#db{p::[],q::queue()}) contains an opaque term as 2nd argument when terms of different types are expected in these positions
queue_use.erl:56: The attempt to match a term of type #db{p::[],q::queue()} against the pattern {'db', _, {L1, L2}} breaks the opaqueness of queue()
queue_use.erl:62: The call queue_use:tuple_queue({42,'gazonk'}) does not have a term of type {_,queue()} (with opaque subterms) as 1st argument
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/simple b/lib/dialyzer/test/opaque_SUITE_data/results/simple
new file mode 100644
index 0000000000..f55b384cbe
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/simple
@@ -0,0 +1,87 @@
+
+exact_api.erl:17: The call exact_api:set_type(A::#digraph{vtab::'notable',etab::'notable',ntab::'notable',cyclic::'true'}) does not have an opaque term of type digraph() as 1st argument
+exact_api.erl:23: The call digraph:delete(G::#digraph{vtab::'notable',etab::'notable',ntab::'notable',cyclic::'true'}) does not have an opaque term of type digraph() as 1st argument
+exact_api.erl:55: The attempt to match a term of type exact_adt:exact_adt() against the pattern {'exact_adt'} breaks the opaqueness of the term
+exact_api.erl:59: The call exact_adt:exact_adt_set_type2(A::#exact_adt{}) does not have an opaque term of type exact_adt:exact_adt() as 1st argument
+is_rec.erl:10: The call erlang:is_record(simple1_adt:d1(),'r',2) contains an opaque term as 1st argument when terms of different types are expected in these positions
+is_rec.erl:15: The call erlang:is_record(A::simple1_adt:d1(),'r',I::1 | 2 | 3) contains an opaque term as 1st argument when terms of different types are expected in these positions
+is_rec.erl:19: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opaqueness of its argument
+is_rec.erl:23: Guard test is_record({simple1_adt:d1(),1},'r',2) breaks the opaqueness of its argument
+is_rec.erl:41: The call erlang:is_record(A::simple1_adt:d1(),R::'a') contains an opaque term as 1st argument when terms of different types are expected in these positions
+is_rec.erl:45: The call erlang:is_record(A::simple1_adt:d1(),A::simple1_adt:d1(),1) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+is_rec.erl:49: The call erlang:is_record(A::simple1_adt:d1(),any(),1) contains an opaque term as 1st argument when terms of different types are expected in these positions
+is_rec.erl:53: The call erlang:is_record(A::simple1_adt:d1(),A::simple1_adt:d1(),any()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+is_rec.erl:57: Guard test is_record(A::simple1_adt:d1(),'r',2) breaks the opaqueness of its argument
+is_rec.erl:61: The record #r{f1::simple1_adt:d1()} violates the declared type for #r{}
+is_rec.erl:65: The call erlang:is_record({simple1_adt:d1(),1},'r',2) contains an opaque term as 1st argument when terms of different types are expected in these positions
+rec_api.erl:22: Record construction #r1{f1::10} violates the declared type of field f1::'undefined' | rec_api:a()
+rec_api.erl:23: The pattern {'r1', 10} violates the declared type for #r1{}
+rec_api.erl:27: The attempt to match a term of type rec_adt:r1() against the pattern {'r1', 'a'} breaks the opaqueness of the term
+rec_api.erl:29: Invalid type specification for function rec_api:adt_t1/1. The success typing is (#r1{f1::'a'}) -> #r1{f1::'a'}
+rec_api.erl:34: Invalid type specification for function rec_api:adt_r1/0. The success typing is () -> #r1{f1::'a'}
+rec_api.erl:77: The attempt to match a term of type rec_api:f() against the variable _ breaks the opaqueness of the term
+simple1_api.erl:113: The test simple1_api:d1() =:= simple1_api:d2() can never evaluate to 'true'
+simple1_api.erl:118: Guard test simple1_api:d2() =:= A::simple1_api:d1() can never succeed
+simple1_api.erl:142: Attempt to test for equality between a term of type simple1_adt:o2() and a term of opaque type simple1_adt:o1()
+simple1_api.erl:148: Guard test simple1_adt:o2() =:= A::simple1_adt:o1() contains an opaque term as 1st argument
+simple1_api.erl:154: Attempt to test for inequality between a term of type simple1_adt:o2() and a term of opaque type simple1_adt:o1()
+simple1_api.erl:160: Attempt to test for inequality between a term of type simple1_adt:o2() and a term of opaque type simple1_adt:o1()
+simple1_api.erl:165: Attempt to test for equality between a term of type simple1_adt:c2() and a term of opaque type simple1_adt:c1()
+simple1_api.erl:181: Guard test A::simple1_adt:d1() =< B::simple1_adt:d2() contains an opaque term as 1st argument
+simple1_api.erl:185: Guard test 'a' =< B::simple1_adt:d2() contains an opaque term as 2nd argument
+simple1_api.erl:189: Guard test A::simple1_adt:d1() =< 'd' contains an opaque term as 1st argument
+simple1_api.erl:197: The type test is_integer(A::simple1_adt:d1()) breaks the opaqueness of the term A::simple1_adt:d1()
+simple1_api.erl:221: Guard test A::simple1_api:i1() > 3 can never succeed
+simple1_api.erl:225: Guard test A::simple1_adt:i1() > 3 contains an opaque term as 1st argument
+simple1_api.erl:233: Guard test A::simple1_adt:i1() < 3 contains an opaque term as 1st argument
+simple1_api.erl:239: Guard test A::1 > 3 can never succeed
+simple1_api.erl:243: Guard test A::1 > 3 can never succeed
+simple1_api.erl:257: Guard test is_function(T::simple1_api:o1()) can never succeed
+simple1_api.erl:265: Guard test is_function(T::simple1_adt:o1()) breaks the opaqueness of its argument
+simple1_api.erl:269: The type test is_function(T::simple1_adt:o1()) breaks the opaqueness of the term T::simple1_adt:o1()
+simple1_api.erl:274: Guard test is_function(T::simple1_api:o1(),A::simple1_api:i1()) can never succeed
+simple1_api.erl:284: Guard test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opaqueness of its argument
+simple1_api.erl:289: The type test is_function(T::simple1_adt:o1(),A::simple1_adt:i1()) breaks the opaqueness of the term T::simple1_adt:o1()
+simple1_api.erl:294: The call erlang:is_function(T::simple1_api:o1(),A::simple1_adt:i1()) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+simple1_api.erl:300: The type test is_function(T::simple1_adt:o1(),A::simple1_api:i1()) breaks the opaqueness of the term T::simple1_adt:o1()
+simple1_api.erl:306: Guard test B::simple1_api:b2() =:= 'true' can never succeed
+simple1_api.erl:315: Guard test A::simple1_api:b1() =:= 'false' can never succeed
+simple1_api.erl:319: Guard test not('and'('true','true')) can never succeed
+simple1_api.erl:337: Clause guard cannot succeed.
+simple1_api.erl:342: Guard test B::simple1_adt:b2() =:= 'true' contains an opaque term as 1st argument
+simple1_api.erl:347: Guard test A::simple1_adt:b1() =:= 'true' contains an opaque term as 1st argument
+simple1_api.erl:355: Invalid type specification for function simple1_api:bool_adt_t6/1. The success typing is ('true') -> 1
+simple1_api.erl:365: Clause guard cannot succeed.
+simple1_api.erl:368: Invalid type specification for function simple1_api:bool_adt_t8/2. The success typing is (boolean(),boolean()) -> 1
+simple1_api.erl:378: Clause guard cannot succeed.
+simple1_api.erl:381: Invalid type specification for function simple1_api:bool_adt_t9/2. The success typing is ('false','false') -> 1
+simple1_api.erl:407: The size simple1_adt:i1() breaks the opaqueness of A
+simple1_api.erl:418: The attempt to match a term of type non_neg_integer() against the variable A breaks the opaqueness of simple1_adt:i1()
+simple1_api.erl:425: The attempt to match a term of type non_neg_integer() against the variable B breaks the opaqueness of simple1_adt:i1()
+simple1_api.erl:432: The attempt to match a term of type non_neg_integer() against the variable B breaks the opaqueness of simple1_api:o1()
+simple1_api.erl:448: The attempt to match a term of type non_neg_integer() against the variable Sz breaks the opaqueness of simple1_adt:i1()
+simple1_api.erl:460: The attempt to match a term of type simple1_adt:bit1() against the pattern <<_/binary-unit:8>> breaks the opaqueness of the term
+simple1_api.erl:478: The call 'foo':A(A::simple1_adt:a()) breaks the opaqueness of the term A :: simple1_adt:a()
+simple1_api.erl:486: The call A:'foo'(A::simple1_adt:a()) breaks the opaqueness of the term A :: simple1_adt:a()
+simple1_api.erl:499: The call 'foo':A(A::simple1_api:i()) requires that A is of type atom() not simple1_api:i()
+simple1_api.erl:503: The call 'foo':A(A::simple1_adt:i()) requires that A is of type atom() not simple1_adt:i()
+simple1_api.erl:507: The call A:'foo'(A::simple1_api:i()) requires that A is of type atom() | tuple() not simple1_api:i()
+simple1_api.erl:511: The call A:'foo'(A::simple1_adt:i()) requires that A is of type atom() | tuple() not simple1_adt:i()
+simple1_api.erl:519: Guard test A::simple1_adt:d2() == B::simple1_adt:d1() contains an opaque term as 1st argument
+simple1_api.erl:534: Guard test A::simple1_adt:d1() >= 3 contains an opaque term as 1st argument
+simple1_api.erl:536: Guard test A::simple1_adt:d1() == 3 contains an opaque term as 1st argument
+simple1_api.erl:538: Guard test A::simple1_adt:d1() =:= 3 contains an opaque term as 1st argument
+simple1_api.erl:548: The call erlang:'<'(A::simple1_adt:d1(),3) contains an opaque term as 1st argument when terms of different types are expected in these positions
+simple1_api.erl:558: The call erlang:'=<'(A::simple1_adt:d1(),B::simple1_adt:d2()) contains an opaque term as 1st argument when terms of different types are expected in these positions
+simple1_api.erl:565: Guard test {digraph(),3} > {digraph(),atom() | tid()} contains an opaque term as 2nd argument
+simple1_api.erl:91: Invalid type specification for function simple1_api:tup/0. The success typing is () -> {'a','b'}
+simple2_api.erl:100: The call lists:flatten(A::simple1_adt:tuple1()) contains an opaque term as 1st argument when a structured term of type [any()] is expected
+simple2_api.erl:116: The call lists:flatten({simple1_adt:tuple1()}) will never return since it differs in the 1st argument from the success typing arguments: ([any()])
+simple2_api.erl:121: Guard test {simple1_adt:d1(),3} > {simple1_adt:d1(),simple1_adt:tuple1()} contains an opaque term as 2nd argument
+simple2_api.erl:125: The call erlang:tuple_to_list(B::simple1_adt:tuple1()) contains an opaque term as 1st argument when a structured term of type tuple() is expected
+simple2_api.erl:31: The call erlang:'!'(A::simple1_adt:d1(),'foo') contains an opaque term as 1st argument when terms of different types are expected in these positions
+simple2_api.erl:35: The call erlang:send(A::simple1_adt:d1(),'foo') contains an opaque term as 1st argument when terms of different types are expected in these positions
+simple2_api.erl:51: The call erlang:'<'(A::simple1_adt:d1(),3) contains an opaque term as 1st argument when terms of different types are expected in these positions
+simple2_api.erl:59: The call lists:keysearch(1,A::simple1_adt:d1(),[]) contains an opaque term as 2nd argument when terms of different types are expected in these positions
+simple2_api.erl:67: The call lists:keysearch('key',1,A::simple1_adt:tuple1()) contains an opaque term as 3rd argument when terms of different types are expected in these positions
+simple2_api.erl:96: The call lists:keyreplace('a',1,[{1, 2}],A::simple1_adt:tuple1()) contains an opaque term as 4th argument when terms of different types are expected in these positions
diff --git a/lib/dialyzer/test/opaque_SUITE_data/results/wings b/lib/dialyzer/test/opaque_SUITE_data/results/wings
index a9571441f8..0ca91ae331 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/results/wings
+++ b/lib/dialyzer/test/opaque_SUITE_data/results/wings
@@ -4,7 +4,7 @@ wings_dissolve.erl:19: Guard test is_list(Faces::gb_set()) breaks the opaqueness
wings_dissolve.erl:272: Guard test is_list(Faces::gb_set()) breaks the opaqueness of its argument
wings_dissolve.erl:31: The call gb_sets:is_empty(Faces::[any(),...]) does not have an opaque term of type gb_set() as 1st argument
wings_edge.erl:205: The pattern <Edge, 'hard', Htab> can never match the type <_,'soft',_>
-wings_edge_cmd.erl:30: The call gb_trees:size(P::gb_set()) contains an opaque term as 1st argument when an opaque term of type gb_tree() is expected
+wings_edge_cmd.erl:30: The call gb_trees:size(P::gb_set()) does not have an opaque term of type gb_tree() as 1st argument
wings_edge_cmd.erl:32: The pattern [_ | Parts] can never match the type []
wings_edge_cmd.erl:32: The pattern [{_, P} | _] can never match the type []
wings_io.erl:30: The attempt to match a term of type {'empty',queue()} against the pattern {'empty', {In, Out}} breaks the opaqueness of queue()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl b/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl
index d65af0af4e..4eb202f16a 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/ets/ets_use.erl
@@ -1,5 +1,5 @@
-module(ets_use).
--export([t1/0, t2/0]).
+-export([t1/0, t2/0, t3/0, t4/0]).
t1() ->
case n() of
@@ -13,4 +13,10 @@ t2() ->
T when is_atom(T) -> atm
end.
-n() -> ets:new(n, [named_table]).
+t3() ->
+ is_atom(n()). % no warning since atom() is possible
+
+t4() ->
+ is_integer(n()). % opaque warning since tid() is opaque
+
+n() -> ets:new(n, [named_table]). % -> atom() | tid()
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop2.erl b/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop2.erl
new file mode 100644
index 0000000000..659ccaf015
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/inf_loop2.erl
@@ -0,0 +1,175 @@
+%% -*- erlang-indent-level: 2 -*-
+%%----------------------------------------------------------------------------
+%% Copy of inf_loop1.erl, where the calls mentioned below have been
+%% restored.
+
+%% Non-sensical (i.e., stripped-down) program that sends the analysis
+%% into an infinite loop. The #we.es field was originally a gb_tree()
+%% but the programmer declared it as an array in order to change it to
+%% that data type instead. In the file, there are two calls to function
+%% gb_trees:get/2 which seem to be the ones responsible for sending the
+%% analysis into an infinite loop. Currently, these calls are marked and
+%% have been changed to gbee_trees:get/2 in order to be able to see that
+%% the analysis works if these two calls are taken out of the picture.
+%%----------------------------------------------------------------------------
+-module(inf_loop2).
+
+-export([command/1]).
+
+-record(we, {id,
+ es = array:new() :: array(),
+ vp,
+ mirror = none}).
+-record(edge, {vs,ve,a = none,b = none,lf,rf,ltpr,ltsu,rtpr,rtsu}).
+
+command(St) ->
+ State = drag_mode(offset_region),
+ SetupSt = wings_sel_conv:more(St),
+ Tvs = wings_sel:fold(fun(Faces, #we{id = Id} = We, Acc) ->
+ FaceRegions = wings_sel:face_regions(Faces, We),
+ {AllVs0,VsData} =
+ collect_offset_regions_data(FaceRegions, We, [], []),
+ AllVs = ordsets:from_list(AllVs0),
+ [{Id,{AllVs,offset_regions_fun(VsData, State)}}|Acc]
+ end,
+ [],
+ SetupSt),
+ wings_drag:setup(Tvs, 42, [], St).
+
+drag_mode(Type) ->
+ {Mode,Norm} = wings_pref:get_value(Type, {average,loop}),
+ {Type,Mode,Norm}.
+
+collect_offset_regions_data([Faces|Regions], We, AllVs, VsData) ->
+ {FaceNormTab,OuterEdges,RegVs} =
+ some_fake_module:faces_data_0(Faces, We, [], [], []),
+ {LoopNorm,LoopVsData,LoopVs} =
+ offset_regions_loop_data(OuterEdges, Faces, We, FaceNormTab),
+ Vs = RegVs -- LoopVs,
+ RegVsData = vertex_normals(Vs, FaceNormTab, We, LoopVsData),
+ collect_offset_regions_data(Regions, We, RegVs ++ AllVs,
+ [{LoopNorm,RegVsData}|VsData]);
+collect_offset_regions_data([], _, AllVs, VsData) ->
+ {AllVs,VsData}.
+
+offset_regions_loop_data(Edges, Faces, We, FNtab) ->
+ EdgeSet = gb_sets:from_list(Edges),
+ offset_loop_data_0(EdgeSet, Faces, We, FNtab, [], [], []).
+
+offset_loop_data_0(EdgeSet0, Faces, We, FNtab, LNorms, VData0, Vs0) ->
+ case gb_sets:is_empty(EdgeSet0) of
+ false ->
+ {Edge,EdgeSet1} = gb_sets:take_smallest(EdgeSet0),
+ {EdgeSet,VData,Links,LoopNorm,Vs} =
+ offset_loop_data_1(Edge, EdgeSet1, Faces, We, FNtab, VData0, Vs0),
+ offset_loop_data_0(EdgeSet, Faces, We, FNtab,
+ [{Links,LoopNorm}|LNorms], VData, Vs);
+ true ->
+ AvgLoopNorm = average_loop_norm(LNorms),
+ {AvgLoopNorm,VData0,Vs0}
+ end.
+
+offset_loop_data_1(Edge, EdgeSet, _Faces,
+ #we{es = Etab, vp = Vtab} = We, FNtab, VData, Vs) ->
+ #edge{vs = Va, ve = Vb, lf = Lf, ltsu = NextLeft} = gb_trees:get(Edge, Etab),
+ VposA = gb_trees:get(Va, Vtab),
+ VposB = gb_trees:get(Vb, Vtab),
+ VDir = e3d_vec:sub(VposB, VposA),
+ FNorm = wings_face:normal(Lf, We),
+ EdgeData = gb_trees:get(NextLeft, Etab),
+ offset_loop_data_2(NextLeft, EdgeData, Va, VposA, Lf, Edge, We, FNtab,
+ EdgeSet, VDir, [], [FNorm], VData, [], Vs, 0).
+
+offset_loop_data_2(CurE, #edge{vs = Va, ve = Vb, lf = PrevFace,
+ rtsu = NextEdge, ltsu = IfCurIsMember},
+ Vb, VposB, PrevFace, LastE,
+ #we{mirror = M} = We,
+ FNtab, EdgeSet0, VDir, EDir0, VNorms0, VData0, VPs0, Vs0,
+ Links) ->
+ Mirror = M == PrevFace,
+ offset_loop_is_member(Mirror, Vb, Va, VposB, CurE, IfCurIsMember, VNorms0,
+ NextEdge, EdgeSet0, VDir, EDir0, FNtab, PrevFace,
+ LastE, We, VData0, VPs0, Vs0, Links).
+
+offset_loop_is_member(Mirror, V1, V2, Vpos1, CurE, NextE, VNorms0, NEdge,
+ EdgeSet0, VDir, EDir0, FNtab, PFace, LastE, We,
+ VData0, VPs0, Vs0, Links) ->
+ #we{es = Etab, vp = Vtab} = We,
+ Vpos2 = gb_trees:get(V2, Vtab),
+ Dir = e3d_vec:sub(Vpos2, Vpos1),
+ NextVDir = e3d_vec:neg(Dir),
+ EdgeSet = gb_sets:delete(CurE, EdgeSet0),
+ EdgeData = gb_trees:get(NextE, Etab), %% HERE
+ [FNorm|_] = VNorms0,
+ VData = offset_loop_data_3(Mirror, V1, Vpos1, VNorms0, NEdge, VDir,
+ Dir, EDir0, FNtab, We, VData0),
+ VPs = [Vpos1|VPs0],
+ Vs = [V1|Vs0],
+ offset_loop_data_2(NextE, EdgeData, V2, Vpos2, PFace, LastE, We, FNtab,
+ EdgeSet, NextVDir, [], [FNorm], VData, VPs, Vs, Links + 1).
+
+offset_loop_data_3(false, V, Vpos, VNorms0, NextEdge,
+ VDir, Dir, EDir0, FNtab, We, VData0) ->
+ #we{es = Etab} = We,
+ VNorm = e3d_vec:norm(e3d_vec:add(VNorms0)),
+ NV = wings_vertex:other(V, gb_trees:get(NextEdge, Etab)), %% HERE
+ ANorm = vertex_normal(NV, FNtab, We),
+ EDir = some_fake_module:average_edge_dir(VNorm, VDir, Dir, EDir0),
+ AvgDir = some_fake_module:evaluate_vdata(VDir, Dir, VNorm),
+ ScaledDir = some_fake_module:along_edge_scale_factor(VDir, Dir, EDir, ANorm),
+ [{V,{Vpos,AvgDir,EDir,ScaledDir}}|VData0].
+
+average_loop_norm([{_,LNorms}]) ->
+ e3d_vec:norm(LNorms);
+average_loop_norm([{LinksA,LNormA},{LinksB,LNormB}]) ->
+ case LinksA < LinksB of
+ true ->
+ e3d_vec:norm(e3d_vec:add(e3d_vec:neg(LNormA), LNormB));
+ false ->
+ e3d_vec:norm(e3d_vec:add(e3d_vec:neg(LNormB), LNormA))
+ end;
+average_loop_norm(LNorms) ->
+ LoopNorms = [Norm || {_,Norm} <- LNorms],
+ e3d_vec:norm(e3d_vec:neg(e3d_vec:add(LoopNorms))).
+
+vertex_normals([V|Vs], FaceNormTab, #we{vp = Vtab, mirror = M} = We, Acc) ->
+ FaceNorms =
+ wings_vertex:fold(fun(_, Face, _, A) when Face == M ->
+ [e3d_vec:neg(wings_face:normal(M, We))|A];
+ (_, Face, _, A) ->
+ [gb_trees:get(Face, FaceNormTab)|A]
+ end, [], V, We),
+ VNorm = e3d_vec:norm(e3d_vec:add(FaceNorms)),
+ Vpos = gb_trees:get(V, Vtab),
+ vertex_normals(Vs, FaceNormTab, We, [{V,{Vpos,VNorm}}|Acc]);
+vertex_normals([], _, _, Acc) ->
+ Acc.
+
+vertex_normal(V, FaceNormTab, #we{mirror = M} = We) ->
+ wings_vertex:fold(fun(_, Face, _, A) when Face == M ->
+ [e3d_vec:neg(wings_face:normal(Face, We))|A];
+ (_, Face, _, A) ->
+ N = gb_trees:get(Face, FaceNormTab),
+ case e3d_vec:is_zero(N) of
+ true -> A;
+ false -> [N|A]
+ end
+ end, [], V, We).
+
+offset_regions_fun(OffsetData, {_,Solution,_} = State) ->
+ fun(new_mode_data, {NewState,_}) ->
+ offset_regions_fun(OffsetData, NewState);
+ ([Dist,_,_,Bump|_], A) ->
+ lists:foldl(fun({LoopNormal,VsData}, VsAcc0) ->
+ lists:foldl(fun({V,{Vpos0,VNorm}}, VsAcc) ->
+ [{V,Vpos0}|VsAcc];
+ ({V,{Vpos0,Dir,EDir,ScaledEDir}}, VsAcc) ->
+ Vec = case Solution of
+ average -> Dir;
+ along_edges -> EDir;
+ scaled -> ScaledEDir
+ end,
+ [{V,Vpos0}|VsAcc]
+ end, VsAcc0, VsData)
+ end, A, OffsetData)
+ end.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_digraph.erl b/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_digraph.erl
new file mode 100644
index 0000000000..09d4229e28
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_digraph.erl
@@ -0,0 +1,655 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2014. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+
+%%% The Erlang scanner. All types are opaque, which puts some stress
+%%% on Dialyzer.
+
+-module(opaque_digraph).
+
+-export([new/0, new/1, delete/1, info/1]).
+
+-export([add_vertex/1, add_vertex/2, add_vertex/3]).
+-export([del_vertex/2, del_vertices/2]).
+-export([vertex/2, no_vertices/1, vertices/1]).
+-export([source_vertices/1, sink_vertices/1]).
+
+-export([add_edge/3, add_edge/4, add_edge/5]).
+-export([del_edge/2, del_edges/2, del_path/3]).
+-export([edge/2, no_edges/1, edges/1]).
+
+-export([out_neighbours/2, in_neighbours/2]).
+-export([out_edges/2, in_edges/2, edges/2]).
+-export([out_degree/2, in_degree/2]).
+-export([get_path/3, get_cycle/2]).
+
+-export([get_short_path/3, get_short_cycle/2]).
+
+-export_type([local_digraph/0, d_type/0, vertex/0]).
+
+-record(digraph, {vtab = notable :: ets:tab(),
+ etab = notable :: ets:tab(),
+ ntab = notable :: ets:tab(),
+ cyclic = true :: boolean()}).
+
+-opaque local_digraph() :: #digraph{}.
+
+-export_type([edge/0, label/0, add_edge_err_rsn/0,
+ d_protection/0, d_cyclicity/0]).
+
+-opaque edge() :: term().
+-opaque label() :: term().
+-opaque vertex() :: term().
+
+-opaque add_edge_err_rsn() :: {'bad_edge', Path :: [vertex()]}
+ | {'bad_vertex', V :: vertex()}.
+
+%%
+%% Type is a list of
+%% protected | private
+%% acyclic | cyclic
+%%
+%% default is [cyclic,protected]
+%%
+-opaque d_protection() :: 'private' | 'protected'.
+-opaque d_cyclicity() :: 'acyclic' | 'cyclic'.
+-opaque d_type() :: d_cyclicity() | d_protection().
+
+-spec new() -> local_digraph().
+
+new() -> new([]).
+
+-spec new(Type) -> local_digraph() when
+ Type :: [d_type()].
+
+new(Type) ->
+ case check_type(Type, protected, []) of
+ {Access, Ts} ->
+ V = ets:new(vertices, [set, Access]),
+ E = ets:new(edges, [set, Access]),
+ N = ets:new(neighbours, [bag, Access]),
+ ets:insert(N, [{'$vid', 0}, {'$eid', 0}]),
+ set_type(Ts, #digraph{vtab=V, etab=E, ntab=N});
+ error ->
+ erlang:error(badarg)
+ end.
+
+%%
+%% Check type of graph
+%%
+%-spec check_type([d_type()], d_protection(), [{'cyclic', boolean()}]) ->
+% {d_protection(), [{'cyclic', boolean()}]}.
+
+check_type([acyclic|Ts], A, L) ->
+ check_type(Ts, A,[{cyclic,false} | L]);
+check_type([cyclic | Ts], A, L) ->
+ check_type(Ts, A, [{cyclic,true} | L]);
+check_type([protected | Ts], _, L) ->
+ check_type(Ts, protected, L);
+check_type([private | Ts], _, L) ->
+ check_type(Ts, private, L);
+check_type([], A, L) -> {A, L};
+check_type(_, _, _) -> error.
+
+%%
+%% Set graph type
+%%
+-spec set_type([{'cyclic', boolean()}], local_digraph()) -> local_digraph().
+
+set_type([{cyclic,V} | Ks], G) ->
+ set_type(Ks, G#digraph{cyclic = V});
+set_type([], G) -> G.
+
+
+%% Data access functions
+
+-spec delete(G) -> 'true' when
+ G :: local_digraph().
+
+delete(G) ->
+ ets:delete(G#digraph.vtab),
+ ets:delete(G#digraph.etab),
+ ets:delete(G#digraph.ntab).
+
+-spec info(G) -> InfoList when
+ G :: local_digraph(),
+ InfoList :: [{'cyclicity', Cyclicity :: d_cyclicity()} |
+ {'memory', NoWords :: non_neg_integer()} |
+ {'protection', Protection :: d_protection()}].
+
+info(G) ->
+ VT = G#digraph.vtab,
+ ET = G#digraph.etab,
+ NT = G#digraph.ntab,
+ Cyclicity = case G#digraph.cyclic of
+ true -> cyclic;
+ false -> acyclic
+ end,
+ Protection = ets:info(VT, protection),
+ Memory = ets:info(VT, memory) + ets:info(ET, memory) + ets:info(NT, memory),
+ [{cyclicity, Cyclicity}, {memory, Memory}, {protection, Protection}].
+
+-spec add_vertex(G) -> vertex() when
+ G :: local_digraph().
+
+add_vertex(G) ->
+ do_add_vertex({new_vertex_id(G), []}, G).
+
+-spec add_vertex(G, V) -> vertex() when
+ G :: local_digraph(),
+ V :: vertex().
+
+add_vertex(G, V) ->
+ do_add_vertex({V, []}, G).
+
+-spec add_vertex(G, V, Label) -> vertex() when
+ G :: local_digraph(),
+ V :: vertex(),
+ Label :: label().
+
+add_vertex(G, V, D) ->
+ do_add_vertex({V, D}, G).
+
+-spec del_vertex(G, V) -> 'true' when
+ G :: local_digraph(),
+ V :: vertex().
+
+del_vertex(G, V) ->
+ do_del_vertex(V, G).
+
+-spec del_vertices(G, Vertices) -> 'true' when
+ G :: local_digraph(),
+ Vertices :: [vertex()].
+
+del_vertices(G, Vs) ->
+ do_del_vertices(Vs, G).
+
+-spec vertex(G, V) -> {V, Label} | 'false' when
+ G :: local_digraph(),
+ V :: vertex(),
+ Label :: label().
+
+vertex(G, V) ->
+ case ets:lookup(G#digraph.vtab, V) of
+ [] -> false;
+ [Vertex] -> Vertex
+ end.
+
+-spec no_vertices(G) -> non_neg_integer() when
+ G :: local_digraph().
+
+no_vertices(G) ->
+ ets:info(G#digraph.vtab, size).
+
+-spec vertices(G) -> Vertices when
+ G :: local_digraph(),
+ Vertices :: [vertex()].
+
+vertices(G) ->
+ ets:select(G#digraph.vtab, [{{'$1', '_'}, [], ['$1']}]).
+
+-spec source_vertices(local_digraph()) -> [vertex()].
+
+source_vertices(G) ->
+ collect_vertices(G, in).
+
+-spec sink_vertices(local_digraph()) -> [vertex()].
+
+sink_vertices(G) ->
+ collect_vertices(G, out).
+
+-spec in_degree(G, V) -> non_neg_integer() when
+ G :: local_digraph(),
+ V :: vertex().
+
+in_degree(G, V) ->
+ length(ets:lookup(G#digraph.ntab, {in, V})).
+
+-spec in_neighbours(G, V) -> Vertex when
+ G :: local_digraph(),
+ V :: vertex(),
+ Vertex :: [vertex()].
+
+in_neighbours(G, V) ->
+ ET = G#digraph.etab,
+ NT = G#digraph.ntab,
+ collect_elems(ets:lookup(NT, {in, V}), ET, 2).
+
+-spec in_edges(G, V) -> Edges when
+ G :: local_digraph(),
+ V :: vertex(),
+ Edges :: [edge()].
+
+in_edges(G, V) ->
+ ets:select(G#digraph.ntab, [{{{in, V}, '$1'}, [], ['$1']}]).
+
+-spec out_degree(G, V) -> non_neg_integer() when
+ G :: local_digraph(),
+ V :: vertex().
+
+out_degree(G, V) ->
+ length(ets:lookup(G#digraph.ntab, {out, V})).
+
+-spec out_neighbours(G, V) -> Vertices when
+ G :: local_digraph(),
+ V :: vertex(),
+ Vertices :: [vertex()].
+
+out_neighbours(G, V) ->
+ ET = G#digraph.etab,
+ NT = G#digraph.ntab,
+ collect_elems(ets:lookup(NT, {out, V}), ET, 3).
+
+-spec out_edges(G, V) -> Edges when
+ G :: local_digraph(),
+ V :: vertex(),
+ Edges :: [edge()].
+
+out_edges(G, V) ->
+ ets:select(G#digraph.ntab, [{{{out, V}, '$1'}, [], ['$1']}]).
+
+-spec add_edge(G, V1, V2) -> edge() | {'error', add_edge_err_rsn()} when
+ G :: local_digraph(),
+ V1 :: vertex(),
+ V2 :: vertex().
+
+add_edge(G, V1, V2) ->
+ do_add_edge({new_edge_id(G), V1, V2, []}, G).
+
+-spec add_edge(G, V1, V2, Label) -> edge() | {'error', add_edge_err_rsn()} when
+ G :: local_digraph(),
+ V1 :: vertex(),
+ V2 :: vertex(),
+ Label :: label().
+
+add_edge(G, V1, V2, D) ->
+ do_add_edge({new_edge_id(G), V1, V2, D}, G).
+
+-spec add_edge(G, E, V1, V2, Label) -> edge() | {'error', add_edge_err_rsn()} when
+ G :: local_digraph(),
+ E :: edge(),
+ V1 :: vertex(),
+ V2 :: vertex(),
+ Label :: label().
+
+add_edge(G, E, V1, V2, D) ->
+ do_add_edge({E, V1, V2, D}, G).
+
+-spec del_edge(G, E) -> 'true' when
+ G :: local_digraph(),
+ E :: edge().
+
+del_edge(G, E) ->
+ do_del_edges([E], G).
+
+-spec del_edges(G, Edges) -> 'true' when
+ G :: local_digraph(),
+ Edges :: [edge()].
+
+del_edges(G, Es) ->
+ do_del_edges(Es, G).
+
+-spec no_edges(G) -> non_neg_integer() when
+ G :: local_digraph().
+
+no_edges(G) ->
+ ets:info(G#digraph.etab, size).
+
+-spec edges(G) -> Edges when
+ G :: local_digraph(),
+ Edges :: [edge()].
+
+edges(G) ->
+ ets:select(G#digraph.etab, [{{'$1', '_', '_', '_'}, [], ['$1']}]).
+
+-spec edges(G, V) -> Edges when
+ G :: local_digraph(),
+ V :: vertex(),
+ Edges :: [edge()].
+
+edges(G, V) ->
+ ets:select(G#digraph.ntab, [{{{out, V},'$1'}, [], ['$1']},
+ {{{in, V}, '$1'}, [], ['$1']}]).
+
+-spec edge(G, E) -> {E, V1, V2, Label} | 'false' when
+ G :: local_digraph(),
+ E :: edge(),
+ V1 :: vertex(),
+ V2 :: vertex(),
+ Label :: label().
+
+edge(G, E) ->
+ case ets:lookup(G#digraph.etab,E) of
+ [] -> false;
+ [Edge] -> Edge
+ end.
+
+%%
+%% Generate a "unique" edge identifier (relative to this graph)
+%%
+-spec new_edge_id(local_digraph()) -> edge().
+
+new_edge_id(G) ->
+ NT = G#digraph.ntab,
+ [{'$eid', K}] = ets:lookup(NT, '$eid'),
+ true = ets:delete(NT, '$eid'),
+ true = ets:insert(NT, {'$eid', K+1}),
+ ['$e' | K].
+
+%%
+%% Generate a "unique" vertex identifier (relative to this graph)
+%%
+-spec new_vertex_id(local_digraph()) -> vertex().
+
+new_vertex_id(G) ->
+ NT = G#digraph.ntab,
+ [{'$vid', K}] = ets:lookup(NT, '$vid'),
+ true = ets:delete(NT, '$vid'),
+ true = ets:insert(NT, {'$vid', K+1}),
+ ['$v' | K].
+
+%%
+%% Collect elements for a index in a tuple
+%%
+collect_elems(Keys, Table, Index) ->
+ collect_elems(Keys, Table, Index, []).
+
+collect_elems([{_,Key}|Keys], Table, Index, Acc) ->
+ collect_elems(Keys, Table, Index,
+ [ets:lookup_element(Table, Key, Index)|Acc]);
+collect_elems([], _, _, Acc) -> Acc.
+
+-spec do_add_vertex({vertex(), label()}, local_digraph()) -> vertex().
+
+do_add_vertex({V, _Label} = VL, G) ->
+ ets:insert(G#digraph.vtab, VL),
+ V.
+
+%%
+%% Collect either source or sink vertices.
+%%
+collect_vertices(G, Type) ->
+ Vs = vertices(G),
+ lists:foldl(fun(V, A) ->
+ case ets:member(G#digraph.ntab, {Type, V}) of
+ true -> A;
+ false -> [V|A]
+ end
+ end, [], Vs).
+
+%%
+%% Delete vertices
+%%
+do_del_vertices([V | Vs], G) ->
+ do_del_vertex(V, G),
+ do_del_vertices(Vs, G);
+do_del_vertices([], #digraph{}) -> true.
+
+do_del_vertex(V, G) ->
+ do_del_nedges(ets:lookup(G#digraph.ntab, {in, V}), G),
+ do_del_nedges(ets:lookup(G#digraph.ntab, {out, V}), G),
+ ets:delete(G#digraph.vtab, V).
+
+do_del_nedges([{_, E}|Ns], G) ->
+ case ets:lookup(G#digraph.etab, E) of
+ [{E, V1, V2, _}] ->
+ do_del_edge(E, V1, V2, G),
+ do_del_nedges(Ns, G);
+ [] -> % cannot happen
+ do_del_nedges(Ns, G)
+ end;
+do_del_nedges([], #digraph{}) -> true.
+
+%%
+%% Delete edges
+%%
+do_del_edges([E|Es], G) ->
+ case ets:lookup(G#digraph.etab, E) of
+ [{E,V1,V2,_}] ->
+ do_del_edge(E,V1,V2,G),
+ do_del_edges(Es, G);
+ [] ->
+ do_del_edges(Es, G)
+ end;
+do_del_edges([], #digraph{}) -> true.
+
+do_del_edge(E, V1, V2, G) ->
+ ets:select_delete(G#digraph.ntab, [{{{in, V2}, E}, [], [true]},
+ {{{out,V1}, E}, [], [true]}]),
+ ets:delete(G#digraph.etab, E).
+
+-spec rm_edges([vertex(),...], local_digraph()) -> 'true'.
+
+rm_edges([V1, V2|Vs], G) ->
+ rm_edge(V1, V2, G),
+ rm_edges([V2|Vs], G);
+rm_edges(_, _) -> true.
+
+-spec rm_edge(vertex(), vertex(), local_digraph()) -> 'ok'.
+
+rm_edge(V1, V2, G) ->
+ Es = out_edges(G, V1),
+ rm_edge_0(Es, V1, V2, G).
+
+rm_edge_0([E|Es], V1, V2, G) ->
+ case ets:lookup(G#digraph.etab, E) of
+ [{E, V1, V2, _}] ->
+ do_del_edge(E, V1, V2, G),
+ rm_edge_0(Es, V1, V2, G);
+ _ ->
+ rm_edge_0(Es, V1, V2, G)
+ end;
+rm_edge_0([], _, _, #digraph{}) -> ok.
+
+%%
+%% Check that endpoints exist
+%%
+-spec do_add_edge({edge(), vertex(), vertex(), label()}, local_digraph()) ->
+ edge() | {'error', add_edge_err_rsn()}.
+
+do_add_edge({E, V1, V2, Label}, G) ->
+ case ets:member(G#digraph.vtab, V1) of
+ false -> {error, {bad_vertex, V1}};
+ true ->
+ case ets:member(G#digraph.vtab, V2) of
+ false -> {error, {bad_vertex, V2}};
+ true ->
+ case other_edge_exists(G, E, V1, V2) of
+ true -> {error, {bad_edge, [V1, V2]}};
+ false when G#digraph.cyclic =:= false ->
+ acyclic_add_edge(E, V1, V2, Label, G);
+ false ->
+ do_insert_edge(E, V1, V2, Label, G)
+ end
+ end
+ end.
+
+other_edge_exists(#digraph{etab = ET}, E, V1, V2) ->
+ case ets:lookup(ET, E) of
+ [{E, Vert1, Vert2, _}] when Vert1 =/= V1; Vert2 =/= V2 ->
+ true;
+ _ ->
+ false
+ end.
+
+-spec do_insert_edge(edge(), vertex(), vertex(), label(), local_digraph()) -> edge().
+
+do_insert_edge(E, V1, V2, Label, #digraph{ntab=NT, etab=ET}) ->
+ ets:insert(NT, [{{out, V1}, E}, {{in, V2}, E}]),
+ ets:insert(ET, {E, V1, V2, Label}),
+ E.
+
+-spec acyclic_add_edge(edge(), vertex(), vertex(), label(), local_digraph()) ->
+ edge() | {'error', {'bad_edge', [vertex()]}}.
+
+acyclic_add_edge(_E, V1, V2, _L, _G) when V1 =:= V2 ->
+ {error, {bad_edge, [V1, V2]}};
+acyclic_add_edge(E, V1, V2, Label, G) ->
+ case get_path(G, V2, V1) of
+ false -> do_insert_edge(E, V1, V2, Label, G);
+ Path -> {error, {bad_edge, Path}}
+ end.
+
+%%
+%% Delete all paths from vertex V1 to vertex V2
+%%
+
+-spec del_path(G, V1, V2) -> 'true' when
+ G :: local_digraph(),
+ V1 :: vertex(),
+ V2 :: vertex().
+
+del_path(G, V1, V2) ->
+ case get_path(G, V1, V2) of
+ false -> true;
+ Path ->
+ rm_edges(Path, G),
+ del_path(G, V1, V2)
+ end.
+
+%%
+%% Find a cycle through V
+%% return the cycle as list of vertices [V ... V]
+%% if no cycle exists false is returned
+%% if only a cycle of length one exists it will be
+%% returned as [V] but only after longer cycles have
+%% been searched.
+%%
+
+-spec get_cycle(G, V) -> Vertices | 'false' when
+ G :: local_digraph(),
+ V :: vertex(),
+ Vertices :: [vertex(),...].
+
+get_cycle(G, V) ->
+ case one_path(out_neighbours(G, V), V, [], [V], [V], 2, G, 1) of
+ false ->
+ case lists:member(V, out_neighbours(G, V)) of
+ true -> [V];
+ false -> false
+ end;
+ Vs -> Vs
+ end.
+
+%%
+%% Find a path from V1 to V2
+%% return the path as list of vertices [V1 ... V2]
+%% if no path exists false is returned
+%%
+
+-spec get_path(G, V1, V2) -> Vertices | 'false' when
+ G :: local_digraph(),
+ V1 :: vertex(),
+ V2 :: vertex(),
+ Vertices :: [vertex(),...].
+
+get_path(G, V1, V2) ->
+ one_path(out_neighbours(G, V1), V2, [], [V1], [V1], 1, G, 1).
+
+%%
+%% prune_short_path (evaluate conditions on path)
+%% short : if path is too short
+%% ok : if path is ok
+%%
+prune_short_path(Counter, Min) when Counter < Min ->
+ short;
+prune_short_path(_Counter, _Min) ->
+ ok.
+
+one_path([W|Ws], W, Cont, Xs, Ps, Prune, G, Counter) ->
+ case prune_short_path(Counter, Prune) of
+ short -> one_path(Ws, W, Cont, Xs, Ps, Prune, G, Counter);
+ ok -> lists:reverse([W|Ps])
+ end;
+one_path([V|Vs], W, Cont, Xs, Ps, Prune, G, Counter) ->
+ case lists:member(V, Xs) of
+ true -> one_path(Vs, W, Cont, Xs, Ps, Prune, G, Counter);
+ false -> one_path(out_neighbours(G, V), W,
+ [{Vs,Ps} | Cont], [V|Xs], [V|Ps],
+ Prune, G, Counter+1)
+ end;
+one_path([], W, [{Vs,Ps}|Cont], Xs, _, Prune, G, Counter) ->
+ one_path(Vs, W, Cont, Xs, Ps, Prune, G, Counter-1);
+one_path([], _, [], _, _, _, _, _Counter) -> false.
+
+%%
+%% Like get_cycle/2, but a cycle of length one is preferred.
+%%
+
+-spec get_short_cycle(G, V) -> Vertices | 'false' when
+ G :: local_digraph(),
+ V :: vertex(),
+ Vertices :: [vertex(),...].
+
+get_short_cycle(G, V) ->
+ get_short_path(G, V, V).
+
+%%
+%% Like get_path/3, but using a breadth-first search makes it possible
+%% to find a short path.
+%%
+
+-spec get_short_path(G, V1, V2) -> Vertices | 'false' when
+ G :: local_digraph(),
+ V1 :: vertex(),
+ V2 :: vertex(),
+ Vertices :: [vertex(),...].
+
+get_short_path(G, V1, V2) ->
+ T = new(),
+ add_vertex(T, V1),
+ Q = queue:new(),
+ Q1 = queue_out_neighbours(V1, G, Q),
+ L = spath(Q1, G, V2, T),
+ delete(T),
+ L.
+
+spath(Q, G, Sink, T) ->
+ case queue:out(Q) of
+ {{value, E}, Q1} ->
+ {_E, V1, V2, _Label} = edge(G, E),
+ if
+ Sink =:= V2 ->
+ follow_path(V1, T, [V2]);
+ true ->
+ case vertex(T, V2) of
+ false ->
+ add_vertex(T, V2),
+ add_edge(T, V2, V1),
+ NQ = queue_out_neighbours(V2, G, Q1),
+ spath(NQ, G, Sink, T);
+ _V ->
+ spath(Q1, G, Sink, T)
+ end
+ end;
+ {empty, _Q1} ->
+ false
+ end.
+
+follow_path(V, T, P) ->
+ P1 = [V | P],
+ case out_neighbours(T, V) of
+ [N] ->
+ follow_path(N, T, P1);
+ [] ->
+ P1
+ end.
+
+queue_out_neighbours(V, G, Q0) ->
+ lists:foldl(fun(E, Q) -> queue:in(E, Q) end, Q0, out_edges(G, V)).
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_erl_scan.erl b/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_erl_scan.erl
new file mode 100644
index 0000000000..9ecd4f92a1
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/modules/opaque_erl_scan.erl
@@ -0,0 +1,1300 @@
+%% -*- coding: utf-8 -*-
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 1996-2014. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+
+%%% The Erlang scanner. All types are opaque, which puts some stress
+%%% on Dialyzer.
+
+-module(opaque_erl_scan).
+
+%%% External exports
+
+-export([string/1,string/2,string/3,tokens/3,tokens/4,
+ format_error/1,reserved_word/1,
+ token_info/1,token_info/2,
+ attributes_info/1,attributes_info/2,set_attribute/3]).
+
+%%% Private
+-export([continuation_location/1]).
+
+-export_type([error_info/0,
+ line/0,
+ location/0,
+ options/0,
+ return_cont/0,
+ token/0,
+ tokens_result/0]).
+
+%%%
+%%% Defines and type definitions
+%%%
+
+-define(COLUMN(C), (is_integer(C) andalso C >= 1)).
+%% Line numbers less than zero have always been allowed:
+-define(ALINE(L), is_integer(L)).
+-define(STRING(S), is_list(S)).
+-define(RESWORDFUN(F), is_function(F, 1)).
+-define(SETATTRFUN(F), is_function(F, 1)).
+
+-export_type([category/0, column/0, resword_fun/0, option/0, symbol/0,
+ info_line/0, attributes_data/0, attributes/0, tokens/0,
+ error_description/0, char_spec/0, cont_fun/0,
+ attribute_item/0, info_location/0, attribute_info/0,
+ token_item/0, token_info/0]).
+
+-opaque category() :: atom().
+-opaque column() :: pos_integer().
+-opaque line() :: integer().
+-opaque location() :: line() | {line(),column()}.
+-opaque resword_fun() :: fun((atom()) -> boolean()).
+-opaque option() :: 'return' | 'return_white_spaces' | 'return_comments'
+ | 'text' | {'reserved_word_fun', resword_fun()}.
+-opaque options() :: option() | [option()].
+-opaque symbol() :: atom() | float() | integer() | string().
+-opaque info_line() :: integer() | term().
+-opaque attributes_data()
+ :: [{'column', column()} | {'line', info_line()} | {'text', string()}]
+ | {line(), column()}.
+%% The fact that {line(),column()} is a possible attributes() type
+%% is hidden.
+-opaque attributes() :: line() | attributes_data().
+-opaque token() :: {category(), attributes(), symbol()}
+ | {category(), attributes()}.
+-opaque tokens() :: [token()].
+-opaque error_description() :: term().
+-opaque error_info() :: {location(), module(), error_description()}.
+
+%%% Local record.
+-record(erl_scan,
+ {resword_fun = fun reserved_word/1 :: resword_fun(),
+ ws = false :: boolean(),
+ comment = false :: boolean(),
+ text = false :: boolean()}).
+
+%%----------------------------------------------------------------------------
+
+-spec format_error(ErrorDescriptor) -> string() when
+ ErrorDescriptor :: error_description().
+format_error({string,Quote,Head}) ->
+ lists:flatten(["unterminated " ++ string_thing(Quote) ++
+ " starting with " ++
+ io_lib:write_string(Head, Quote)]);
+format_error({illegal,Type}) ->
+ lists:flatten(io_lib:fwrite("illegal ~w", [Type]));
+format_error(char) -> "unterminated character";
+format_error({base,Base}) ->
+ lists:flatten(io_lib:fwrite("illegal base '~w'", [Base]));
+format_error(Other) ->
+ lists:flatten(io_lib:write(Other)).
+
+-spec string(String) -> Return when
+ String :: string(),
+ Return :: {'ok', Tokens :: tokens(), EndLocation}
+ | {'error', ErrorInfo :: error_info(), ErrorLocation},
+ EndLocation :: location(),
+ ErrorLocation :: location().
+string(String) ->
+ string(String, 1, []).
+
+-spec string(String, StartLocation) -> Return when
+ String :: string(),
+ Return :: {'ok', Tokens :: tokens(), EndLocation}
+ | {'error', ErrorInfo :: error_info(), ErrorLocation},
+ StartLocation :: location(),
+ EndLocation :: location(),
+ ErrorLocation :: location().
+string(String, StartLocation) ->
+ string(String, StartLocation, []).
+
+-spec string(String, StartLocation, Options) -> Return when
+ String :: string(),
+ Options :: options(),
+ Return :: {'ok', Tokens :: tokens(), EndLocation}
+ | {'error', ErrorInfo :: error_info(), ErrorLocation},
+ StartLocation :: location(),
+ EndLocation :: location(),
+ ErrorLocation :: location().
+string(String, Line, Options) when ?STRING(String), ?ALINE(Line) ->
+ string1(String, options(Options), Line, no_col, []);
+string(String, {Line,Column}, Options) when ?STRING(String),
+ ?ALINE(Line),
+ ?COLUMN(Column) ->
+ string1(String, options(Options), Line, Column, []).
+
+-opaque char_spec() :: string() | 'eof'.
+-opaque cont_fun() :: fun((char_spec(), #erl_scan{}, line(), column(),
+ tokens(), any()) -> any()).
+-opaque return_cont() :: {erl_scan_continuation,
+ string(), column(), tokens(), line(),
+ #erl_scan{}, any(), cont_fun()}.
+-opaque tokens_result() :: {'ok', Tokens :: tokens(), EndLocation :: location()}
+ | {'eof', EndLocation :: location()}
+ | {'error', ErrorInfo :: error_info(),
+ EndLocation :: location()}.
+
+-spec tokens(Continuation, CharSpec, StartLocation) -> Return when
+ Continuation :: return_cont() | [],
+ CharSpec :: char_spec(),
+ StartLocation :: location(),
+ Return :: {'done',Result :: tokens_result(),LeftOverChars :: char_spec()}
+ | {'more', Continuation1 :: return_cont()}.
+tokens(Cont, CharSpec, StartLocation) ->
+ tokens(Cont, CharSpec, StartLocation, []).
+
+-spec tokens(Continuation, CharSpec, StartLocation, Options) -> Return when
+ Continuation :: return_cont() | [],
+ CharSpec :: char_spec(),
+ StartLocation :: location(),
+ Options :: options(),
+ Return :: {'done',Result :: tokens_result(),LeftOverChars :: char_spec()}
+ | {'more', Continuation1 :: return_cont()}.
+tokens([], CharSpec, Line, Options) when ?ALINE(Line) ->
+ tokens1(CharSpec, options(Options), Line, no_col, [], fun scan/6, []);
+tokens([], CharSpec, {Line,Column}, Options) when ?ALINE(Line),
+ ?COLUMN(Column) ->
+ tokens1(CharSpec, options(Options), Line, Column, [], fun scan/6, []);
+tokens({erl_scan_continuation,Cs,Col,Toks,Line,St,Any,Fun},
+ CharSpec, _Loc, _Opts) ->
+ tokens1(Cs++CharSpec, St, Line, Col, Toks, Fun, Any).
+
+continuation_location({erl_scan_continuation,_,no_col,_,Line,_,_,_}) ->
+ Line;
+continuation_location({erl_scan_continuation,_,Col,_,Line,_,_,_}) ->
+ {Line,Col}.
+
+-opaque attribute_item() :: 'column' | 'length' | 'line'
+ | 'location' | 'text'.
+-opaque info_location() :: location() | term().
+-opaque attribute_info() :: {'column', column()}| {'length', pos_integer()}
+ | {'line', info_line()}
+ | {'location', info_location()}
+ | {'text', string()}.
+-opaque token_item() :: 'category' | 'symbol' | attribute_item().
+-opaque token_info() :: {'category', category()} | {'symbol', symbol()}
+ | attribute_info().
+
+-spec token_info(Token) -> TokenInfo when
+ Token :: token(),
+ TokenInfo :: [TokenInfoTuple :: token_info()].
+token_info(Token) ->
+ Items = [category,column,length,line,symbol,text], % undefined order
+ token_info(Token, Items).
+
+-spec token_info(Token, TokenItem) -> TokenInfoTuple | 'undefined' when
+ Token :: token(),
+ TokenItem :: token_item(),
+ TokenInfoTuple :: token_info();
+ (Token, TokenItems) -> TokenInfo when
+ Token :: token(),
+ TokenItems :: [TokenItem :: token_item()],
+ TokenInfo :: [TokenInfoTuple :: token_info()].
+token_info(_Token, []) ->
+ [];
+token_info(Token, [Item|Items]) when is_atom(Item) ->
+ case token_info(Token, Item) of
+ undefined ->
+ token_info(Token, Items);
+ TokenInfo when is_tuple(TokenInfo) ->
+ [TokenInfo|token_info(Token, Items)]
+ end;
+token_info({Category,_Attrs}, category=Item) ->
+ {Item,Category};
+token_info({Category,_Attrs,_Symbol}, category=Item) ->
+ {Item,Category};
+token_info({Category,_Attrs}, symbol=Item) ->
+ {Item,Category};
+token_info({_Category,_Attrs,Symbol}, symbol=Item) ->
+ {Item,Symbol};
+token_info({_Category,Attrs}, Item) ->
+ attributes_info(Attrs, Item);
+token_info({_Category,Attrs,_Symbol}, Item) ->
+ attributes_info(Attrs, Item).
+
+-spec attributes_info(Attributes) -> AttributesInfo when
+ Attributes :: attributes(),
+ AttributesInfo :: [AttributeInfoTuple :: attribute_info()].
+attributes_info(Attributes) ->
+ Items = [column,length,line,text], % undefined order
+ attributes_info(Attributes, Items).
+
+-spec attributes_info
+ (Attributes, AttributeItem) -> AttributeInfoTuple | 'undefined' when
+ Attributes :: attributes(),
+ AttributeItem :: attribute_item(),
+ AttributeInfoTuple :: attribute_info();
+ (Attributes, AttributeItems) -> AttributeInfo when
+ Attributes :: attributes(),
+ AttributeItems :: [AttributeItem :: attribute_item()],
+ AttributeInfo :: [AttributeInfoTuple :: attribute_info()].
+attributes_info(_Attrs, []) ->
+ [];
+attributes_info(Attrs, [A|As]) when is_atom(A) ->
+ case attributes_info(Attrs, A) of
+ undefined ->
+ attributes_info(Attrs, As);
+ AttributeInfo when is_tuple(AttributeInfo) ->
+ [AttributeInfo|attributes_info(Attrs, As)]
+ end;
+attributes_info({Line,Column}, column=Item) when ?ALINE(Line),
+ ?COLUMN(Column) ->
+ {Item,Column};
+attributes_info(Line, column) when ?ALINE(Line) ->
+ undefined;
+attributes_info(Attrs, column=Item) ->
+ attr_info(Attrs, Item);
+attributes_info(Attrs, length=Item) ->
+ case attributes_info(Attrs, text) of
+ undefined ->
+ undefined;
+ {text,Text} ->
+ {Item,length(Text)}
+ end;
+attributes_info(Line, line=Item) when ?ALINE(Line) ->
+ {Item,Line};
+attributes_info({Line,Column}, line=Item) when ?ALINE(Line),
+ ?COLUMN(Column) ->
+ {Item,Line};
+attributes_info(Attrs, line=Item) ->
+ attr_info(Attrs, Item);
+attributes_info({Line,Column}=Location, location=Item) when ?ALINE(Line),
+ ?COLUMN(Column) ->
+ {Item,Location};
+attributes_info(Line, location=Item) when ?ALINE(Line) ->
+ {Item,Line};
+attributes_info(Attrs, location=Item) ->
+ {line,Line} = attributes_info(Attrs, line), % assume line is present
+ case attributes_info(Attrs, column) of
+ undefined ->
+ %% If set_attribute() has assigned a term such as {17,42}
+ %% to 'line', then Line will look like {Line,Column}. One
+ %% should not use 'location' but 'line' and 'column' in
+ %% such special cases.
+ {Item,Line};
+ {column,Column} ->
+ {Item,{Line,Column}}
+ end;
+attributes_info({Line,Column}, text) when ?ALINE(Line), ?COLUMN(Column) ->
+ undefined;
+attributes_info(Line, text) when ?ALINE(Line) ->
+ undefined;
+attributes_info(Attrs, text=Item) ->
+ attr_info(Attrs, Item);
+attributes_info(T1, T2) ->
+ erlang:error(badarg, [T1,T2]).
+
+-spec set_attribute(AttributeItem, Attributes, SetAttributeFun) -> Attributes when
+ AttributeItem :: 'line',
+ Attributes :: attributes(),
+ SetAttributeFun :: fun((info_line()) -> info_line()).
+set_attribute(Tag, Attributes, Fun) when ?SETATTRFUN(Fun) ->
+ set_attr(Tag, Attributes, Fun).
+
+%%%
+%%% Local functions
+%%%
+
+string_thing($') -> "atom"; %' Stupid Emacs
+string_thing(_) -> "string".
+
+-define(WHITE_SPACE(C),
+ is_integer(C) andalso
+ (C >= $\000 andalso C =< $\s orelse C >= $\200 andalso C =< $\240)).
+-define(DIGIT(C), C >= $0, C =< $9).
+-define(CHAR(C), is_integer(C), C >= 0).
+-define(UNICODE(C),
+ is_integer(C) andalso
+ (C >= 0 andalso C < 16#D800 orelse
+ C > 16#DFFF andalso C < 16#FFFE orelse
+ C > 16#FFFF andalso C =< 16#10FFFF)).
+
+-define(UNI255(C), C >= 0, C =< 16#ff).
+
+options(Opts0) when is_list(Opts0) ->
+ Opts = lists:foldr(fun expand_opt/2, [], Opts0),
+ [RW_fun] =
+ case opts(Opts, [reserved_word_fun], []) of
+ badarg ->
+ erlang:error(badarg, [Opts0]);
+ R ->
+ R
+ end,
+ Comment = proplists:get_bool(return_comments, Opts),
+ WS = proplists:get_bool(return_white_spaces, Opts),
+ Txt = proplists:get_bool(text, Opts),
+ #erl_scan{resword_fun = RW_fun,
+ comment = Comment,
+ ws = WS,
+ text = Txt};
+options(Opt) ->
+ options([Opt]).
+
+opts(Options, [Key|Keys], L) ->
+ V = case lists:keyfind(Key, 1, Options) of
+ {reserved_word_fun,F} when ?RESWORDFUN(F) ->
+ {ok,F};
+ {Key,_} ->
+ badarg;
+ false ->
+ {ok,default_option(Key)}
+ end,
+ case V of
+ badarg ->
+ badarg;
+ {ok,Value} ->
+ opts(Options, Keys, [Value|L])
+ end;
+opts(_Options, [], L) ->
+ lists:reverse(L).
+
+default_option(reserved_word_fun) ->
+ fun reserved_word/1.
+
+expand_opt(return, Os) ->
+ [return_comments,return_white_spaces|Os];
+expand_opt(O, Os) ->
+ [O|Os].
+
+attr_info(Attrs, Item) ->
+ try lists:keyfind(Item, 1, Attrs) of
+ {_Item, _Value} = T ->
+ T;
+ false ->
+ undefined
+ catch
+ _:_ ->
+ erlang:error(badarg, [Attrs, Item])
+ end.
+
+-spec set_attr('line', attributes(), fun((line()) -> line())) -> attributes().
+
+set_attr(line, Line, Fun) when ?ALINE(Line) ->
+ Ln = Fun(Line),
+ if
+ ?ALINE(Ln) ->
+ Ln;
+ true ->
+ [{line,Ln}]
+ end;
+set_attr(line, {Line,Column}, Fun) when ?ALINE(Line), ?COLUMN(Column) ->
+ Ln = Fun(Line),
+ if
+ ?ALINE(Ln) ->
+ {Ln,Column};
+ true ->
+ [{line,Ln},{column,Column}]
+ end;
+set_attr(line=Tag, Attrs, Fun) when is_list(Attrs) ->
+ {line,Line} = lists:keyfind(Tag, 1, Attrs),
+ case lists:keyreplace(Tag, 1, Attrs, {line,Fun(Line)}) of
+ [{line,Ln}] when ?ALINE(Ln) ->
+ Ln;
+ As ->
+ As
+ end;
+set_attr(T1, T2, T3) ->
+ erlang:error(badarg, [T1,T2,T3]).
+
+tokens1(Cs, St, Line, Col, Toks, Fun, Any) when ?STRING(Cs); Cs =:= eof ->
+ case Fun(Cs, St, Line, Col, Toks, Any) of
+ {more,{Cs0,Ncol,Ntoks,Nline,Nany,Nfun}} ->
+ {more,{erl_scan_continuation,Cs0,Ncol,Ntoks,Nline,St,Nany,Nfun}};
+ {ok,Toks0,eof,Nline,Ncol} ->
+ Res = case Toks0 of
+ [] ->
+ {eof,location(Nline, Ncol)};
+ _ ->
+ {ok,lists:reverse(Toks0),location(Nline,Ncol)}
+ end,
+ {done,Res,eof};
+ {ok,Toks0,Rest,Nline,Ncol} ->
+ {done,{ok,lists:reverse(Toks0),location(Nline, Ncol)},Rest};
+ {{error,_,_}=Error,Rest} ->
+ {done,Error,Rest}
+ end.
+
+string1(Cs, St, Line, Col, Toks) ->
+ case scan1(Cs, St, Line, Col, Toks) of
+ {more,{Cs0,Ncol,Ntoks,Nline,Any,Fun}} ->
+ case Fun(Cs0++eof, St, Nline, Ncol, Ntoks, Any) of
+ {ok,Toks1,_Rest,Line2,Col2} ->
+ {ok,lists:reverse(Toks1),location(Line2, Col2)};
+ {{error,_,_}=Error,_Rest} ->
+ Error
+ end;
+ {ok,Ntoks,[_|_]=Rest,Nline,Ncol} ->
+ string1(Rest, St, Nline, Ncol, Ntoks);
+ {ok,Ntoks,_,Nline,Ncol} ->
+ {ok,lists:reverse(Ntoks),location(Nline, Ncol)};
+ {{error,_,_}=Error,_Rest} ->
+ Error
+ end.
+
+scan(Cs, St, Line, Col, Toks, _) ->
+ scan1(Cs, St, Line, Col, Toks).
+
+scan1([$\s|Cs], St, Line, Col, Toks) when St#erl_scan.ws ->
+ scan_spcs(Cs, St, Line, Col, Toks, 1);
+scan1([$\s|Cs], St, Line, Col, Toks) ->
+ skip_white_space(Cs, St, Line, Col, Toks, 1);
+scan1([$\n|Cs], St, Line, Col, Toks) when St#erl_scan.ws ->
+ scan_newline(Cs, St, Line, Col, Toks);
+scan1([$\n|Cs], St, Line, Col, Toks) ->
+ skip_white_space(Cs, St, Line+1, new_column(Col, 1), Toks, 0);
+scan1([C|Cs], St, Line, Col, Toks) when C >= $A, C =< $Z ->
+ scan_variable(Cs, St, Line, Col, Toks, [C]);
+scan1([C|Cs], St, Line, Col, Toks) when C >= $a, C =< $z ->
+ scan_atom(Cs, St, Line, Col, Toks, [C]);
+%% Optimization: some very common punctuation characters:
+scan1([$,|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ",", ',', 1);
+scan1([$(|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "(", '(', 1);
+scan1([$)|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ")", ')', 1);
+scan1([${|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "{", '{', 1);
+scan1([$}|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "}", '}', 1);
+scan1([$[|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "[", '[', 1);
+scan1([$]|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "]", ']', 1);
+scan1([$;|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ";", ';', 1);
+scan1([$_=C|Cs], St, Line, Col, Toks) ->
+ scan_variable(Cs, St, Line, Col, Toks, [C]);
+%% More punctuation characters below.
+scan1([$\%|Cs], St, Line, Col, Toks) when not St#erl_scan.comment ->
+ skip_comment(Cs, St, Line, Col, Toks, 1);
+scan1([$\%=C|Cs], St, Line, Col, Toks) ->
+ scan_comment(Cs, St, Line, Col, Toks, [C]);
+scan1([C|Cs], St, Line, Col, Toks) when ?DIGIT(C) ->
+ scan_number(Cs, St, Line, Col, Toks, [C]);
+scan1("..."++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "...", '...', 3);
+scan1(".."=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+scan1(".."++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "..", '..', 2);
+scan1("."=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+scan1([$.=C|Cs], St, Line, Col, Toks) ->
+ scan_dot(Cs, St, Line, Col, Toks, [C]);
+scan1([$"|Cs], St, Line, Col, Toks) -> %" Emacs
+ State0 = {[],[],Line,Col},
+ scan_string(Cs, St, Line, incr_column(Col, 1), Toks, State0);
+scan1([$'|Cs], St, Line, Col, Toks) -> %' Emacs
+ State0 = {[],[],Line,Col},
+ scan_qatom(Cs, St, Line, incr_column(Col, 1), Toks, State0);
+scan1([$$|Cs], St, Line, Col, Toks) ->
+ scan_char(Cs, St, Line, Col, Toks);
+scan1([$\r|Cs], St, Line, Col, Toks) when St#erl_scan.ws ->
+ white_space_end(Cs, St, Line, Col, Toks, 1, "\r");
+scan1([C|Cs], St, Line, Col, Toks) when C >= $ß, C =< $ÿ, C =/= $÷ ->
+ scan_atom(Cs, St, Line, Col, Toks, [C]);
+scan1([C|Cs], St, Line, Col, Toks) when C >= $À, C =< $Þ, C /= $× ->
+ scan_variable(Cs, St, Line, Col, Toks, [C]);
+scan1([$\t|Cs], St, Line, Col, Toks) when St#erl_scan.ws ->
+ scan_tabs(Cs, St, Line, Col, Toks, 1);
+scan1([$\t|Cs], St, Line, Col, Toks) ->
+ skip_white_space(Cs, St, Line, Col, Toks, 1);
+scan1([C|Cs], St, Line, Col, Toks) when ?WHITE_SPACE(C) ->
+ case St#erl_scan.ws of
+ true ->
+ scan_white_space(Cs, St, Line, Col, Toks, [C]);
+ false ->
+ skip_white_space(Cs, St, Line, Col, Toks, 1)
+ end;
+%% Punctuation characters and operators, first recognise multiples.
+%% << <- <=
+scan1("<<"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "<<", '<<', 2);
+scan1("<-"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "<-", '<-', 2);
+scan1("<="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "<=", '<=', 2);
+scan1("<"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% >> >=
+scan1(">>"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ">>", '>>', 2);
+scan1(">="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ">=", '>=', 2);
+scan1(">"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% -> --
+scan1("->"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "->", '->', 2);
+scan1("--"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "--", '--', 2);
+scan1("-"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% ++
+scan1("++"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "++", '++', 2);
+scan1("+"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% =:= =/= =< ==
+scan1("=:="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "=:=", '=:=', 3);
+scan1("=:"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+scan1("=/="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "=/=", '=/=', 3);
+scan1("=/"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+scan1("=<"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "=<", '=<', 2);
+scan1("=="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "==", '==', 2);
+scan1("="=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% /=
+scan1("/="++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "/=", '/=', 2);
+scan1("/"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% ||
+scan1("||"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "||", '||', 2);
+scan1("|"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% :-
+scan1(":-"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ":-", ':-', 2);
+%% :: for typed records
+scan1("::"++Cs, St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "::", '::', 2);
+scan1(":"=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+%% Optimization: punctuation characters less than 127:
+scan1([$=|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "=", '=', 1);
+scan1([$:|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ":", ':', 1);
+scan1([$||Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "|", '|', 1);
+scan1([$#|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "#", '#', 1);
+scan1([$/|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "/", '/', 1);
+scan1([$?|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "?", '?', 1);
+scan1([$-|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "-", '-', 1);
+scan1([$+|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "+", '+', 1);
+scan1([$*|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "*", '*', 1);
+scan1([$<|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "<", '<', 1);
+scan1([$>|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, ">", '>', 1);
+scan1([$!|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "!", '!', 1);
+scan1([$@|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "@", '@', 1);
+scan1([$\\|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "\\", '\\', 1);
+scan1([$^|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "^", '^', 1);
+scan1([$`|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "`", '`', 1);
+scan1([$~|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "~", '~', 1);
+scan1([$&|Cs], St, Line, Col, Toks) ->
+ tok2(Cs, St, Line, Col, Toks, "&", '&', 1);
+%% End of optimization.
+scan1([C|Cs], St, Line, Col, Toks) when ?UNI255(C) ->
+ Str = [C],
+ tok2(Cs, St, Line, Col, Toks, Str, list_to_atom(Str), 1);
+scan1([C|Cs], _St, Line, Col, _Toks) when ?CHAR(C) ->
+ Ncol = incr_column(Col, 1),
+ scan_error({illegal,character}, Line, Col, Line, Ncol, Cs);
+scan1([]=Cs, _St, Line, Col, Toks) ->
+ {more,{Cs,Col,Toks,Line,[],fun scan/6}};
+scan1(eof=Cs, _St, Line, Col, Toks) ->
+ {ok,Toks,Cs,Line,Col}.
+
+scan_atom(Cs0, St, Line, Col, Toks, Ncs0) ->
+ case scan_name(Cs0, Ncs0) of
+ {more,Ncs} ->
+ {more,{[],Col,Toks,Line,Ncs,fun scan_atom/6}};
+ {Wcs,Cs} ->
+ case catch list_to_atom(Wcs) of
+ Name when is_atom(Name) ->
+ case (St#erl_scan.resword_fun)(Name) of
+ true ->
+ tok2(Cs, St, Line, Col, Toks, Wcs, Name);
+ false ->
+ tok3(Cs, St, Line, Col, Toks, atom, Wcs, Name)
+ end;
+ _Error ->
+ Ncol = incr_column(Col, length(Wcs)),
+ scan_error({illegal,atom}, Line, Col, Line, Ncol, Cs)
+ end
+ end.
+
+scan_variable(Cs0, St, Line, Col, Toks, Ncs0) ->
+ case scan_name(Cs0, Ncs0) of
+ {more,Ncs} ->
+ {more,{[],Col,Toks,Line,Ncs,fun scan_variable/6}};
+ {Wcs,Cs} ->
+ case catch list_to_atom(Wcs) of
+ Name when is_atom(Name) ->
+ tok3(Cs, St, Line, Col, Toks, var, Wcs, Name);
+ _Error ->
+ Ncol = incr_column(Col, length(Wcs)),
+ scan_error({illegal,var}, Line, Col, Line, Ncol, Cs)
+ end
+ end.
+
+scan_name([C|Cs], Ncs) when C >= $a, C =< $z ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([C|Cs], Ncs) when C >= $A, C =< $Z ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([$_=C|Cs], Ncs) ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([C|Cs], Ncs) when ?DIGIT(C) ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([$@=C|Cs], Ncs) ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([C|Cs], Ncs) when C >= $ß, C =< $ÿ, C =/= $÷ ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([C|Cs], Ncs) when C >= $À, C =< $Þ, C =/= $× ->
+ scan_name(Cs, [C|Ncs]);
+scan_name([], Ncs) ->
+ {more,Ncs};
+scan_name(Cs, Ncs) ->
+ {lists:reverse(Ncs),Cs}.
+
+-define(STR(St, S), if St#erl_scan.text -> S; true -> [] end).
+
+scan_dot([$%|_]=Cs, St, Line, Col, Toks, Ncs) ->
+ Attrs = attributes(Line, Col, St, Ncs),
+ {ok,[{dot,Attrs}|Toks],Cs,Line,incr_column(Col, 1)};
+scan_dot([$\n=C|Cs], St, Line, Col, Toks, Ncs) ->
+ Attrs = attributes(Line, Col, St, ?STR(St, Ncs++[C])),
+ {ok,[{dot,Attrs}|Toks],Cs,Line+1,new_column(Col, 1)};
+scan_dot([C|Cs], St, Line, Col, Toks, Ncs) when ?WHITE_SPACE(C) ->
+ Attrs = attributes(Line, Col, St, ?STR(St, Ncs++[C])),
+ {ok,[{dot,Attrs}|Toks],Cs,Line,incr_column(Col, 2)};
+scan_dot(eof=Cs, St, Line, Col, Toks, Ncs) ->
+ Attrs = attributes(Line, Col, St, Ncs),
+ {ok,[{dot,Attrs}|Toks],Cs,Line,incr_column(Col, 1)};
+scan_dot(Cs, St, Line, Col, Toks, Ncs) ->
+ tok2(Cs, St, Line, Col, Toks, Ncs, '.', 1).
+
+%%% White space characters are very common, so it is worthwhile to
+%%% scan them fast and store them compactly. (The words "whitespace"
+%%% and "white space" usually mean the same thing. The Erlang
+%%% specification denotes the characters with ASCII code in the
+%%% interval 0 to 32 as "white space".)
+%%%
+%%% Convention: if there is a white newline ($\n) it will always be
+%%% the first character in the text string. As a consequence, there
+%%% cannot be more than one newline in a white_space token string.
+%%%
+%%% Some common combinations are recognized, some are not. Examples
+%%% of the latter are tab(s) followed by space(s), like "\t ".
+%%% (They will be represented by two (or more) tokens.)
+%%%
+%%% Note: the character sequence "\r\n" is *not* recognized since it
+%%% would violate the property that $\n will always be the first
+%%% character. (But since "\r\n\r\n" is common, it pays off to
+%%% recognize "\n\r".)
+
+scan_newline([$\s|Cs], St, Line, Col, Toks) ->
+ scan_nl_spcs(Cs, St, Line, Col, Toks, 2);
+scan_newline([$\t|Cs], St, Line, Col, Toks) ->
+ scan_nl_tabs(Cs, St, Line, Col, Toks, 2);
+scan_newline([$\r|Cs], St, Line, Col, Toks) ->
+ newline_end(Cs, St, Line, Col, Toks, 2, "\n\r");
+scan_newline([$\f|Cs], St, Line, Col, Toks) ->
+ newline_end(Cs, St, Line, Col, Toks, 2, "\n\f");
+scan_newline([], _St, Line, Col, Toks) ->
+ {more,{[$\n],Col,Toks,Line,[],fun scan/6}};
+scan_newline(Cs, St, Line, Col, Toks) ->
+ scan_nl_white_space(Cs, St, Line, Col, Toks, "\n").
+
+scan_nl_spcs([$\s|Cs], St, Line, Col, Toks, N) when N < 17 ->
+ scan_nl_spcs(Cs, St, Line, Col, Toks, N+1);
+scan_nl_spcs([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun scan_nl_spcs/6}};
+scan_nl_spcs(Cs, St, Line, Col, Toks, N) ->
+ newline_end(Cs, St, Line, Col, Toks, N, nl_spcs(N)).
+
+scan_nl_tabs([$\t|Cs], St, Line, Col, Toks, N) when N < 11 ->
+ scan_nl_tabs(Cs, St, Line, Col, Toks, N+1);
+scan_nl_tabs([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun scan_nl_tabs/6}};
+scan_nl_tabs(Cs, St, Line, Col, Toks, N) ->
+ newline_end(Cs, St, Line, Col, Toks, N, nl_tabs(N)).
+
+%% Note: returning {more,Cont} is meaningless here; one could just as
+%% well return several tokens. But since tokens() scans up to a full
+%% stop anyway, nothing is gained by not collecting all white spaces.
+scan_nl_white_space([$\n|Cs], #erl_scan{text = false}=St, Line, no_col=Col,
+ Toks0, Ncs) ->
+ Toks = [{white_space,Line,lists:reverse(Ncs)}|Toks0],
+ scan_newline(Cs, St, Line+1, Col, Toks);
+scan_nl_white_space([$\n|Cs], St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ Attrs = attributes(Line, Col, St, Ncs),
+ Token = {white_space,Attrs,Ncs},
+ scan_newline(Cs, St, Line+1, new_column(Col, length(Ncs)), [Token|Toks]);
+scan_nl_white_space([C|Cs], St, Line, Col, Toks, Ncs) when ?WHITE_SPACE(C) ->
+ scan_nl_white_space(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_nl_white_space([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_nl_white_space/6}};
+scan_nl_white_space(Cs, #erl_scan{text = false}=St, Line, no_col=Col,
+ Toks, Ncs) ->
+ scan1(Cs, St, Line+1, Col, [{white_space,Line,lists:reverse(Ncs)}|Toks]);
+scan_nl_white_space(Cs, St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ Attrs = attributes(Line, Col, St, Ncs),
+ Token = {white_space,Attrs,Ncs},
+ scan1(Cs, St, Line+1, new_column(Col, length(Ncs)), [Token|Toks]).
+
+newline_end(Cs, #erl_scan{text = false}=St, Line, no_col=Col,
+ Toks, _N, Ncs) ->
+ scan1(Cs, St, Line+1, Col, [{white_space,Line,Ncs}|Toks]);
+newline_end(Cs, St, Line, Col, Toks, N, Ncs) ->
+ Attrs = attributes(Line, Col, St, Ncs),
+ scan1(Cs, St, Line+1, new_column(Col, N), [{white_space,Attrs,Ncs}|Toks]).
+
+scan_spcs([$\s|Cs], St, Line, Col, Toks, N) when N < 16 ->
+ scan_spcs(Cs, St, Line, Col, Toks, N+1);
+scan_spcs([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun scan_spcs/6}};
+scan_spcs(Cs, St, Line, Col, Toks, N) ->
+ white_space_end(Cs, St, Line, Col, Toks, N, spcs(N)).
+
+scan_tabs([$\t|Cs], St, Line, Col, Toks, N) when N < 10 ->
+ scan_tabs(Cs, St, Line, Col, Toks, N+1);
+scan_tabs([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun scan_tabs/6}};
+scan_tabs(Cs, St, Line, Col, Toks, N) ->
+ white_space_end(Cs, St, Line, Col, Toks, N, tabs(N)).
+
+skip_white_space([$\n|Cs], St, Line, Col, Toks, _N) ->
+ skip_white_space(Cs, St, Line+1, new_column(Col, 1), Toks, 0);
+skip_white_space([C|Cs], St, Line, Col, Toks, N) when ?WHITE_SPACE(C) ->
+ skip_white_space(Cs, St, Line, Col, Toks, N+1);
+skip_white_space([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun skip_white_space/6}};
+skip_white_space(Cs, St, Line, Col, Toks, N) ->
+ scan1(Cs, St, Line, incr_column(Col, N), Toks).
+
+%% Maybe \t and \s should break the loop.
+scan_white_space([$\n|_]=Cs, St, Line, Col, Toks, Ncs) ->
+ white_space_end(Cs, St, Line, Col, Toks, length(Ncs), lists:reverse(Ncs));
+scan_white_space([C|Cs], St, Line, Col, Toks, Ncs) when ?WHITE_SPACE(C) ->
+ scan_white_space(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_white_space([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_white_space/6}};
+scan_white_space(Cs, St, Line, Col, Toks, Ncs) ->
+ white_space_end(Cs, St, Line, Col, Toks, length(Ncs), lists:reverse(Ncs)).
+
+-compile({inline,[white_space_end/7]}).
+
+white_space_end(Cs, St, Line, Col, Toks, N, Ncs) ->
+ tok3(Cs, St, Line, Col, Toks, white_space, Ncs, Ncs, N).
+
+scan_char([$\\|Cs]=Cs0, St, Line, Col, Toks) ->
+ case scan_escape(Cs, incr_column(Col, 2)) of
+ more ->
+ {more,{[$$|Cs0],Col,Toks,Line,[],fun scan/6}};
+ {error,Ncs,Error,Ncol} ->
+ scan_error(Error, Line, Col, Line, Ncol, Ncs);
+ {eof,Ncol} ->
+ scan_error(char, Line, Col, Line, Ncol, eof);
+ {nl,Val,Str,Ncs,Ncol} ->
+ Attrs = attributes(Line, Col, St, ?STR(St, "$\\"++Str)), %"
+ Ntoks = [{char,Attrs,Val}|Toks],
+ scan1(Ncs, St, Line+1, Ncol, Ntoks);
+ {Val,Str,Ncs,Ncol} ->
+ Attrs = attributes(Line, Col, St, ?STR(St, "$\\"++Str)), %"
+ Ntoks = [{char,Attrs,Val}|Toks],
+ scan1(Ncs, St, Line, Ncol, Ntoks)
+ end;
+scan_char([$\n=C|Cs], St, Line, Col, Toks) ->
+ Attrs = attributes(Line, Col, St, ?STR(St, [$$,C])),
+ scan1(Cs, St, Line+1, new_column(Col, 1), [{char,Attrs,C}|Toks]);
+scan_char([C|Cs], St, Line, Col, Toks) when ?UNICODE(C) ->
+ Attrs = attributes(Line, Col, St, ?STR(St, [$$,C])),
+ scan1(Cs, St, Line, incr_column(Col, 2), [{char,Attrs,C}|Toks]);
+scan_char([C|_Cs], _St, Line, Col, _Toks) when ?CHAR(C) ->
+ scan_error({illegal,character}, Line, Col, Line, incr_column(Col, 1), eof);
+scan_char([], _St, Line, Col, Toks) ->
+ {more,{[$$],Col,Toks,Line,[],fun scan/6}};
+scan_char(eof, _St, Line, Col, _Toks) ->
+ scan_error(char, Line, Col, Line, incr_column(Col, 1), eof).
+
+scan_string(Cs, St, Line, Col, Toks, {Wcs,Str,Line0,Col0}) ->
+ case scan_string0(Cs, St, Line, Col, $\", Str, Wcs) of %"
+ {more,Ncs,Nline,Ncol,Nstr,Nwcs} ->
+ State = {Nwcs,Nstr,Line0,Col0},
+ {more,{Ncs,Ncol,Toks,Nline,State,fun scan_string/6}};
+ {char_error,Ncs,Error,Nline,Ncol,EndCol} ->
+ scan_error(Error, Nline, Ncol, Nline, EndCol, Ncs);
+ {error,Nline,Ncol,Nwcs,Ncs} ->
+ Estr = string:substr(Nwcs, 1, 16), % Expanded escape chars.
+ scan_error({string,$\",Estr}, Line0, Col0, Nline, Ncol, Ncs); %"
+ {Ncs,Nline,Ncol,Nstr,Nwcs} ->
+ Attrs = attributes(Line0, Col0, St, Nstr),
+ scan1(Ncs, St, Nline, Ncol, [{string,Attrs,Nwcs}|Toks])
+ end.
+
+scan_qatom(Cs, St, Line, Col, Toks, {Wcs,Str,Line0,Col0}) ->
+ case scan_string0(Cs, St, Line, Col, $\', Str, Wcs) of %'
+ {more,Ncs,Nline,Ncol,Nstr,Nwcs} ->
+ State = {Nwcs,Nstr,Line0,Col0},
+ {more,{Ncs,Ncol,Toks,Nline,State,fun scan_qatom/6}};
+ {char_error,Ncs,Error,Nline,Ncol,EndCol} ->
+ scan_error(Error, Nline, Ncol, Nline, EndCol, Ncs);
+ {error,Nline,Ncol,Nwcs,Ncs} ->
+ Estr = string:substr(Nwcs, 1, 16), % Expanded escape chars.
+ scan_error({string,$\',Estr}, Line0, Col0, Nline, Ncol, Ncs); %'
+ {Ncs,Nline,Ncol,Nstr,Nwcs} ->
+ case catch list_to_atom(Nwcs) of
+ A when is_atom(A) ->
+ Attrs = attributes(Line0, Col0, St, Nstr),
+ scan1(Ncs, St, Nline, Ncol, [{atom,Attrs,A}|Toks]);
+ _ ->
+ scan_error({illegal,atom}, Line0, Col0, Nline, Ncol, Ncs)
+ end
+ end.
+
+scan_string0(Cs, #erl_scan{text=false}, Line, no_col=Col, Q, [], Wcs) ->
+ scan_string_no_col(Cs, Line, Col, Q, Wcs);
+scan_string0(Cs, #erl_scan{text=true}, Line, no_col=Col, Q, Str, Wcs) ->
+ scan_string1(Cs, Line, Col, Q, Str, Wcs);
+scan_string0(Cs, St, Line, Col, Q, [], Wcs) ->
+ scan_string_col(Cs, St, Line, Col, Q, Wcs);
+scan_string0(Cs, _St, Line, Col, Q, Str, Wcs) ->
+ scan_string1(Cs, Line, Col, Q, Str, Wcs).
+
+%% Optimization. Col =:= no_col.
+scan_string_no_col([Q|Cs], Line, Col, Q, Wcs) ->
+ {Cs,Line,Col,_DontCare=[],lists:reverse(Wcs)};
+scan_string_no_col([$\n=C|Cs], Line, Col, Q, Wcs) ->
+ scan_string_no_col(Cs, Line+1, Col, Q, [C|Wcs]);
+scan_string_no_col([C|Cs], Line, Col, Q, Wcs) when C =/= $\\, ?UNICODE(C) ->
+ scan_string_no_col(Cs, Line, Col, Q, [C|Wcs]);
+scan_string_no_col(Cs, Line, Col, Q, Wcs) ->
+ scan_string1(Cs, Line, Col, Q, Wcs, Wcs).
+
+%% Optimization. Col =/= no_col.
+scan_string_col([Q|Cs], St, Line, Col, Q, Wcs0) ->
+ Wcs = lists:reverse(Wcs0),
+ Str = ?STR(St, [Q|Wcs++[Q]]),
+ {Cs,Line,Col+1,Str,Wcs};
+scan_string_col([$\n=C|Cs], St, Line, _xCol, Q, Wcs) ->
+ scan_string_col(Cs, St, Line+1, 1, Q, [C|Wcs]);
+scan_string_col([C|Cs], St, Line, Col, Q, Wcs) when C =/= $\\, ?UNICODE(C) ->
+ scan_string_col(Cs, St, Line, Col+1, Q, [C|Wcs]);
+scan_string_col(Cs, _St, Line, Col, Q, Wcs) ->
+ scan_string1(Cs, Line, Col, Q, Wcs, Wcs).
+
+%% Note: in those cases when a 'char_error' tuple is returned below it
+%% is tempting to skip over characters up to the first Q character,
+%% but then the end location of the error tuple would not correspond
+%% to the start location of the returned Rest string. (Maybe the end
+%% location could be modified, but that too is ugly.)
+scan_string1([Q|Cs], Line, Col, Q, Str0, Wcs0) ->
+ Wcs = lists:reverse(Wcs0),
+ Str = [Q|lists:reverse(Str0, [Q])],
+ {Cs,Line,incr_column(Col, 1),Str,Wcs};
+scan_string1([$\n=C|Cs], Line, Col, Q, Str, Wcs) ->
+ Ncol = new_column(Col, 1),
+ scan_string1(Cs, Line+1, Ncol, Q, [C|Str], [C|Wcs]);
+scan_string1([$\\|Cs]=Cs0, Line, Col, Q, Str, Wcs) ->
+ case scan_escape(Cs, Col) of
+ more ->
+ {more,Cs0,Line,Col,Str,Wcs};
+ {error,Ncs,Error,Ncol} ->
+ {char_error,Ncs,Error,Line,Col,incr_column(Ncol, 1)};
+ {eof,Ncol} ->
+ {error,Line,incr_column(Ncol, 1),lists:reverse(Wcs),eof};
+ {nl,Val,ValStr,Ncs,Ncol} ->
+ Nstr = lists:reverse(ValStr, [$\\|Str]),
+ Nwcs = [Val|Wcs],
+ scan_string1(Ncs, Line+1, Ncol, Q, Nstr, Nwcs);
+ {Val,ValStr,Ncs,Ncol} ->
+ Nstr = lists:reverse(ValStr, [$\\|Str]),
+ Nwcs = [Val|Wcs],
+ scan_string1(Ncs, Line, incr_column(Ncol, 1), Q, Nstr, Nwcs)
+ end;
+scan_string1([C|Cs], Line, no_col=Col, Q, Str, Wcs) when ?UNICODE(C) ->
+ scan_string1(Cs, Line, Col, Q, [C|Str], [C|Wcs]);
+scan_string1([C|Cs], Line, Col, Q, Str, Wcs) when ?UNICODE(C) ->
+ scan_string1(Cs, Line, Col+1, Q, [C|Str], [C|Wcs]);
+scan_string1([C|Cs], Line, Col, _Q, _Str, _Wcs) when ?CHAR(C) ->
+ {char_error,Cs,{illegal,character},Line,Col,incr_column(Col, 1)};
+scan_string1([]=Cs, Line, Col, _Q, Str, Wcs) ->
+ {more,Cs,Line,Col,Str,Wcs};
+scan_string1(eof, Line, Col, _Q, _Str, Wcs) ->
+ {error,Line,Col,lists:reverse(Wcs),eof}.
+
+-define(OCT(C), C >= $0, C =< $7).
+-define(HEX(C), C >= $0 andalso C =< $9 orelse
+ C >= $A andalso C =< $F orelse
+ C >= $a andalso C =< $f).
+
+%% \<1-3> octal digits
+scan_escape([O1,O2,O3|Cs], Col) when ?OCT(O1), ?OCT(O2), ?OCT(O3) ->
+ Val = (O1*8 + O2)*8 + O3 - 73*$0,
+ {Val,[O1,O2,O3],Cs,incr_column(Col, 3)};
+scan_escape([O1,O2], _Col) when ?OCT(O1), ?OCT(O2) ->
+ more;
+scan_escape([O1,O2|Cs], Col) when ?OCT(O1), ?OCT(O2) ->
+ Val = (O1*8 + O2) - 9*$0,
+ {Val,[O1,O2],Cs,incr_column(Col, 2)};
+scan_escape([O1], _Col) when ?OCT(O1) ->
+ more;
+scan_escape([O1|Cs], Col) when ?OCT(O1) ->
+ {O1 - $0,[O1],Cs,incr_column(Col, 1)};
+%% \x{<hex digits>}
+scan_escape([$x,${|Cs], Col) ->
+ scan_hex(Cs, incr_column(Col, 2), []);
+scan_escape([$x], _Col) ->
+ more;
+scan_escape([$x|eof], Col) ->
+ {eof,incr_column(Col, 1)};
+%% \x<2> hexadecimal digits
+scan_escape([$x,H1,H2|Cs], Col) when ?HEX(H1), ?HEX(H2) ->
+ Val = erlang:list_to_integer([H1,H2], 16),
+ {Val,[$x,H1,H2],Cs,incr_column(Col, 3)};
+scan_escape([$x,H1], _Col) when ?HEX(H1) ->
+ more;
+scan_escape([$x|Cs], Col) ->
+ {error,Cs,{illegal,character},incr_column(Col, 1)};
+%% \^X -> CTL-X
+scan_escape([$^=C0,$\n=C|Cs], Col) ->
+ {nl,C,[C0,C],Cs,new_column(Col, 1)};
+scan_escape([$^=C0,C|Cs], Col) when ?CHAR(C) ->
+ Val = C band 31,
+ {Val,[C0,C],Cs,incr_column(Col, 2)};
+scan_escape([$^], _Col) ->
+ more;
+scan_escape([$^|eof], Col) ->
+ {eof,incr_column(Col, 1)};
+scan_escape([$\n=C|Cs], Col) ->
+ {nl,C,[C],Cs,new_column(Col, 1)};
+scan_escape([C0|Cs], Col) when ?UNICODE(C0) ->
+ C = escape_char(C0),
+ {C,[C0],Cs,incr_column(Col, 1)};
+scan_escape([C|Cs], Col) when ?CHAR(C) ->
+ {error,Cs,{illegal,character},incr_column(Col, 1)};
+scan_escape([], _Col) ->
+ more;
+scan_escape(eof, Col) ->
+ {eof,Col}.
+
+scan_hex([C|Cs], no_col=Col, Wcs) when ?HEX(C) ->
+ scan_hex(Cs, Col, [C|Wcs]);
+scan_hex([C|Cs], Col, Wcs) when ?HEX(C) ->
+ scan_hex(Cs, Col+1, [C|Wcs]);
+scan_hex(Cs, Col, Wcs) ->
+ scan_esc_end(Cs, Col, Wcs, 16, "x{").
+
+scan_esc_end([$}|Cs], Col, Wcs0, B, Str0) ->
+ Wcs = lists:reverse(Wcs0),
+ case catch erlang:list_to_integer(Wcs, B) of
+ Val when ?UNICODE(Val) ->
+ {Val,Str0++Wcs++[$}],Cs,incr_column(Col, 1)};
+ _ ->
+ {error,Cs,{illegal,character},incr_column(Col, 1)}
+ end;
+scan_esc_end([], _Col, _Wcs, _B, _Str0) ->
+ more;
+scan_esc_end(eof, Col, _Wcs, _B, _Str0) ->
+ {eof,Col};
+scan_esc_end(Cs, Col, _Wcs, _B, _Str0) ->
+ {error,Cs,{illegal,character},Col}.
+
+escape_char($n) -> $\n; % \n = LF
+escape_char($r) -> $\r; % \r = CR
+escape_char($t) -> $\t; % \t = TAB
+escape_char($v) -> $\v; % \v = VT
+escape_char($b) -> $\b; % \b = BS
+escape_char($f) -> $\f; % \f = FF
+escape_char($e) -> $\e; % \e = ESC
+escape_char($s) -> $\s; % \s = SPC
+escape_char($d) -> $\d; % \d = DEL
+escape_char(C) -> C.
+
+scan_number([C|Cs], St, Line, Col, Toks, Ncs) when ?DIGIT(C) ->
+ scan_number(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_number([$.,C|Cs], St, Line, Col, Toks, Ncs) when ?DIGIT(C) ->
+ scan_fraction(Cs, St, Line, Col, Toks, [C,$.|Ncs]);
+scan_number([$.]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_number/6}};
+scan_number([$#|Cs]=Cs0, St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ case catch list_to_integer(Ncs) of
+ B when B >= 2, B =< 1+$Z-$A+10 ->
+ Bcs = ?STR(St, Ncs++[$#]),
+ scan_based_int(Cs, St, Line, Col, Toks, {B,[],Bcs});
+ B ->
+ Len = length(Ncs),
+ scan_error({base,B}, Line, Col, Line, incr_column(Col, Len), Cs0)
+ end;
+scan_number([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_number/6}};
+scan_number(Cs, St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ case catch list_to_integer(Ncs) of
+ N when is_integer(N) ->
+ tok3(Cs, St, Line, Col, Toks, integer, Ncs, N);
+ _ ->
+ Ncol = incr_column(Col, length(Ncs)),
+ scan_error({illegal,integer}, Line, Col, Line, Ncol, Cs)
+ end.
+
+scan_based_int([C|Cs], St, Line, Col, Toks, {B,Ncs,Bcs})
+ when ?DIGIT(C), C < $0+B ->
+ scan_based_int(Cs, St, Line, Col, Toks, {B,[C|Ncs],Bcs});
+scan_based_int([C|Cs], St, Line, Col, Toks, {B,Ncs,Bcs})
+ when C >= $A, B > 10, C < $A+B-10 ->
+ scan_based_int(Cs, St, Line, Col, Toks, {B,[C|Ncs],Bcs});
+scan_based_int([C|Cs], St, Line, Col, Toks, {B,Ncs,Bcs})
+ when C >= $a, B > 10, C < $a+B-10 ->
+ scan_based_int(Cs, St, Line, Col, Toks, {B,[C|Ncs],Bcs});
+scan_based_int([]=Cs, _St, Line, Col, Toks, State) ->
+ {more,{Cs,Col,Toks,Line,State,fun scan_based_int/6}};
+scan_based_int(Cs, St, Line, Col, Toks, {B,Ncs0,Bcs}) ->
+ Ncs = lists:reverse(Ncs0),
+ case catch erlang:list_to_integer(Ncs, B) of
+ N when is_integer(N) ->
+ tok3(Cs, St, Line, Col, Toks, integer, ?STR(St, Bcs++Ncs), N);
+ _ ->
+ Len = length(Bcs)+length(Ncs),
+ Ncol = incr_column(Col, Len),
+ scan_error({illegal,integer}, Line, Col, Line, Ncol, Cs)
+ end.
+
+scan_fraction([C|Cs], St, Line, Col, Toks, Ncs) when ?DIGIT(C) ->
+ scan_fraction(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_fraction([E|Cs], St, Line, Col, Toks, Ncs) when E =:= $e; E =:= $E ->
+ scan_exponent_sign(Cs, St, Line, Col, Toks, [E|Ncs]);
+scan_fraction([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_fraction/6}};
+scan_fraction(Cs, St, Line, Col, Toks, Ncs) ->
+ float_end(Cs, St, Line, Col, Toks, Ncs).
+
+scan_exponent_sign([C|Cs], St, Line, Col, Toks, Ncs) when C =:= $+; C =:= $- ->
+ scan_exponent(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_exponent_sign([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_exponent_sign/6}};
+scan_exponent_sign(Cs, St, Line, Col, Toks, Ncs) ->
+ scan_exponent(Cs, St, Line, Col, Toks, Ncs).
+
+scan_exponent([C|Cs], St, Line, Col, Toks, Ncs) when ?DIGIT(C) ->
+ scan_exponent(Cs, St, Line, Col, Toks, [C|Ncs]);
+scan_exponent([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_exponent/6}};
+scan_exponent(Cs, St, Line, Col, Toks, Ncs) ->
+ float_end(Cs, St, Line, Col, Toks, Ncs).
+
+float_end(Cs, St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ case catch list_to_float(Ncs) of
+ F when is_float(F) ->
+ tok3(Cs, St, Line, Col, Toks, float, Ncs, F);
+ _ ->
+ Ncol = incr_column(Col, length(Ncs)),
+ scan_error({illegal,float}, Line, Col, Line, Ncol, Cs)
+ end.
+
+skip_comment([C|Cs], St, Line, Col, Toks, N) when C =/= $\n, ?CHAR(C) ->
+ case ?UNICODE(C) of
+ true ->
+ skip_comment(Cs, St, Line, Col, Toks, N+1);
+ false ->
+ Ncol = incr_column(Col, N+1),
+ scan_error({illegal,character}, Line, Col, Line, Ncol, Cs)
+ end;
+skip_comment([]=Cs, _St, Line, Col, Toks, N) ->
+ {more,{Cs,Col,Toks,Line,N,fun skip_comment/6}};
+skip_comment(Cs, St, Line, Col, Toks, N) ->
+ scan1(Cs, St, Line, incr_column(Col, N), Toks).
+
+scan_comment([C|Cs], St, Line, Col, Toks, Ncs) when C =/= $\n, ?CHAR(C) ->
+ case ?UNICODE(C) of
+ true ->
+ scan_comment(Cs, St, Line, Col, Toks, [C|Ncs]);
+ false ->
+ Ncol = incr_column(Col, length(Ncs)+1),
+ scan_error({illegal,character}, Line, Col, Line, Ncol, Cs)
+ end;
+scan_comment([]=Cs, _St, Line, Col, Toks, Ncs) ->
+ {more,{Cs,Col,Toks,Line,Ncs,fun scan_comment/6}};
+scan_comment(Cs, St, Line, Col, Toks, Ncs0) ->
+ Ncs = lists:reverse(Ncs0),
+ tok3(Cs, St, Line, Col, Toks, comment, Ncs, Ncs).
+
+tok2(Cs, #erl_scan{text = false}=St, Line, no_col=Col, Toks, _Wcs, P) ->
+ scan1(Cs, St, Line, Col, [{P,Line}|Toks]);
+tok2(Cs, St, Line, Col, Toks, Wcs, P) ->
+ Attrs = attributes(Line, Col, St, Wcs),
+ scan1(Cs, St, Line, incr_column(Col, length(Wcs)), [{P,Attrs}|Toks]).
+
+tok2(Cs, #erl_scan{text = false}=St, Line, no_col=Col, Toks, _Wcs, P, _N) ->
+ scan1(Cs, St, Line, Col, [{P,Line}|Toks]);
+tok2(Cs, St, Line, Col, Toks, Wcs, P, N) ->
+ Attrs = attributes(Line, Col, St, Wcs),
+ scan1(Cs, St, Line, incr_column(Col, N), [{P,Attrs}|Toks]).
+
+tok3(Cs, #erl_scan{text = false}=St, Line, no_col=Col, Toks, Item, _S, Sym) ->
+ scan1(Cs, St, Line, Col, [{Item,Line,Sym}|Toks]);
+tok3(Cs, St, Line, Col, Toks, Item, String, Sym) ->
+ Token = {Item,attributes(Line, Col, St, String),Sym},
+ scan1(Cs, St, Line, incr_column(Col, length(String)), [Token|Toks]).
+
+tok3(Cs, #erl_scan{text = false}=St, Line, no_col=Col, Toks, Item,
+ _String, Sym, _Length) ->
+ scan1(Cs, St, Line, Col, [{Item,Line,Sym}|Toks]);
+tok3(Cs, St, Line, Col, Toks, Item, String, Sym, Length) ->
+ Token = {Item,attributes(Line, Col, St, String),Sym},
+ scan1(Cs, St, Line, incr_column(Col, Length), [Token|Toks]).
+
+scan_error(Error, Line, Col, EndLine, EndCol, Rest) ->
+ Loc = location(Line, Col),
+ EndLoc = location(EndLine, EndCol),
+ scan_error(Error, Loc, EndLoc, Rest).
+
+scan_error(Error, ErrorLoc, EndLoc, Rest) ->
+ {{error,{ErrorLoc,?MODULE,Error},EndLoc},Rest}.
+
+-compile({inline,[attributes/4]}).
+
+attributes(Line, no_col, #erl_scan{text = false}, _String) ->
+ Line;
+attributes(Line, no_col, #erl_scan{text = true}, String) ->
+ [{line,Line},{text,String}];
+attributes(Line, Col, #erl_scan{text = false}, _String) ->
+ {Line,Col};
+attributes(Line, Col, #erl_scan{text = true}, String) ->
+ [{line,Line},{column,Col},{text,String}].
+
+location(Line, no_col) ->
+ Line;
+location(Line, Col) when is_integer(Col) ->
+ {Line,Col}.
+
+-compile({inline,[incr_column/2,new_column/2]}).
+
+incr_column(no_col=Col, _N) ->
+ Col;
+incr_column(Col, N) when is_integer(Col) ->
+ Col + N.
+
+new_column(no_col=Col, _Ncol) ->
+ Col;
+new_column(Col, Ncol) when is_integer(Col) ->
+ Ncol.
+
+nl_spcs(2) -> "\n ";
+nl_spcs(3) -> "\n ";
+nl_spcs(4) -> "\n ";
+nl_spcs(5) -> "\n ";
+nl_spcs(6) -> "\n ";
+nl_spcs(7) -> "\n ";
+nl_spcs(8) -> "\n ";
+nl_spcs(9) -> "\n ";
+nl_spcs(10) -> "\n ";
+nl_spcs(11) -> "\n ";
+nl_spcs(12) -> "\n ";
+nl_spcs(13) -> "\n ";
+nl_spcs(14) -> "\n ";
+nl_spcs(15) -> "\n ";
+nl_spcs(16) -> "\n ";
+nl_spcs(17) -> "\n ".
+
+spcs(1) -> " ";
+spcs(2) -> " ";
+spcs(3) -> " ";
+spcs(4) -> " ";
+spcs(5) -> " ";
+spcs(6) -> " ";
+spcs(7) -> " ";
+spcs(8) -> " ";
+spcs(9) -> " ";
+spcs(10) -> " ";
+spcs(11) -> " ";
+spcs(12) -> " ";
+spcs(13) -> " ";
+spcs(14) -> " ";
+spcs(15) -> " ";
+spcs(16) -> " ".
+
+nl_tabs(2) -> "\n\t";
+nl_tabs(3) -> "\n\t\t";
+nl_tabs(4) -> "\n\t\t\t";
+nl_tabs(5) -> "\n\t\t\t\t";
+nl_tabs(6) -> "\n\t\t\t\t\t";
+nl_tabs(7) -> "\n\t\t\t\t\t\t";
+nl_tabs(8) -> "\n\t\t\t\t\t\t\t";
+nl_tabs(9) -> "\n\t\t\t\t\t\t\t\t";
+nl_tabs(10) -> "\n\t\t\t\t\t\t\t\t\t";
+nl_tabs(11) -> "\n\t\t\t\t\t\t\t\t\t\t".
+
+tabs(1) -> "\t";
+tabs(2) -> "\t\t";
+tabs(3) -> "\t\t\t";
+tabs(4) -> "\t\t\t\t";
+tabs(5) -> "\t\t\t\t\t";
+tabs(6) -> "\t\t\t\t\t\t";
+tabs(7) -> "\t\t\t\t\t\t\t";
+tabs(8) -> "\t\t\t\t\t\t\t\t";
+tabs(9) -> "\t\t\t\t\t\t\t\t\t";
+tabs(10) -> "\t\t\t\t\t\t\t\t\t\t".
+
+-spec reserved_word(Atom :: atom()) -> boolean().
+reserved_word('after') -> true;
+reserved_word('begin') -> true;
+reserved_word('case') -> true;
+reserved_word('try') -> true;
+reserved_word('cond') -> true;
+reserved_word('catch') -> true;
+reserved_word('andalso') -> true;
+reserved_word('orelse') -> true;
+reserved_word('end') -> true;
+reserved_word('fun') -> true;
+reserved_word('if') -> true;
+reserved_word('let') -> true;
+reserved_word('of') -> true;
+reserved_word('receive') -> true;
+reserved_word('when') -> true;
+reserved_word('bnot') -> true;
+reserved_word('not') -> true;
+reserved_word('div') -> true;
+reserved_word('rem') -> true;
+reserved_word('band') -> true;
+reserved_word('and') -> true;
+reserved_word('bor') -> true;
+reserved_word('bxor') -> true;
+reserved_word('bsl') -> true;
+reserved_word('bsr') -> true;
+reserved_word('or') -> true;
+reserved_word('xor') -> true;
+reserved_word(_) -> false.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl
index 3456f0e9c6..cdcaa5f9e8 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/opaque/opaque_adt.erl
@@ -3,6 +3,8 @@
-opaque abc() :: 'a' | 'b' | 'c'.
+-spec atom_or_list(_) -> abc() | list().
+
atom_or_list(1) -> a;
atom_or_list(2) -> b;
atom_or_list(3) -> c;
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_adt.erl
new file mode 100644
index 0000000000..7103847ae7
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_adt.erl
@@ -0,0 +1,17 @@
+-module(exact_adt).
+
+-export([exact_adt_set_type/1, exact_adt_set_type2/1]).
+
+-export_type([exact_adt/0]).
+
+-record(exact_adt, {}).
+
+-opaque exact_adt() :: #exact_adt{}.
+
+-spec exact_adt_set_type(_) -> exact_adt().
+
+exact_adt_set_type(G) -> G.
+
+-spec exact_adt_set_type2(exact_adt()) -> exact_adt().
+
+exact_adt_set_type2(G) -> G.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl
new file mode 100644
index 0000000000..5f7ab4f3aa
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/exact_api.erl
@@ -0,0 +1,60 @@
+-module(exact_api).
+
+-export([new/0, exact_api_test/1, exact_api_new/1,
+ exact_adt_test/1, exact_adt_new/1]).
+
+-export_type([exact_api/0]).
+
+-record(digraph, {vtab = notable :: ets:tab(),
+ etab = notable :: ets:tab(),
+ ntab = notable :: ets:tab(),
+ cyclic = true :: boolean()}).
+
+-spec new() -> digraph().
+
+new() ->
+ A = #digraph{},
+ set_type(A), % does not have an opaque term as 1st argument
+ A.
+
+-spec set_type(digraph()) -> true.
+
+set_type(G) ->
+ digraph:delete(G).
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+%%% The derived spec of exact_api_new() is
+%%% -spec exact_api_new(exact_api:exact_api()) -> exact_api:exact_api().
+%%% This won't happen unless dialyzer_typesig uses
+%%% t_is_exactly_equal() rather than t_is_equal().
+%%% [As of R17B the latter considers two types equal if nothing but
+%%% their ?opaque tags differ.]
+
+-record(exact_api, {}).
+
+-opaque exact_api() :: #exact_api{}.
+
+exact_api_test(X) ->
+ #exact_api{} = exact_api_set_type(X). % OK
+
+exact_api_new(A) ->
+ A = #exact_api{},
+ _ = exact_api_set_type(A), % OK (the opaque type is local)
+ A.
+
+-spec exact_api_set_type(exact_api()) -> exact_api().
+
+exact_api_set_type(#exact_api{}=E) -> E.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+-record(exact_adt, {}).
+
+exact_adt_test(X) ->
+ #exact_adt{} = exact_adt:exact_adt_set_type(X). % breaks the opaqueness
+
+exact_adt_new(A) ->
+ A = #exact_adt{},
+ _ = exact_adt:exact_adt_set_type2(A), % does not have an opaque term as 1st argument
+ A.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl
new file mode 100644
index 0000000000..2b157483bc
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/is_rec.erl
@@ -0,0 +1,65 @@
+-module(is_rec).
+
+-export([ri1/0, ri11/0, ri13/0, ri14/0, ri2/0, ri3/0, ri4/0, ri5/0,
+ ri6/0, ri7/0, ri8/0]).
+
+-record(r, {f1 :: integer()}).
+
+ri1() ->
+ A = simple1_adt:d1(),
+ is_record(A, r). % opaque term 1
+
+ri11() ->
+ A = simple1_adt:d1(),
+ I = '1-3'(),
+ is_record(A, r, I). % opaque term 1
+
+ri13() ->
+ A = simple1_adt:d1(),
+ if is_record(A, r) -> true end. % breaks the opaqueness
+
+ri14() ->
+ A = simple1_adt:d1(),
+ if is_record({A, 1}, r) -> true end. % breaks the opaqueness
+
+-type '1-3-t'() :: 1..3.
+
+-spec '1-3'() -> '1-3-t'().
+
+'1-3'() ->
+ random:uniform(3).
+
+
+-spec 'Atom'() -> atom().
+
+'Atom'() ->
+ a.
+
+ri2() ->
+ A = simple1_adt:d1(),
+ R = 'Atom'(),
+ is_record(A, R). % opaque term 1
+
+ri3() ->
+ A = simple1_adt:d1(),
+ is_record(A, A, 1). % opaque term 2
+
+ri4() ->
+ A = simple1_adt:d1(),
+ is_record(A, hipp:hopp(), 1). % opaque term 1
+
+ri5() ->
+ A = simple1_adt:d1(),
+ is_record(A, A, hipp:hopp()). % opaque term 2
+
+ri6() ->
+ A = simple1_adt:d1(),
+ if is_record(A, r) -> true end. % breaks opaqueness
+
+ri7() ->
+ A = simple1_adt:d1(),
+ if is_record({r, A}, r) -> true end. % A violates #r{}
+
+ri8() ->
+ A = simple1_adt:d1(),
+ is_record({A, 1}, r). % opaque term 1
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_adt.erl
new file mode 100644
index 0000000000..ff80d6e99b
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_adt.erl
@@ -0,0 +1,28 @@
+-module(rec_adt).
+
+-export([f/0, r1/0]).
+
+-export_type([r1/0]).
+
+-export_type([f/0, op_t/0, a/0]).
+
+-opaque a() :: a | b.
+
+-record(r1,
+ {f1 :: a()}).
+
+-opaque r1() :: #r1{}.
+
+-opaque f() :: fun((_) -> _).
+
+-opaque op_t() :: integer().
+
+-spec f() -> f().
+
+f() ->
+ fun(_) -> 3 end.
+
+-spec r1() -> r1().
+
+r1() ->
+ #r1{f1 = a}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl
new file mode 100644
index 0000000000..d9b1d59f0c
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/rec_api.erl
@@ -0,0 +1,77 @@
+-module(rec_api).
+
+-export([t1/0, t2/0, adt_t1/0, adt_t1/1, adt_r1/0,
+ t/1, t_adt/0, r/0, r_adt/0]).
+
+-export_type([{a,0},{r1,0}]).
+
+-export_type([f/0, op_t/0, r/0, tup/0]).
+
+-opaque a() :: a | b.
+
+-record(r1,
+ {f1 :: a()}).
+
+-opaque r1() :: #r1{}.
+
+t1() ->
+ A = #r1{f1 = a},
+ {r1, a} = A.
+
+t2() ->
+ A = {r1, 10}, % violates the type of #r1{}
+ {r1, 10} = A. % violates the type of #r1{}
+
+adt_t1() ->
+ R = rec_adt:r1(),
+ {r1, a} = R. % breaks the opaqueness
+
+-spec adt_t1(rec_adt:r1()) -> rec_adt:r1(). % invalid type spec
+
+adt_t1(R) ->
+ {r1, a} = R.
+
+-spec adt_r1() -> rec_adt:r1(). % invalid type spec
+
+adt_r1() ->
+ #r1{f1 = a}.
+
+-opaque f() :: fun((_) -> _).
+
+-opaque op_t() :: integer().
+
+-spec t(f()) -> _.
+
+t(A) ->
+ T = term(),
+ %% 3(T), % cannot test this: dialyzer_dep deliberately crashes
+ A(T).
+
+-spec term() -> op_t().
+
+term() ->
+ 3.
+
+t_adt() ->
+ A = rec_adt:f(),
+ T = term(),
+ A(T).
+
+-record(r, {f = fun(_) -> 3 end :: f(), o = 1 :: op_t()}).
+
+-opaque r() :: #r{}.
+
+-opaque tup() :: {'r', f(), op_t()}.
+
+-spec r() -> _.
+
+r() ->
+ {r, f(), 2}. % OK, f() is a local opaque type
+
+-spec f() -> f().
+
+f() ->
+ fun(_) -> 3 end.
+
+r_adt() ->
+ {r, rec_adt:f(), 2}. % breaks the opaqueness
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_adt.erl
new file mode 100644
index 0000000000..21a277c1e9
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_adt.erl
@@ -0,0 +1,138 @@
+-module(simple1_adt).
+
+-export([d1/0, d2/0, i/0, n1/0, n2/0, o1/0, o2/0,
+ c1/0, c2/0, bit1/0, a/0, i1/0, tuple/0,
+ b1/0, b2/0, ty_i1/0]).
+
+-export_type([o1/0, o2/0, d1/0, d2/0]).
+
+-export_type([i1/0, i2/0, di1/0, di2/0]).
+
+-export_type([ty_i1/0, c1/0, c2/0]).
+
+-export_type([b1/0, b2/0]).
+
+-export_type([bit1/0]).
+
+-export_type([tuple1/0, a/0, i/0]).
+
+%% Equal:
+
+-opaque o1() :: a | b | c.
+
+-opaque o2() :: a | b | c.
+
+%% Disjoint:
+
+-opaque d1() :: a | b | c.
+
+-opaque d2() :: d | e | f.
+
+%% One common element:
+
+-opaque c1() :: a | b | c.
+
+-opaque c2() :: c | e | f.
+
+%% Equal integer range:
+
+-opaque i1() :: 1 | 2.
+
+-opaque i2() :: 1 | 2.
+
+%% Disjoint integer range:
+
+-opaque di1() :: 1 | 2.
+
+-opaque di2() :: 3 | 4.
+
+
+-type ty_i1() :: 1 | 2.
+
+%% Boolean types
+
+-opaque b1() :: boolean().
+
+-opaque b2() :: boolean().
+
+%% Binary types
+
+-opaque bit1() :: binary().
+
+%% Tuple types
+
+-opaque tuple1() :: tuple().
+
+%% Atom type
+
+-opaque a() :: atom().
+
+-opaque i() :: integer().
+
+-spec d1() -> d1().
+
+d1() -> a.
+
+-spec d2() -> d2().
+
+d2() -> d.
+
+-spec i() -> i().
+
+i() ->
+ 1.
+
+-spec n1() -> o1().
+
+n1() -> a.
+
+-spec n2() -> o2().
+
+n2() -> a.
+
+-spec o1() -> o1().
+
+o1() -> a.
+
+-spec o2() -> o2().
+
+o2() -> a.
+
+-spec c1() -> c1().
+
+c1() -> a.
+
+-spec c2() -> c2().
+
+c2() -> e.
+
+-spec bit1() -> bit1().
+
+bit1() ->
+ <<"hej">>.
+
+-spec a() -> a().
+
+a() ->
+ e.
+
+-spec i1() -> i1().
+
+i1() -> 1.
+
+-spec tuple() -> tuple1().
+
+tuple() -> {1,2}.
+
+-spec b1() -> b1().
+
+b1() -> true.
+
+-spec b2() -> b2().
+
+b2() -> false.
+
+-spec ty_i1() -> ty_i1().
+
+ty_i1() ->
+ 1.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl
new file mode 100644
index 0000000000..5135eb8e59
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple1_api.erl
@@ -0,0 +1,571 @@
+-module(simple1_api).
+
+-export([t1/1, adt_t1/1, t2/1, adt_t2/1, tup/0, t3/0, t4/0, t5/0, t6/0, t7/0,
+ t8/0, adt_t3/0, adt_t4/0, adt_t7/0, adt_t8/0, adt_t5/0,
+ c1/2, c2/2, c2/0, c3/0, c4/0, tt1/0, tt2/0,
+ cmp1/0, cmp2/0, cmp3/0, cmp4/0,
+ ty_cmp1/0, ty_cmp2/0, ty_cmp3/0, ty_cmp4/0,
+ f1/0, f2/0, adt_f1/0, adt_f2/0, f3/0, f4/0, adt_f3/0, adt_f4/0,
+ adt_f4_a/0, adt_f4_b/0,
+ bool_t1/0, bool_t2/0, bool_t3/0, bool_t4/0, bool_t5/1, bool_t6/1,
+ bool_t7/0, bool_adt_t1/0, bool_adt_t2/0, bool_adt_t5/1,
+ bool_adt_t6/1, bool_t8/0, bool_adt_t8/2, bool_t9/0, bool_adt_t9/2,
+ bit_t1/0, bit_adt_t1/0, bit_t3/1, bit_adt_t2/0, bit_adt_t3/1,
+ bit_t5/1, bit_t4/1, bit_adt_t4/1, bit_t5/0, bit_adt_t5/0,
+ call_f/1, call_f_adt/1, call_m_adt/1, call_m/1, call_f_i/1,
+ call_m_i/1, call_m_adt_i/1, call_f_adt_i/1,
+ eq1/0, eq2/0, c5/0, c6/2, c7/2, c8/0]).
+
+%%% Equal opaque types
+
+-export_type([o1/0, o2/0]).
+
+-export_type([d1/0, d2/0]).
+
+-opaque o1() :: a | b | c.
+
+-opaque o2() :: a | b | c.
+
+-export_type([i1/0, i2/0, di1/0, di2/0]).
+
+-export_type([b1/0, b2/0]).
+
+-export_type([bit1/0]).
+
+-export_type([a/0, i/0]).
+
+%% The derived spec is
+%% -spec t1('a' | 'b') -> simple1_api:o1('a') | simple1_api:o2('a').
+%% but that is not tested...
+
+t1(a) ->
+ o1();
+t1(b) ->
+ o2().
+
+-spec o1() -> o1().
+
+o1() -> a.
+
+-spec o2() -> o2().
+
+o2() -> a.
+
+%% The derived spec is
+%% -spec adt_t1('a' | 'b') -> simple1_adt:o1('a') | simple1_adt:o2('a').
+%% but that is not tested...
+
+adt_t1(a) ->
+ simple1_adt:o1();
+adt_t1(b) ->
+ simple1_adt:o2().
+
+%%% Disjunct opaque types
+
+-opaque d1() :: a | b | c.
+
+-opaque d2() :: d | e | f.
+
+%% -spec t2('a' | 'b') -> simple1_api:d1('a') | simple1_api:d2('d').
+
+t2(a) ->
+ d1();
+t2(b) ->
+ d2().
+
+-spec d1() -> d1().
+
+d1() -> a.
+
+-spec d2() -> d2().
+
+d2() -> d.
+
+%% -spec adt_t2('a' | 'b') -> simple1_adt:d1('a') | simple1_adt:d2('d').
+
+adt_t2(a) ->
+ simple1_adt:d1();
+adt_t2(b) ->
+ simple1_adt:d2().
+
+-spec tup() -> simple1_adt:tuple1(). % invalid type spec
+
+tup() ->
+ {a, b}.
+
+%%% Matching equal opaque types with different names
+
+t3() ->
+ A = n1(),
+ B = n2(),
+ A = A, % OK, of course
+ A = B. % OK since o1() and o2() are local opaque types
+
+t4() ->
+ A = n1(),
+ B = n2(),
+ true = A =:= A, % OK, of course
+ A =:= B. % OK since o1() and o2() are local opaque types
+
+t5() ->
+ A = d1(),
+ B = d2(),
+ A =:= B. % can never evaluate to true
+
+t6() ->
+ A = d1(),
+ B = d2(),
+ A = B. % can never succeed
+
+t7() ->
+ A = d1(),
+ B = d2(),
+ A =/= B. % OK (always true?)
+
+t8() ->
+ A = d1(),
+ B = d2(),
+ A /= B. % OK (always true?)
+
+-spec n1() -> o1().
+
+n1() -> a.
+
+-spec n2() -> o2().
+
+n2() -> a.
+
+adt_t3() ->
+ A = simple1_adt:n1(),
+ B = simple1_adt:n2(),
+ true = A =:= A, % OK.
+ A =:= B. % opaque test, not OK
+
+adt_t4() ->
+ A = simple1_adt:n1(),
+ B = simple1_adt:n2(),
+ A = A, % OK
+ A = B. % opaque term
+
+adt_t7() ->
+ A = simple1_adt:n1(),
+ B = simple1_adt:n2(),
+ false = A =/= A, % OK
+ A =/= B. % opaque test, not OK
+
+adt_t8() ->
+ A = simple1_adt:n1(),
+ B = simple1_adt:n2(),
+ false = A /= A, % OK
+ A /= B. % opaque test, not OK
+
+adt_t5() ->
+ A = simple1_adt:c1(),
+ B = simple1_adt:c2(),
+ A =:= B. % opaque test, not OK
+
+%% Comparison in guard
+
+-spec c1(simple1_adt:d1(), simple1_adt:d2()) -> boolean().
+
+c1(A, B) when A =< B -> true. % succ type of A and B is any() (type spec is OK)
+
+-spec c2(simple1_adt:d1(), simple1_adt:d2()) -> boolean().
+
+c2(A, B) ->
+ if A =< B -> true end. % succ type of A and B is any() (type spec is OK)
+
+c2() ->
+ A = simple1_adt:d1(),
+ B = simple1_adt:d2(),
+ if A =< B -> ok end. % opaque term
+
+c3() ->
+ B = simple1_adt:d2(),
+ if a =< B -> ok end. % opaque term
+
+c4() ->
+ A = simple1_adt:d1(),
+ if A =< d -> ok end. % opaque term
+
+tt1() ->
+ A = o1(),
+ is_integer(A). % OK
+
+tt2() ->
+ A = simple1_adt:d1(),
+ is_integer(A). % breaks the opaqueness
+
+%% Comparison with integers
+
+-opaque i1() :: 1 | 2.
+
+-opaque i2() :: 1 | 2.
+
+-opaque di1() :: 1 | 2.
+
+-opaque di2() :: 3 | 4.
+
+-spec i1() -> i1().
+
+i1() -> 1.
+
+-type ty_i1() :: 1 | 2.
+
+-spec ty_i1() -> ty_i1().
+
+ty_i1() -> 1.
+
+cmp1() ->
+ A = i1(),
+ if A > 3 -> ok end. % can never succeed
+
+cmp2() ->
+ A = simple1_adt:i1(),
+ if A > 3 -> ok end. % opaque term
+
+cmp3() ->
+ A = i1(),
+ if A < 3 -> ok end.
+
+cmp4() ->
+ A = simple1_adt:i1(),
+ if A < 3 -> ok end. % opaque term
+
+%% -type
+
+ty_cmp1() ->
+ A = ty_i1(),
+ if A > 3 -> ok end. % can never succeed
+
+ty_cmp2() ->
+ A = simple1_adt:ty_i1(),
+ if A > 3 -> ok end. % can never succeed
+
+ty_cmp3() ->
+ A = ty_i1(),
+ if A < 3 -> ok end.
+
+ty_cmp4() ->
+ A = simple1_adt:ty_i1(),
+ if A < 3 -> ok end.
+
+%% is_function
+
+f1() ->
+ T = n1(),
+ if is_function(T) -> ok end. % can never succeed
+
+f2() ->
+ T = n1(),
+ is_function(T). % ok
+
+adt_f1() ->
+ T = simple1_adt:n1(),
+ if is_function(T) -> ok end. % breaks the opaqueness
+
+adt_f2() ->
+ T = simple1_adt:n1(),
+ is_function(T). % breaks the opaqueness
+
+f3() ->
+ A = i1(),
+ T = n1(),
+ if is_function(T, A) -> ok end. % can never succeed
+
+f4() ->
+ A = i1(),
+ T = n1(),
+ is_function(T, A). % ok
+
+adt_f3() ->
+ A = simple1_adt:i1(),
+ T = simple1_adt:n1(),
+ if is_function(T, A) -> ok end. % breaks the opaqueness
+
+adt_f4() ->
+ A = simple1_adt:i1(),
+ T = simple1_adt:n1(),
+ is_function(T, A). % breaks the opaqueness
+
+adt_f4_a() ->
+ A = simple1_adt:i1(),
+ T = n1(),
+ is_function(T, A). % opaque term
+
+
+adt_f4_b() ->
+ A = i1(),
+ T = simple1_adt:n1(),
+ is_function(T, A). % breaks the opaqueness
+
+%% A few Boolean examples
+
+bool_t1() ->
+ B = b2(),
+ if B -> ok end. % B =:= true can never succeed
+
+bool_t2() ->
+ A = b1(),
+ B = b2(),
+ if A and not B -> ok end.
+
+bool_t3() ->
+ A = b1(),
+ if not A -> ok end. % can never succeed
+
+bool_t4() ->
+ A = n1(),
+ if not ((A >= 1) and not (A < 1)) -> ok end. % can never succeed
+
+-spec bool_t5(i1()) -> integer().
+
+bool_t5(A) ->
+ if [not (A > 1)] =:=
+ [false]-> 1 end.
+
+-spec bool_t6(b1()) -> integer().
+
+bool_t6(A) ->
+ if [not A] =:=
+ [false]-> 1 end.
+
+-spec bool_t7() -> integer().
+
+bool_t7() ->
+ A = i1(),
+ if [not A] =:= % cannot succeed
+ [false]-> 1 end.
+
+bool_adt_t1() ->
+ B = simple1_adt:b2(),
+ if B -> ok end. % opaque term
+
+bool_adt_t2() ->
+ A = simple1_adt:b1(),
+ B = simple1_adt:b2(),
+ if A and not B -> ok end. % opaque term
+
+-spec bool_adt_t5(simple1_adt:i1()) -> integer().
+
+bool_adt_t5(A) ->
+ if [not (A > 1)] =:= % succ type of A is any() (type spec is OK)
+ [false]-> 1 end.
+
+-spec bool_adt_t6(simple1_adt:b1()) -> integer(). % invalid type spec
+
+bool_adt_t6(A) ->
+ if [not A] =:= % succ type of A is 'true'
+ [false]-> 1 end.
+
+-spec bool_t8() -> integer().
+
+bool_t8() ->
+ A = i1(),
+ if [A and A] =:= % cannot succeed
+ [false]-> 1 end.
+
+-spec bool_adt_t8(simple1_adt:b1(), simple1_adt:b2()) -> integer(). % invalid
+
+bool_adt_t8(A, B) ->
+ if [A and B] =:=
+ [false]-> 1 end.
+
+-spec bool_t9() -> integer().
+
+bool_t9() ->
+ A = i1(),
+ if [A or A] =:= % cannot succeed
+ [false]-> 1 end.
+
+-spec bool_adt_t9(simple1_adt:b1(), simple1_adt:b2()) -> integer(). % invalid
+
+bool_adt_t9(A, B) ->
+ if [A or B] =:=
+ [false]-> 1 end.
+
+-opaque b1() :: boolean().
+
+-opaque b2() :: boolean().
+
+-spec b1() -> b1().
+
+b1() -> true.
+
+-spec b2() -> b2().
+
+b2() -> false.
+
+%% Few (very few...) examples with bit syntax
+
+bit_t1() ->
+ A = i1(),
+ <<100:(A)>>.
+
+bit_adt_t1() ->
+ A = simple1_adt:i1(),
+ <<100:(A)>>. % breaks the opaqueness
+
+bit_t3(A) ->
+ B = i1(),
+ case none:none() of
+ <<A:B>> -> 1
+ end.
+
+bit_adt_t2() ->
+ A = simple1_adt:i1(),
+ case <<"hej">> of
+ <<_:A>> -> ok % breaks the opaqueness (but the message is strange)
+ end.
+
+
+bit_adt_t3(A) ->
+ B = simple1_adt:i1(),
+ case none:none() of
+ <<A: % breaks the opaqueness (the message is less than perfect)
+ B>> -> 1
+ end.
+
+bit_t5(A) ->
+ B = o1(),
+ case none:none() of
+ <<A:B>> -> 1 % breaks the opaqueness
+ end.
+
+-spec bit_t4(<<_:1>>) -> integer().
+
+bit_t4(A) ->
+ Sz = i1(),
+ case A of
+ <<_:Sz>> -> 1
+ end.
+
+-spec bit_adt_t4(<<_:1>>) -> integer().
+
+bit_adt_t4(A) ->
+ Sz = simple1_adt:i1(),
+ case A of
+ <<_:Sz>> -> 1 % breaks the opaqueness
+ end.
+
+bit_t5() ->
+ A = bit1(),
+ case A of
+ <<_/binary>> -> 1
+ end.
+
+bit_adt_t5() ->
+ A = simple1_adt:bit1(),
+ case A of
+ <<_/binary>> -> 1 % breaks the opaqueness
+ end.
+
+-opaque bit1() :: binary().
+
+-spec bit1() -> bit1().
+
+bit1() ->
+ <<"hej">>.
+
+%% Calls with variable module or function
+
+call_f(A) ->
+ A = a(),
+ foo:A(A).
+
+call_f_adt(A) ->
+ A = simple1_adt:a(),
+ foo:A(A). % breaks the opaqueness
+
+call_m(A) ->
+ A = a(),
+ A:foo(A).
+
+call_m_adt(A) ->
+ A = simple1_adt:a(),
+ A:foo(A). % breaks the opaqueness
+
+-opaque a() :: atom().
+
+-opaque i() :: integer().
+
+-spec a() -> a().
+
+a() ->
+ e.
+
+call_f_i(A) ->
+ A = i(),
+ foo:A(A). % A is not atom() but i()
+
+call_f_adt_i(A) ->
+ A = simple1_adt:i(),
+ foo:A(A). % A is not atom() but simple1_adt:i()
+
+call_m_i(A) ->
+ A = i(),
+ A:foo(A). % A is not atom() but i()
+
+call_m_adt_i(A) ->
+ A = simple1_adt:i(),
+ A:foo(A). % A is not atom() but simple1_adt:i()
+
+-spec eq1() -> integer().
+
+eq1() ->
+ A = simple1_adt:d2(),
+ B = simple1_adt:d1(),
+ if
+ A == B -> % opaque term
+ 0;
+ A == A ->
+ 1;
+ A =:= A -> % compiler finds this one cannot match
+ 2;
+ true -> % compiler finds this one cannot match
+ 3
+ end.
+
+eq2() ->
+ A = simple1_adt:d1(),
+ if
+ {A} >= {A} ->
+ 1;
+ A >= 3 -> % opaque term
+ 2;
+ A == 3 -> % opaque term
+ 3;
+ A =:= 3 -> % opaque term
+ 4;
+ A == A ->
+ 5;
+ A =:= A -> % compiler finds this one cannot match
+ 6
+ end.
+
+c5() ->
+ A = simple1_adt:d1(),
+ A < 3. % opaque term
+
+c6(A, B) ->
+ A = simple1_adt:d1(),
+ B = simple1_adt:d1(),
+ A =< B. % same type - no warning
+
+c7(A, B) ->
+ A = simple1_adt:d1(),
+ B = simple1_adt:d2(),
+ A =< B. % opaque term
+
+c8() ->
+ D = digraph:new(),
+ E = ets:new(foo, []),
+ if {D, a} > {D, E} -> true; % OK
+ {1.0, 2} > {{D}, {E}} -> true; % OK
+ {D, 3} > {D, E} -> true % opaque term 2
+ end.
+
+-spec i() -> i().
+
+i() ->
+ 1.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple2_api.erl b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple2_api.erl
new file mode 100644
index 0000000000..c86f6fd0b5
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/simple/simple2_api.erl
@@ -0,0 +1,125 @@
+-module(simple2_api).
+
+-export([c1/2, c2/0, c3/0, c4/1, c5/1, c6/0, c6_b/0, c7/0, c7_b/0,
+ c7_c/0, c8/0, c9/0, c10/0, c11/0, c12/0, c13/0, c14/0, c15/0,
+ c16/0, c17/0, c18/0, c19/0, c20/0, c21/0, c22/0, c23/0,
+ c24/0, c25/0, c26/0]).
+
+-spec c1(simple1_adt:d1(), simple1_adt:d2()) -> boolean().
+
+c1(A, B) ->
+ {A} =< {B}. % succ type of A and B is any()
+
+c2() ->
+ A = simple1_adt:d1(),
+ erlang:make_tuple(1, A). % ok
+
+c3() ->
+ A = simple1_adt:d1(),
+ setelement(1, {A}, A). % ok
+
+c4(_) ->
+ A = simple1_adt:d1(),
+ halt(A). % ok (BIF fails...)
+
+c5(_) ->
+ A = simple1_adt:d1(),
+ [A] -- [A]. % ok
+
+c6() ->
+ A = simple1_adt:d1(),
+ A ! foo. % opaque term
+
+c6_b() ->
+ A = simple1_adt:d1(),
+ erlang:send(A, foo). % opaque term
+
+c7() ->
+ A = simple1_adt:d1(),
+ foo ! A. % ok
+
+c7_b() ->
+ A = simple1_adt:d1(),
+ erlang:send(foo, A). % ok
+
+c7_c() ->
+ A = simple1_adt:d1(),
+ erlang:send(foo, A, []). % ok
+
+c8() ->
+ A = simple1_adt:d1(),
+ A < 3. % opaque term
+
+c9() ->
+ A = simple1_adt:d1(),
+ lists:keysearch(A, 1, []). % ok
+
+c10() ->
+ A = simple1_adt:d1(),
+ lists:keysearch(1, A, []). % opaque term 2
+
+c11() ->
+ A = simple1_adt:tuple(),
+ lists:keysearch(key, 1, [A]). % ok
+
+c12() ->
+ A = simple1_adt:tuple(),
+ lists:keysearch(key, 1, A). % opaque term 3
+
+c13() ->
+ A = simple1_adt:tuple(),
+ lists:keysearch(key, 1, [{A,2}]). % ok
+
+c14() ->
+ A = simple1_adt:tuple(),
+ lists:keysearch(key, 1, [{2,A}]). % ok
+
+c15() ->
+ A = simple1_adt:d1(),
+ lists:keysearch(key, 1, [A]). % ok
+
+c16() ->
+ A = simple1_adt:tuple(),
+ erlang:send(foo, A). % ok
+
+c17() ->
+ A = simple1_adt:tuple(),
+ lists:reverse([A]). % ok
+
+c18() ->
+ A = simple1_adt:tuple(),
+ lists:keyreplace(a, 1, [A], {1,2}). % ok
+
+c19() ->
+ A = simple1_adt:tuple(),
+ %% Problem. The spec says argument 4 is a tuple(). Fix that!
+ lists:keyreplace(a, 1, [{1,2}], A). % opaque term 4
+
+c20() ->
+ A = simple1_adt:tuple(),
+ lists:flatten(A). % opaque term 1
+
+c21() ->
+ A = simple1_adt:tuple(),
+ lists:flatten([[{A}]]). % ok
+
+c22() ->
+ A = simple1_adt:tuple(),
+ lists:flatten([[A]]). % ok
+
+c23() ->
+ A = simple1_adt:tuple(),
+ lists:flatten([A]). % ok
+
+c24() ->
+ A = simple1_adt:tuple(),
+ lists:flatten({A}). % will never return
+
+c25() ->
+ A = simple1_adt:d1(),
+ B = simple1_adt:tuple(),
+ if {A,3} > {A,B} -> true end. % opaque 2nd argument
+
+c26() ->
+ B = simple1_adt:tuple(),
+ tuple_to_list(B). % opaque term 1
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl
index 5ca3202bba..d88f238190 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/union/union_adt.erl
@@ -1,10 +1,15 @@
-module(union_adt).
-export([new/1, new_a/1, new_rec/1]).
+%% Now (R17) that opaque types are no longer recognized by their shape
+%% this test case is rather meaningless.
+
-record(rec, {x = 42 :: integer()}).
-opaque u() :: 'aaa' | 'bbb' | #rec{}.
+-spec new(_) -> u().
+
new(a) -> aaa;
new(b) -> bbb;
new(X) when is_integer(X) ->
@@ -13,7 +18,11 @@ new(X) when is_integer(X) ->
%% the following two functions (and their uses in union_use.erl) test
%% that the return type is the opaque one and not just a subtype of it
+-spec new_a(_) -> u().
+
new_a(a) -> aaa.
+-spec new_rec(_) -> u().
+
new_rec(X) when is_integer(X) ->
#rec{x = X}.
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_adt.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_adt.erl
new file mode 100644
index 0000000000..c742990c6a
--- /dev/null
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_adt.erl
@@ -0,0 +1,5 @@
+-module(zoltan_adt).
+
+-export_type([id/0]).
+
+-opaque id() :: string().
diff --git a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl
index b62b9de576..07c9f0a270 100644
--- a/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl
+++ b/lib/dialyzer/test/opaque_SUITE_data/src/zoltan_kis3.erl
@@ -2,13 +2,13 @@
-export([f/0, gen/0]).
--opaque id() :: string().
+%-opaque id() :: string().
-spec f() -> char().
%% List pattern matching issue
f() -> [H|_T] = gen(), H.
--spec gen() -> id().
+-spec gen() -> zoltan_adt:id().
gen() -> "Dummy".
diff --git a/lib/dialyzer/vsn.mk b/lib/dialyzer/vsn.mk
index af32c5b901..95d2464e1d 100644
--- a/lib/dialyzer/vsn.mk
+++ b/lib/dialyzer/vsn.mk
@@ -1 +1 @@
-DIALYZER_VSN = 2.6.1
+DIALYZER_VSN = 2.7
diff --git a/lib/diameter/bin/diameterc b/lib/diameter/bin/diameterc
index d31f341c36..2c9a8f555c 100755
--- a/lib/diameter/bin/diameterc
+++ b/lib/diameter/bin/diameterc
@@ -4,7 +4,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -74,7 +74,7 @@ compile(#argv{file = File, options = Opts, output = Out}) ->
ok ->
0;
{error, Reason} ->
- error_msg(Reason, []),
+ error_msg(diameter_make:format_error(Reason), []),
1
catch
error: Reason ->
diff --git a/lib/diameter/doc/src/diameter.xml b/lib/diameter/doc/src/diameter.xml
index 4804b07b30..7d6a28e51c 100644
--- a/lib/diameter/doc/src/diameter.xml
+++ b/lib/diameter/doc/src/diameter.xml
@@ -20,7 +20,8 @@
<header>
<copyright>
-<year>2011</year><year>2013</year>
+<year>2011</year>
+<year>2014</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -355,8 +356,8 @@ question communicates an address list as described in
<tag><c>{'Origin-State-Id', &dict_Unsigned32;}</c></tag>
<item>
<p>
-Origin-State-Id is optional but will be included in outgoing messages
-sent by diameter itself: CER/CEA, DWR/DWA and DPR/DPA.
+Origin-State-Id is optional but, if configured, will be included in
+outgoing CER/CEA and DWR/DWA messages.
Setting a value of <c>0</c> (zero) is equivalent to not setting a
value, as documented in &the_rfc;.
The function &origin_state_id;
diff --git a/lib/diameter/doc/src/diameter_make.xml b/lib/diameter/doc/src/diameter_make.xml
index e1673378df..13ec5bbfc1 100644
--- a/lib/diameter/doc/src/diameter_make.xml
+++ b/lib/diameter/doc/src/diameter_make.xml
@@ -16,7 +16,7 @@
<header>
<copyright>
<year>2012</year>
-<year>2013</year>
+<year>2014</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -175,6 +175,10 @@ Note that a dictionary's <c>&dict_name;</c>, together with the
The <c>&dict_name;</c> of a literal input dictionary defaults to
<c>dictionary</c>.</p>
+<p>
+A returned error reason can be converted into a readable string using
+&format_error;.</p>
+
</desc>
</func>
@@ -206,6 +210,18 @@ The return value is also a parsed dictionary.</p>
</desc>
</func>
+<!-- ===================================================================== -->
+
+<func>
+<name>format_error(Reason) -> string()</name>
+<fsummary>Turn an error reason into a readable string.</fsummary>
+<desc>
+
+<p>
+Turn an error reason returned by &codec; into a readable string.</p>
+</desc>
+</func>
+
</funcs>
<!-- ===================================================================== -->
diff --git a/lib/diameter/doc/src/diameter_sctp.xml b/lib/diameter/doc/src/diameter_sctp.xml
index fb7075f2cd..6302cb1435 100644
--- a/lib/diameter/doc/src/diameter_sctp.xml
+++ b/lib/diameter/doc/src/diameter_sctp.xml
@@ -15,7 +15,8 @@
<erlref>
<header>
<copyright>
-<year>2011</year><year>2013</year>
+<year>2011</year>
+<year>2014</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -113,7 +114,7 @@ and port respectively.</p>
<p>
Multiple <c>ip</c> options can be specified for a multihomed peer.
If none are specified then the values of <c>Host-IP-Address</c>
-in the <c>#diameter_service{}</c> record are used.
+in the <c>diameter_service</c> record are used.
(In particular, one of these must be specified.)
Option <c>port</c> defaults to 3868 for a listening transport and 0 for a
connecting transport.</p>
@@ -131,25 +132,18 @@ the buffer size.</p>
</warning>
<p>
-diameter_sctp uses the <c>transport_data</c> field of
-the <c>#diameter_packet{}</c> record to communicate the stream on which an
-inbound message has been received, or on which an outbound message
-should be sent: the value will be of the form <c>{stream, Id}</c>
-on an inbound message passed to a &app_handle_request; or
-&app_handle_answer; callback.
-For an outbound message, either <c>undefined</c> (explicitly or
-by receiving the outbound message as a <c>binary()</c>) or a tuple
-should be set in the return value of &app_handle_request;
-(typically by retaining the value passed into this function)
-or &app_prepare_request;.
-The value <c>undefined</c> uses a "next outbound stream" id and
-increments this modulo the total number outbound streams.
-That is, successive values of <c>undefined</c> cycle through all
-outbound streams.</p>
-
-<!-- TODO: Some way of getting at the number of available outbound -->
-<!-- streams. -->
-
+The <c>transport_data</c> field of record <c>diameter_packet</c>
+is used to communicate the stream on which an inbound message
+has been received, or on which an outbound message should be sent.
+The value will be of the form <c>{stream, Id}</c> for an inbound
+message passed to a &app_handle_request; or &app_handle_answer;
+callback.
+For an outbound message, <c>{outstream, Id}</c> in the return value of
+&app_handle_request; or &app_prepare_retransmit; sets the outbound
+stream, the stream id being interpreted modulo the number of outbound
+streams.
+Any other value, or not setting a value, causes successive such sends
+to cycle though all outbound streams.</p>
</desc>
</func>
diff --git a/lib/diameter/doc/src/seealso.ent b/lib/diameter/doc/src/seealso.ent
index 7bf7460351..44541afb9b 100644
--- a/lib/diameter/doc/src/seealso.ent
+++ b/lib/diameter/doc/src/seealso.ent
@@ -4,7 +4,7 @@
%CopyrightBegin%
-Copyright Ericsson AB 2012-2013. All Rights Reserved.
+Copyright Ericsson AB 2012-2014. All Rights Reserved.
The contents of this file are subject to the Erlang Public License,
Version 1.1, (the "License"); you may not use this file except in
@@ -117,6 +117,7 @@ significant.
<!ENTITY make_codec '<seealso marker="diameter_make#codec-2">diameter_make:codec/2</seealso>'>
<!ENTITY make_format '<seealso marker="diameter_make#format-1">diameter_make:format/1</seealso>'>
<!ENTITY make_flatten '<seealso marker="diameter_make#flatten-1">diameter_make:flatten/1</seealso>'>
+<!ENTITY make_format_error '<seealso marker="diameter_make#format_error-1">diameter_make:format_error/1</seealso>'>
<!-- diameter_transport -->
diff --git a/lib/diameter/src/base/diameter_peer_fsm.erl b/lib/diameter/src/base/diameter_peer_fsm.erl
index 282276827f..f76bd96c3c 100644
--- a/lib/diameter/src/base/diameter_peer_fsm.erl
+++ b/lib/diameter/src/base/diameter_peer_fsm.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -189,11 +189,7 @@ i({Ack, WPid, {M, Ref} = T, Opts, {Mask, Nodes, Dict0, Svc}}) ->
putr(?RESTRICT_KEY, Nodes),
Tmo = proplists:get_value(capx_timeout, Opts, ?EVENT_TIMEOUT),
- ?IS_TIMEOUT(Tmo) orelse ?ERROR({invalid, {capx_timeout, Tmo}}),
OnLengthErr = proplists:get_value(length_errors, Opts, exit),
- lists:member(OnLengthErr, [exit, handle, discard])
- orelse ?ERROR({invalid, {length_errors, OnLengthErr}}),
- %% Error checking is for configuration added in old code.
{TPid, Addrs} = start_transport(T, Rest, Svc),
@@ -782,10 +778,6 @@ set([_|_] = Ans, FailedAvp) ->
result_code(#diameter_header{is_error = true}, _) ->
{3008, []}; %% DIAMETER_INVALID_HDR_BITS
-result_code(_, [Bs|_])
- when is_bitstring(Bs) -> %% from old code
- {3009, []}; %% DIAMETER_INVALID_HDR_BITS
-
result_code(#diameter_header{version = ?DIAMETER_VERSION}, Es) ->
rc(Es);
diff --git a/lib/diameter/src/base/diameter_service.erl b/lib/diameter/src/base/diameter_service.erl
index 70e66537ed..1274e0fc48 100644
--- a/lib/diameter/src/base/diameter_service.erl
+++ b/lib/diameter/src/base/diameter_service.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -701,8 +701,7 @@ notify(Share, SvcName, T) ->
Nodes = remotes(Share),
[] /= Nodes andalso diameter_peer:notify(Nodes, SvcName, T).
%% Test for the empty list for upgrade reasons: there's no
-%% diameter_peer:notify/3 in old code so no call means no load order
-%% requirement.
+%% diameter_peer:notify/3 in old code.
remotes(false) ->
[];
diff --git a/lib/diameter/src/base/diameter_stats.erl b/lib/diameter/src/base/diameter_stats.erl
index b68d4af11f..8353613d32 100644
--- a/lib/diameter/src/base/diameter_stats.erl
+++ b/lib/diameter/src/base/diameter_stats.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -245,9 +245,6 @@ handle_call({read, Refs, Del}, _From, State) ->
handle_call({read, Refs}, _, State) ->
{reply, read_refs(Refs), State};
-handle_call({flush, Refs}, _From, State) -> %% from old code
- {reply, to_refdict(read(Refs, true)), State};
-
handle_call(Req, From, State) ->
?UNEXPECTED([Req, From]),
{reply, nok, State}.
diff --git a/lib/diameter/src/base/diameter_traffic.erl b/lib/diameter/src/base/diameter_traffic.erl
index 8b6f026b34..7fbb306b02 100644
--- a/lib/diameter/src/base/diameter_traffic.erl
+++ b/lib/diameter/src/base/diameter_traffic.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -90,9 +90,6 @@ make_recvdata([SvcName, PeerT, Apps, Mask | _]) ->
peerT = PeerT,
apps = Apps,
sequence = Mask}.
-%% Take a list so that the caller (diameter_service) can be upgraded
-%% first if new members are added. Note that receive_message/4 might
-%% still get an old term from any watchdog started in old code.
%% ---------------------------------------------------------------------------
%% peer_up/1
@@ -305,15 +302,6 @@ errors(_, #diameter_packet{header = #diameter_header{version = V},
when V /= ?DIAMETER_VERSION ->
Pkt#diameter_packet{errors = [5011 | Es]};
-%% DIAMETER_INVALID_AVP_BITS 3009
-%% A request was received that included an AVP whose flag bits are
-%% set to an unrecognized value, or that is inconsistent with the
-%% AVP's definition.
-
-errors(_, #diameter_packet{errors = [Bs | Es]} = Pkt)
- when is_bitstring(Bs) -> %% from old code
- Pkt#diameter_packet{errors = [3009 | Es]};
-
%% DIAMETER_COMMAND_UNSUPPORTED 3001
%% The Request contained a Command-Code that the receiver did not
%% recognize or support. This MUST be used when a Diameter node
diff --git a/lib/diameter/src/base/diameter_watchdog.erl b/lib/diameter/src/base/diameter_watchdog.erl
index 9a1c8b6585..53e659e3f6 100644
--- a/lib/diameter/src/base/diameter_watchdog.erl
+++ b/lib/diameter/src/base/diameter_watchdog.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -157,8 +157,7 @@ wait(Ref, Pid) ->
config(Opts) ->
Config = proplists:get_value(watchdog_config, Opts, []),
- is_list(Config) orelse config_error({watchdog_config, Config}),
- lists:foldl(fun config/2, #config{}, Config). %% ^ added in old code
+ lists:foldl(fun config/2, #config{}, Config).
config({suspect, N}, Rec)
when ?IS_NATURAL(N) ->
@@ -166,10 +165,7 @@ config({suspect, N}, Rec)
config({okay, N}, Rec)
when ?IS_NATURAL(N) ->
- Rec#config{okay = N};
-
-config(T, _) -> %% added in old code
- config_error(T).
+ Rec#config{okay = N}.
%% start/5
@@ -252,17 +248,6 @@ handle_info(T, #watchdog{} = State) ->
?LOG(stop, T),
event(T, State, State#watchdog{status = down}),
{stop, {shutdown, T}, State}
- end;
-
-handle_info(T, State) -> %% started in old code
- handle_info(T, upgrade(State)).
-
-upgrade(State) ->
- case erlang:append_element(State, #config{}) of
- #watchdog{status = okay, config = #config{suspect = OS}} = S ->
- S#watchdog{num_dwa = OS};
- #watchdog{} = S ->
- S
end.
close({'DOWN', _, process, TPid, {shutdown, Reason}},
diff --git a/lib/diameter/src/compiler/diameter_dict_util.erl b/lib/diameter/src/compiler/diameter_dict_util.erl
index 3941f30e03..136bba16cb 100644
--- a/lib/diameter/src/compiler/diameter_dict_util.erl
+++ b/lib/diameter/src/compiler/diameter_dict_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -155,6 +155,8 @@ fmt(grouped_avp_has_wrong_type) ->
"Grouped AVP ~s at line ~p defined with type ~s at line ~p";
fmt(grouped_avp_not_defined) ->
"Grouped AVP ~s on line ~p not defined in @avp_types";
+fmt(grouped_avp_not_grouped) ->
+ "Grouped AVP ~s on line ~p not defined in @grouped";
fmt(grouped_vendor_id_without_flag) ->
"Grouped AVP ~s at line ~p has vendor id "
"but definition at line ~p does not specify V flag";
@@ -401,9 +403,9 @@ read(File) ->
{ok, iolist_to_binary([File])}.
make_dict(Parse, Opts) ->
- make_orddict(pass4(pass3(pass2(pass1(reset(make_dict(Parse),
- Opts))),
- Opts))).
+ Dict = pass3(pass2(pass1(reset(make_dict(Parse), Opts))), Opts),
+ ok = examine(Dict),
+ make_orddict(Dict).
%% make_orddict/1
@@ -1168,7 +1170,7 @@ import_avps(Dict, Opts) ->
Import = inherit(Dict, Opts),
report(imported, Import),
- %% pass4/1 tests that all referenced AVP's are either defined
+ %% examine/1 tests that all referenced AVP's are either defined
%% or imported.
dict:store(import_avps,
@@ -1276,21 +1278,21 @@ dict(Mod) ->
end.
%% ===========================================================================
-%% pass4/1
+%% examine/1
%%
%% Sanity checks.
-pass4(Dict) ->
- dict:fold(fun(K, V, _) -> p4(K, V, Dict) end, ok, Dict),
- Dict.
+examine(Dict) ->
+ dict:fold(fun(K, V, _) -> x(K, V, Dict) end, ok, Dict),
+ ok.
%% Ensure enum AVP's have type Enumerated.
-p4({enum, Name}, [Line | _], Dict)
+x({enum, Name}, [Line | _], Dict)
when is_list(Name) ->
true = is_enumerated_avp(Name, Dict, Line);
%% Ensure all referenced AVP's are either defined locally or imported.
-p4({K, {Name, AvpName}}, [Line | _], Dict)
+x({K, {Name, AvpName}}, [Line | _], Dict)
when (K == grouped orelse K == messages),
is_list(Name),
is_list(AvpName),
@@ -1298,13 +1300,22 @@ p4({K, {Name, AvpName}}, [Line | _], Dict)
true = avp_is_defined(AvpName, Dict, Line);
%% Ditto.
-p4({K, AvpName}, [Line | _], Dict)
+x({K, AvpName}, [Line | _], Dict)
when K == avp_vendor_id;
K == custom_types;
K == codecs ->
true = avp_is_defined(AvpName, Dict, Line);
-p4(_, _, _) ->
+%% Ensure that all local AVP's of type Grouped are also present in @grouped.
+x({avp_types, Name}, [Line | Toks], Dict)
+ when 0 < Line, is_list(Name) ->
+ [{number, _, _Code}, {word, _, Type}, {word, _, _Flags}] = Toks,
+ "Grouped" == Type
+ andalso error == dict:find({grouped, Name}, Dict)
+ andalso ?RETURN(grouped_avp_not_grouped, [Name, Line]),
+ ok;
+
+x(_, _, _) ->
ok.
%% has_enumerated_type/3
diff --git a/lib/diameter/src/compiler/diameter_make.erl b/lib/diameter/src/compiler/diameter_make.erl
index 2f314b7e57..adc7808e49 100644
--- a/lib/diameter/src/compiler/diameter_make.erl
+++ b/lib/diameter/src/compiler/diameter_make.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -33,7 +33,8 @@
-export([codec/2,
codec/1,
format/1,
- flatten/1]).
+ flatten/1,
+ format_error/1]).
-export_type([opt/0]).
@@ -81,8 +82,8 @@ codec(File, Opts) ->
case parse(Dict, Opts) of
{ok, ParseD} ->
make(Path, default(Opts), ParseD);
- {error = E, Reason} ->
- {E, diameter_dict_util:format_error(Reason)}
+ {error, _} = E ->
+ E
end.
codec(File) ->
@@ -115,6 +116,11 @@ flatten([?VERSION = V | Dict]) ->
[grouped, import_groups],
[enum, import_enums]])].
+%% format_error/1
+
+format_error(T) ->
+ diameter_dict_util:format_error(T).
+
%% ===========================================================================
%% flatten/2
diff --git a/lib/diameter/src/diameter.appup.src b/lib/diameter/src/diameter.appup.src
index c7ae8a2828..0d421c229e 100644
--- a/lib/diameter/src/diameter.appup.src
+++ b/lib/diameter/src/diameter.appup.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -20,62 +20,37 @@
{"%VSN%",
[
- {"0.9", [{restart_application, diameter}]}, %% R14B03
- {"0.10", [{restart_application, diameter}]}, %% R14B04
- {"1.0", [{restart_application, diameter}]}, %% R15B
- {"1.1", [{restart_application, diameter}]}, %% R15B01
- {"1.2", [{restart_application, diameter}]}, %% R15B02
- {"1.2.1", [{restart_application, diameter}]},
- {"1.3", [{restart_application, diameter}]}, %% R15B03
- {"1.3.1", [{restart_application, diameter}]},
- {"1.4", [{restart_application, diameter}]}, %% R16A
- {"1.4.1", [{restart_application, diameter}]}, %% R16B
+ {"0.9", [{restart_application, diameter}]}, %% R14B03
+ {"0.10", [{restart_application, diameter}]}, %% R14B04
+ {"1.0", [{restart_application, diameter}]}, %% R15B
+ {"1.1", [{restart_application, diameter}]}, %% R15B01
+ {"1.2", [{restart_application, diameter}]}, %% R15B02
+ {"1.2.1", [{restart_application, diameter}]},
+ {"1.3", [{restart_application, diameter}]}, %% R15B03
+ {"1.3.1", [{restart_application, diameter}]},
+ {"1.4", [{restart_application, diameter}]}, %% R16A
+ {"1.4.1", [{restart_application, diameter}]}, %% R16B
{"1.4.1.1", [{restart_application, diameter}]},
- {"1.4.2", [{load_module, diameter_codec}, %% R16B01
- {load_module, diameter_types},
- {load_module, diameter_config},
- {load_module, diameter_capx},
- {load_module, diameter_service},
- {load_module, diameter_peer_fsm},
- {load_module, diameter_watchdog},
- {load_module, diameter}]},
- {"1.4.3", [{load_module, diameter_capx}, %% R16B02
- {load_module, diameter_service},
- {load_module, diameter_watchdog},
- {load_module, diameter_codec},
- {load_module, diameter_types},
- {load_module, diameter_config},
- {load_module, diameter}]},
- {"1.4.4", [{load_module, diameter_capx},
- {load_module, diameter_service},
- {load_module, diameter_watchdog},
- {load_module, diameter_config},
- {load_module, diameter}]}
+ {"1.4.2", [{restart_application, diameter}]}, %% R16B01
+ {"1.4.3", [{restart_application, diameter}]}, %% R16B02
+ {"1.4.4", [{restart_application, diameter}]},
+ {"1.5", [{restart_application, diameter}]} %% R16B03
],
[
- {"0.9", [{restart_application, diameter}]},
- {"0.10", [{restart_application, diameter}]},
- {"1.0", [{restart_application, diameter}]},
- {"1.1", [{restart_application, diameter}]},
- {"1.2", [{restart_application, diameter}]},
- {"1.2.1", [{restart_application, diameter}]},
- {"1.3", [{restart_application, diameter}]},
- {"1.3.1", [{restart_application, diameter}]},
- {"1.4", [{restart_application, diameter}]},
- {"1.4.1", [{restart_application, diameter}]},
+ {"0.9", [{restart_application, diameter}]},
+ {"0.10", [{restart_application, diameter}]},
+ {"1.0", [{restart_application, diameter}]},
+ {"1.1", [{restart_application, diameter}]},
+ {"1.2", [{restart_application, diameter}]},
+ {"1.2.1", [{restart_application, diameter}]},
+ {"1.3", [{restart_application, diameter}]},
+ {"1.3.1", [{restart_application, diameter}]},
+ {"1.4", [{restart_application, diameter}]},
+ {"1.4.1", [{restart_application, diameter}]},
{"1.4.1.1", [{restart_application, diameter}]},
- {"1.4.2", [{restart_application, diameter}]},
- {"1.4.3", [{load_module, diameter_types},
- {load_module, diameter_config},
- {load_module, diameter_codec},
- {load_module, diameter_service},
- {load_module, diameter_watchdog},
- {load_module, diameter_capx},
- {load_module, diameter}]},
- {"1.4.4", [{load_module, diameter_capx},
- {load_module, diameter_config},
- {load_module, diameter_service},
- {load_module, diameter_watchdog},
- {load_module, diameter}]}
+ {"1.4.2", [{restart_application, diameter}]},
+ {"1.4.3", [{restart_application, diameter}]},
+ {"1.4.4", [{restart_application, diameter}]},
+ {"1.5", [{restart_application, diameter}]}
]
}.
diff --git a/lib/diameter/src/transport/diameter_sctp.erl b/lib/diameter/src/transport/diameter_sctp.erl
index 49a530b4eb..f5275e66b5 100644
--- a/lib/diameter/src/transport/diameter_sctp.erl
+++ b/lib/diameter/src/transport/diameter_sctp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -70,14 +70,14 @@
-type connect_option() :: {raddr, inet:ip_address()}
| {rport, inet:port_number()}
- | gen_sctp:open_option().
+ | term(). %% gen_sctp:open_option().
-type match() :: inet:ip_address()
| string()
| [match()].
-type listen_option() :: {accept, match()}
- | gen_sctp:open_option().
+ | term(). %% gen_sctp:open_option().
-type uint() :: non_neg_integer().
@@ -338,9 +338,6 @@ handle_call({{accept, Ref}, Pid}, _, #listener{ref = Ref,
{TPid, NewS} = accept(Ref, Pid, S),
{reply, {ok, TPid}, NewS#listener{count = N+1}};
-handle_call(T, From, {listener,_,_,_,_,_,_} = S) -> % started in old code
- handle_call(T, From, upgrade(S));
-
handle_call(_, _, State) ->
{reply, nok, State}.
@@ -359,10 +356,7 @@ handle_info(T, #transport{} = S) ->
{noreply, #transport{} = t(T,S)};
handle_info(T, #listener{} = S) ->
- {noreply, #listener{} = l(T,S)};
-
-handle_info(T, {listener,_,_,_,_,_,_} = S) -> % started in old code
- handle_info(T, upgrade(S)).
+ {noreply, #listener{} = l(T,S)}.
%% ---------------------------------------------------------------------------
%% # code_change/3
@@ -396,9 +390,6 @@ terminate(_, #listener{socket = Sock}) ->
%% ---------------------------------------------------------------------------
-upgrade(S) ->
- #listener{} = erlang:append_element(S, ?DEFAULT_ACCEPT).
-
putr(Key, Val) ->
put({?MODULE, Key}, Val).
@@ -502,8 +493,6 @@ transition({peeloff, Sock, {sctp, LSock, _RA, _RP, _Data} = Msg, Matches},
= S) ->
ok = accept_peer(Sock, Matches),
transition(Msg, S#transport{socket = Sock});
-transition({peeloff = T, _Sock, _Msg} = T, #transport{} = S) ->% from old code
- transition(erlang:append_element(T, ?DEFAULT_ACCEPT), S);
%% Incoming message.
transition({sctp, _Sock, _RA, _RP, Data}, #transport{socket = Sock} = S) ->
@@ -605,11 +594,13 @@ accept(_, Pid, #listener{ref = Ref, pending = {N,Q}} = S) ->
%% send/2
%% Outbound Diameter message on a specified stream ...
-send(#diameter_packet{bin = Bin, transport_data = {stream, SId}}, S) ->
- send(SId, Bin, S),
+send(#diameter_packet{bin = Bin, transport_data = {outstream, SId}},
+ #transport{streams = {_, OS}}
+ = S) ->
+ send(SId rem OS, Bin, S),
S;
-%% ... or not: rotate through all steams.
+%% ... or not: rotate through all streams.
send(Bin, #transport{streams = {_, OS},
os = N}
= S)
diff --git a/lib/diameter/test/diameter_compiler_SUITE.erl b/lib/diameter/test/diameter_compiler_SUITE.erl
index ed369e8af3..df4dde6240 100644
--- a/lib/diameter/test/diameter_compiler_SUITE.erl
+++ b/lib/diameter/test/diameter_compiler_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2010-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2010-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -138,6 +138,9 @@
{grouped_avp_not_defined,
"Failed-AVP *.*",
""},
+ {grouped_avp_not_grouped,
+ "Failed-AVP ::=.*\n.*}",
+ ""},
{grouped_vendor_id_without_flag,
"(Failed-AVP .*)>",
"\\1 668>"},
@@ -397,8 +400,8 @@ replace({E, Mods}, Bin) ->
case {E, parse(B, [{include, here()}]), Mods} of
{ok, {ok, Dict}, _} ->
Dict;
- {_, {error, S}, _} ->
- S
+ {_, {error, {E,_} = T}, _} when E /= ok ->
+ diameter_make:format_error(T)
end.
re({RE, Repl}, Bin) ->
diff --git a/lib/diameter/vsn.mk b/lib/diameter/vsn.mk
index 9fda067f2b..54019fa46c 100644
--- a/lib/diameter/vsn.mk
+++ b/lib/diameter/vsn.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2010-2013. All Rights Reserved.
+# Copyright Ericsson AB 2010-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -18,5 +18,5 @@
# %CopyrightEnd%
APPLICATION = diameter
-DIAMETER_VSN = 1.5
+DIAMETER_VSN = 1.6
APP_VSN = $(APPLICATION)-$(DIAMETER_VSN)$(PRE_VSN)
diff --git a/lib/erl_interface/src/connect/ei_connect.c b/lib/erl_interface/src/connect/ei_connect.c
index 8f1f231b82..c9aa28812c 100644
--- a/lib/erl_interface/src/connect/ei_connect.c
+++ b/lib/erl_interface/src/connect/ei_connect.c
@@ -1161,6 +1161,7 @@ static unsigned int gen_challenge(void)
struct utsname name;
} s;
+ memset(&s, 0, sizeof(s));
gettimeofday(&s.tv, 0);
uname(&s.name);
s.cpu = clock();
diff --git a/lib/et/src/Makefile b/lib/et/src/Makefile
index 386169fe95..377e593712 100644
--- a/lib/et/src/Makefile
+++ b/lib/et/src/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2000-2012. All Rights Reserved.
+# Copyright Ericsson AB 2000-2013. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -127,15 +127,12 @@ $(EBIN)/et_selector.$(EMULATOR): et_selector.erl ../include/et.hrl
$(EBIN)/et_contents_viewer.$(EMULATOR): et_contents_viewer.erl ../include/et.hrl et_internal.hrl
-$(EBIN)/et_gs_contents_viewer.$(EMULATOR): et_gs_contents_viewer.erl ../include/et.hrl et_internal.hrl
$(EBIN)/et_wx_contents_viewer.$(EMULATOR): et_wx_contents_viewer.erl ../include/et.hrl et_internal.hrl
$(EBIN)/et_collector.$(EMULATOR): et_collector.erl ../include/et.hrl et_internal.hrl
$(EBIN)/et_viewer.$(EMULATOR): et_viewer.erl ../include/et.hrl et_internal.hrl
-$(EBIN)/et_gs_viewer.$(EMULATOR): et_gs_viewer.erl ../include/et.hrl et_internal.hrl
-
$(EBIN)/et_wx_viewer.$(EMULATOR): et_wx_viewer.erl ../include/et.hrl et_internal.hrl
diff --git a/lib/et/src/et.app.src b/lib/et/src/et.app.src
index fd203e3e44..f7189a4197 100644
--- a/lib/et/src/et.app.src
+++ b/lib/et/src/et.app.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -24,8 +24,6 @@
[
et,
et_collector,
- et_gs_contents_viewer,
- et_gs_viewer,
et_selector,
et_viewer,
et_wx_contents_viewer,
diff --git a/lib/et/src/et_collector.erl b/lib/et/src/et_collector.erl
index a78b30c419..e05c67be60 100644
--- a/lib/et/src/et_collector.erl
+++ b/lib/et/src/et_collector.erl
@@ -409,8 +409,6 @@ report(TH, TraceOrEvent) when is_record(TH, table_handle) ->
report(TH#table_handle.collector_pid, TraceOrEvent)
end
end;
-report(TH, end_of_trace) when is_record(TH, table_handle) ->
- {ok, TH};
report(_, Bad) ->
exit({bad_event, Bad}).
diff --git a/lib/et/src/et_gs_contents_viewer.erl b/lib/et/src/et_gs_contents_viewer.erl
deleted file mode 100644
index 2d414f10b4..0000000000
--- a/lib/et/src/et_gs_contents_viewer.erl
+++ /dev/null
@@ -1,602 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2000-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%% Purpose: Displays details of a trace event
-%%----------------------------------------------------------------------
-
--module(et_gs_contents_viewer).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
--behaviour(gen_server).
-
-%% External exports
--export([start_link/1,
- stop/1]).
-
-%% gen_server callbacks
--export([init/1, terminate/2, code_change/3,
- handle_call/3, handle_cast/2, handle_info/2]).
-
--include("../include/et.hrl").
--include("et_internal.hrl").
-
--record(state, {parent_pid, % Pid of parent process
- viewer_pid, % Pid of viewer process
- event_order, % Field to be used as primary key
- event, % The original event
- filtered_event, % Event processed by active filter
- active_filter, % Name of the active filter
- filters, % List of possible filters
- win, % GUI: Window object
- packer, % GUI: Packer object
- width, % GUI: Window width
- height}). % GUI: Window height
-
-%%%----------------------------------------------------------------------
-%%% Client side
-%%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% start_link(Options) -> {ok, ContentsPid} | {error, Reason}
-%%
-%% Start an viewer for the event contents as window in GS
-%%
-%% Options = [option()]
-%%
-%% option() =
-%%
-%% {parent_pid, pid()} | % Pid of parent process
-%% {viewer_pid, pid()} | % Pid of viewer process
-%% {event_order, event_order()} | % Field to be used as primary key
-%% {active_filter, atom()} | % Name of the active filter
-%% {filter, atom(), fun()} % A named filter fun
-%%
-%% event_order() = 'trace_ts' | 'event_ts'
-%% ContentsPid = pid()
-%% Reason = term()
-%%----------------------------------------------------------------------
-
-start_link(Options) ->
- case parse_opt(Options, default_state()) of
- {ok, S} ->
- case gen_server:start_link(?MODULE, [S], []) of
- {ok, ContentsPid} when S#state.parent_pid =/= self() ->
- unlink(ContentsPid),
- {ok, ContentsPid};
- Other ->
- Other
- end;
- {error, Reason} ->
- {error, Reason}
- end.
-
-default_state() ->
- #state{parent_pid = self(),
- viewer_pid = undefined,
- active_filter = ?DEFAULT_FILTER_NAME,
- filters = [?DEFAULT_FILTER],
- width = 600,
- height = 300}.
-
-parse_opt([], S) ->
- Name = S#state.active_filter,
- Filters = S#state.filters,
- if
- S#state.event =:= undefined ->
- {error, {badarg, no_event}};
- is_atom(Name) ->
- case lists:keysearch(Name, #filter.name, Filters) of
- {value, F} when is_record(F, filter) ->
- {ok, S#state{active_filter = Name}};
- false ->
- {error, {badarg, {no_such_filter, Name, Filters}}}
- end
- end;
-parse_opt([H | T], S) ->
- case H of
- {parent_pid, ParentPid} when is_pid(ParentPid) ->
- parse_opt(T, S#state{parent_pid = ParentPid});
- {viewer_pid, ViewerPid} when is_pid(ViewerPid) ->
- parse_opt(T, S#state{viewer_pid = ViewerPid});
- {event_order, trace_ts} ->
- parse_opt(T, S#state{event_order = trace_ts});
- {event_order, event_ts} ->
- parse_opt(T, S#state{event_order = event_ts});
- {event, Event} when is_record(Event, event) ->
- parse_opt(T, S#state{event = Event});
- {active_filter, Name} when is_atom(Name) ->
- parse_opt(T, S#state{active_filter = Name});
- F when is_record(F, filter),
- is_atom(F#filter.name),
- is_function(F#filter.function) ->
- Filters = lists:keydelete(F#filter.name, #filter.name, S#state.filters),
- Filters2 = lists:keysort(#filter.name, [F | Filters]),
- parse_opt(T, S#state{filters = Filters2});
- {width, Width} when is_integer(Width), Width > 0 ->
- parse_opt(T, S#state{width = Width});
- {height, Height} when is_integer(Height), Height > 0 ->
- parse_opt(T, S#state{height = Height});
- Bad ->
- {error, {bad_option, Bad}}
- end;
-parse_opt(BadList, _S) ->
- {error, {bad_option_list, BadList}}.
-
-%%----------------------------------------------------------------------
-%% stop(ContentsPid) -> ok
-%%
-%% Stops a contents viewer process
-%%
-%% ContentsPid = pid()
-%%----------------------------------------------------------------------
-
-stop(ContentsPid) ->
- unlink(ContentsPid),
- call(ContentsPid, stop).
-
-call(ContentsPid, Request) ->
- gen_server:call(ContentsPid, Request, infinity).
-
-%%%----------------------------------------------------------------------
-%%% Callback functions from gen_server
-%%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Func: init/1
-%% Returns: {ok, State} |
-%% {ok, State, Timeout} |
-%% ignore |
-%% {stop, Reason}
-%%----------------------------------------------------------------------
-
-init([S]) when is_record(S, state) ->
- process_flag(trap_exit, true),
- S2 = create_window(S),
- {ok, S2}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_call/3
-%% Returns: {reply, Reply, State} |
-%% {reply, Reply, State, Timeout} |
-%% {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, Reply, State} | (terminate/2 is called)
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_call(stop, _From, S) ->
- unlink(S#state.parent_pid),
- {stop, shutdown, ok, S};
-handle_call(Request, From, S) ->
- ok = error_logger:format("~p(~p): handle_call(~p, ~p, ~p)~n",
- [?MODULE, self(), Request, From, S]),
- Reply = {error, {bad_request, Request}},
- {reply, Reply, S}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_cast/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_cast(Msg, S) ->
- ok = error_logger:format("~p(~p): handle_cast(~p, ~p)~n",
- [?MODULE, self(), Msg, S]),
- {noreply, S}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_info/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_info({gs, Button, click, Data, _Other}, S) ->
- case Button of
- close ->
- gs:destroy(S#state.win),
- {stop, normal, S};
- save ->
- Event = S#state.event,
- Bin = list_to_binary(event_to_string(Event, S#state.event_order)),
- TimeStamp =
- case S#state.event_order of
- trace_ts -> Event#event.trace_ts;
- event_ts -> Event#event.event_ts
- end,
- FileName = ["et_contents_viewer_", now_to_string(TimeStamp), ".save"],
- file:write_file(lists:flatten(FileName), Bin),
- {noreply, S};
- _PopupMenuItem when is_record(Data, filter) ->
- F = Data,
- ChildState= S#state{active_filter = F#filter.name},
- case gen_server:start_link(?MODULE, [ChildState], []) of
- {ok, Pid} when S#state.parent_pid =/= self() ->
- unlink(Pid),
- {noreply, S};
- _ ->
- {noreply, S}
- end;
- {hide, Actors} ->
- send_viewer_event(S, {delete_actors, Actors}),
- {noreply, S};
- {show, Actors} ->
- send_viewer_event(S, {insert_actors, Actors}),
- {noreply, S};
- {mode, Mode} ->
- send_viewer_event(S, {mode, Mode}),
- {noreply, S};
- Nyi ->
- ok = error_logger:format("~p: click ~p ignored (nyi)~n",
- [?MODULE, Nyi]),
- {noreply, S}
- end;
-handle_info({gs, _Obj, destroy,_, _}, S) ->
- unlink(S#state.parent_pid),
- gs:destroy(S#state.win),
- {stop, normal, S};
-handle_info({gs, _Obj, keypress, _, [KeySym, _Keycode, _Shift, _Control | _]}, S) ->
- case KeySym of
- 'c' ->
- gs:destroy(S#state.win),
- {stop, normal, S};
-
- 'f' ->
- E = S#state.filtered_event,
- From = E#event.from,
- send_viewer_event(S, {delete_actors, [From]}),
- {noreply, S};
- 't' ->
- E = S#state.filtered_event,
- To = E#event.to,
- send_viewer_event(S, {delete_actors, [To]}),
- {noreply, S};
- 'b' ->
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- send_viewer_event(S, {delete_actors, [From, To]}),
- {noreply, S};
-
- 'F' ->
- E = S#state.filtered_event,
- From = E#event.from,
- send_viewer_event(S, {insert_actors, [From]}),
- {noreply, S};
- 'T' ->
- E = S#state.filtered_event,
- To = E#event.to,
- send_viewer_event(S, {insert_actors, [To]}),
- {noreply, S};
- 'B' ->
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- send_viewer_event(S, {insert_actors, [From, To]}),
- {noreply, S};
-
- 's' ->
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- First = et_collector:make_key(S#state.event_order, E),
- Mode = {search_actors, forward, First, [From, To]},
- send_viewer_event(S, {mode, Mode}),
- {noreply, S};
- 'r' ->
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- First = et_collector:make_key(S#state.event_order, E),
- Mode = {search_actors, reverse, First, [From, To]},
- send_viewer_event(S, {mode, Mode}),
- {noreply, S};
- 'a' ->
- send_viewer_event(S, {mode, all}),
- {noreply, S};
-
- 0 ->
- case lists:keysearch(?DEFAULT_FILTER_NAME, #filter.name, S#state.filters) of
- {value, F} when is_record(F, filter) ->
- ChildState= S#state{active_filter = F#filter.name},
- case gen_server:start_link(?MODULE, [ChildState], []) of
- {ok, Pid} when S#state.parent_pid =/= self() ->
- unlink(Pid);
- _ ->
- ignore
- end;
- false ->
- ignore
- end,
- {noreply, S};
- Int when is_integer(Int), Int > 0, Int =< 9 ->
- case catch lists:nth(Int, S#state.filters) of
- F when is_record(F, filter) ->
- ChildState= S#state{active_filter = F#filter.name},
- case gen_server:start_link(?MODULE, [ChildState], []) of
- {ok, Pid} when S#state.parent_pid =/= self() ->
- unlink(Pid);
- _ ->
- ignore
- end;
- {'EXIT', _} ->
- ignore
- end,
- {noreply, S};
-
- 'Shift_L' ->
- {noreply, S};
- 'Shift_R' ->
- {noreply, S};
- 'Caps_Lock' ->
- {noreply, S};
- _ ->
- io:format("~p: ignored: ~p~n", [?MODULE, KeySym]),
- {noreply, S}
- end;
-handle_info({gs, _Obj, configure, [], [W, H | _]}, S) ->
- gs:config(S#state.packer, [{width, W},{height, H}]),
- S2 = S#state{width = W, height = H},
- {noreply, S2};
-handle_info({'EXIT', Pid, Reason}, S) ->
- if
- Pid =:= S#state.parent_pid ->
- unlink(Pid),
- {stop, Reason, S};
- true ->
- {noreply, S}
- end;
-handle_info(Info, S) ->
- ok = error_logger:format("~p(~p): handle_info(~p, ~p)~n",
- [?MODULE, self(), Info, S]),
- {noreply, S}.
-
-%%----------------------------------------------------------------------
-%% Func: terminate/2
-%% Purpose: Shutdown the server
-%% Returns: any (ignored by gen_server)
-%%----------------------------------------------------------------------
-
-terminate(_Reason, _S) ->
- ignore.
-
-%%----------------------------------------------------------------------
-%% Func: code_change/3
-%% Purpose: Convert process state when code is changed
-%% Returns: {ok, NewState}
-%%----------------------------------------------------------------------
-
-code_change(_OldVsn, S, _Extra) ->
- {ok, S}.
-
-%%%----------------------------------------------------------------------
-%%% Handle graphics
-%%%----------------------------------------------------------------------
-
-create_window(S) ->
- H = S#state.height,
- W = S#state.width,
- Name = S#state.active_filter,
- Title = lists:concat([?MODULE, " (filter: ", Name, ")"]),
- WinOpt = [{title, Title}, {configure, true},
- {width, W}, {height, H}],
- GS = gs:start(),
- Win = gs:window(GS, WinOpt),
- Bar = gs:menubar(Win, []),
- create_file_menu(Bar),
- PackerOpt = [{packer_x, [{stretch, 1}]},
- {packer_y, [{stretch, 1}, {fixed, 25}]},
- {x, 0}, {y, 25}],
- Packer = gs:frame(Win, PackerOpt),
- EditorOpt = [{pack_xy, {1, 1}}, {vscroll, right}, {hscroll, bottom},
- {wrap, none},
- {bg, lightblue}, {font, {courier, 12}}],
- Editor = gs:editor(Packer, EditorOpt),
- FilteredEvent = config_editor(Editor, S),
- S2 = S#state{win = Win, packer = Packer, filtered_event = FilteredEvent},
- create_hide_menu(Bar, S2),
- create_search_menu(Bar, S2),
- create_filter_menu(Bar, S#state.filters),
- gs:config(Packer, [{width, W}, {height, H}]),
- gs:config(Win, [{map,true}, {keypress, true}]),
- S2.
-
-create_file_menu(Bar) ->
- Button = gs:menubutton(Bar, [{label, {text, "File"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(close, Menu, [{label, {text,"Close (c)"}}]),
- gs:menuitem(save, Menu, [{label, {text,"Save"}}]).
-
-create_filter_menu(Bar, Filters) ->
- Button = gs:menubutton(Bar, [{label, {text, "Filters"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(Menu, [{label, {text, "Select Filter"}}, {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- Item = fun(F, N) when F#filter.name =:= ?DEFAULT_FILTER_NAME->
- Label = lists:concat([pad_string(F#filter.name, 20), "(0)"]),
- gs:menuitem(Menu, [{label, {text, Label}}, {data, F}]),
- N + 1;
- (F, N) ->
- Name = F#filter.name,
- Label = lists:concat([pad_string(Name, 20), "(", N, ")"]),
- gs:menuitem(Menu, [{label, {text, Label}}, {data, F}]),
- N + 1
- end,
- Filters2 = lists:keysort(#filter.name, Filters),
- lists:foldl(Item, 1, Filters2),
- Menu.
-
-create_hide_menu(Bar, S) ->
- Button = gs:menubutton(Bar, [{label, {text, "Hide"}}]),
- Menu = gs:menu(Button, []),
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- if
- S#state.viewer_pid =:= undefined ->
- ignore;
- From =:= To ->
- gs:menuitem(Menu, [{label, {text, "Hide actor in Viewer "}}, {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem({hide, [From]}, Menu, [{label, {text,"From=To (f|t|b)"}}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "Show actor in Viewer "}}, {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem({show, [From]}, Menu, [{label, {text,"From=To (F|T|B)"}}]);
- true ->
- gs:menuitem(Menu, [{label, {text, "Hide actor in Viewer "}}, {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem({hide, [From]}, Menu, [{label, {text,"From (f)"}}]),
- gs:menuitem({hide, [To]}, Menu, [{label, {text,"To (t)"}}]),
- gs:menuitem({hide, [From, To]}, Menu, [{label, {text,"Both (b)"}}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "Show actor in Viewer "}}, {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem({show, [From]}, Menu, [{label, {text,"From (F)"}}]),
- gs:menuitem({show, [To]}, Menu, [{label, {text,"To (T)"}}]),
- gs:menuitem({show, [From, To]}, Menu, [{label, {text,"Both (B)"}}])
- end.
-
-create_search_menu(Bar, S) ->
- Button = gs:menubutton(Bar, [{label, {text, "Search"}}]),
- Menu = gs:menu(Button, []),
- E = S#state.filtered_event,
- From = E#event.from,
- To = E#event.to,
- gs:menuitem(Menu, [{label, {text, "Search in Viewer "}},
- {bg, lightblue}, {enable, false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- if
- S#state.viewer_pid =:= undefined ->
- S;
- From =:= To ->
- Key = et_collector:make_key(S#state.event_order, E),
- ModeS = {search_actors, forward, Key, [From]},
- ModeR = {search_actors, reverse, Key, [From]},
- gs:menuitem({mode, ModeS}, Menu, [{label, {text,"Forward from this event (s)"}}]),
- gs:menuitem({mode, ModeR}, Menu, [{label, {text,"Reverse from this event (r)"}}]);
- true ->
- Key = et_collector:make_key(S#state.event_order, E),
- ModeS = {search_actors, forward, Key, [From, To]},
- ModeR = {search_actors, reverse, Key, [From, To]},
- gs:menuitem({mode, ModeS}, Menu, [{label, {text,"Forward from this event (s)"}}]),
- gs:menuitem({mode, ModeR}, Menu, [{label, {text,"Reverse from this event (r)"}}])
- end,
- gs:menuitem({mode, all}, Menu, [{label, {text,"Abort search. Display all (a)"}}]).
-
-config_editor(Editor, S) ->
- Event = S#state.event,
- Name = S#state.active_filter,
- {value, F} = lists:keysearch(Name, #filter.name, S#state.filters),
- FilterFun = F#filter.function,
- case catch FilterFun(Event) of
- true ->
- do_config_editor(Editor, Event, lightblue, S#state.event_order);
- {true, Event2} when is_record(Event2, event) ->
- do_config_editor(Editor, Event2, lightblue, S#state.event_order);
- false ->
- do_config_editor(Editor, Event, red, S#state.event_order);
- Bad ->
- Contents = {bad_filter, Name, Bad},
- BadEvent = Event#event{contents = Contents},
- do_config_editor(Editor, BadEvent, red, S#state.event_order)
- end.
-
-do_config_editor(Editor, Event, Colour, TsKey) ->
- String = event_to_string(Event, TsKey),
- gs:config(Editor, {insert, {'end', String}}),
- gs:config(Editor, {enable, false}),
- gs:config(Editor, {bg, Colour}),
- Event.
-
-%%%----------------------------------------------------------------------
-%%% String handling
-%%%----------------------------------------------------------------------
-
-term_to_string(Term) ->
- case catch io_lib:format("~s", [Term]) of
- {'EXIT', _} -> io_lib:format("~p", [Term]);
- GoodString -> GoodString
- end.
-
-now_to_string({Mega, Sec, Micro} = Now)
- when is_integer(Mega), is_integer(Sec), is_integer(Micro) ->
- {{Y, Mo, D}, {H, Mi, S}} = calendar:now_to_universal_time(Now),
- lists:concat([Y, "-", Mo, "-", D, " ", H, ".", Mi, ".", S, ".", Micro]);
-now_to_string(Other) ->
- term_to_string(Other).
-
-event_to_string(Event, TsKey) ->
- ReportedTs = Event#event.trace_ts,
- ParsedTs = Event#event.event_ts,
- Deep =
- ["DETAIL LEVEL: ", term_to_string(Event#event.detail_level),
- "\nLABEL: ", term_to_string(Event#event.label),
- case Event#event.from =:= Event#event.to of
- true ->
- ["\nACTOR: ", term_to_string(Event#event.from)];
- false ->
- ["\nFROM: ", term_to_string(Event#event.from),
- "\nTO: ", term_to_string(Event#event.to)]
- end,
- case ReportedTs =:= ParsedTs of
- true ->
- ["\nPARSED: ", now_to_string(ParsedTs)];
- false ->
- case TsKey of
- trace_ts ->
- ["\nTRACE_TS: ", now_to_string(ReportedTs),
- "\nEVENT_TS: ", now_to_string(ParsedTs)];
- event_ts ->
- ["\nEVENT_TS: ", now_to_string(ParsedTs),
- "\nTRACE_TS: ", now_to_string(ReportedTs)]
- end
- end,
- "\nCONTENTS:\n\n", term_to_string(Event#event.contents)],
- lists:flatten(Deep).
-
-pad_string(Atom, MinLen) when is_atom(Atom) ->
- pad_string(atom_to_list(Atom), MinLen);
-pad_string(String, MinLen) when is_integer(MinLen), MinLen >= 0 ->
- Len = length(String),
- case Len >= MinLen of
- true ->
- String;
- false ->
- String ++ lists:duplicate(MinLen - Len, $ )
- end.
-
-send_viewer_event(S, Event) ->
- case S#state.viewer_pid of
- ViewerPid when is_pid(ViewerPid) ->
- ViewerPid ! {et, Event};
- undefined ->
- ignore
- end.
diff --git a/lib/et/src/et_gs_viewer.erl b/lib/et/src/et_gs_viewer.erl
deleted file mode 100644
index ce8634d09f..0000000000
--- a/lib/et/src/et_gs_viewer.erl
+++ /dev/null
@@ -1,1498 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2009-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%% Purpose: Displays a sequence chart for trace events (messages/actions)
-%%----------------------------------------------------------------------
-
--module(et_gs_viewer).
--compile([{nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,checkbutton,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,line,2}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubar,2}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,scale,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,text,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
--behaviour(gen_server).
-
-%% External exports
--export([start_link/1]).
-
-%% gen_server callbacks
--export([init/1, terminate/2, code_change/3,
- handle_call/3, handle_cast/2, handle_info/2]).
-
--include("../include/et.hrl").
--include("et_internal.hrl").
-
--define(unknown, "UNKNOWN").
-
--record(state,
- {parent_pid, % Pid of parent process
- collector_pid, % Pid of collector process
- event_order, % Field to be used as primary key
- trace_pattern, % Collector trace pattern
- active_filter, % Name of the active filter
- filters, % List of possible filters
- selected_actor, % Actor selected by user
- first_event, % Key of first event (regardless of visibility)
- last_event, % Key of last event (regardless of visibility)
- max_events, % Maximum number of shown events
- events, % Queue containg all event keys (regardless of visibility)
- max_actors, % Maximum number of shown actors
- actors, % List of known actors
- refresh_needed, % Refresh is needed in order to show all actors
- display_mode, % Display all or only matching actors
- detail_level, % Show only events with lesser detail level
- hide_actions, % Hide/show events where to == from actor (bool)
- hide_unknown, % Hide/show events with unknown actor (bool)
- is_suspended, % Suspend viewer updates (bool)
- title, % GUI: Window title
- win, % GUI: Window object
- menubar, % GUI: Menu bar object
- packer, % GUI: Packer object
- width, % GUI: Window width
- height, % GUI: Window height
- scale, % GUI: Scaling factor on canvas
- font, % GUI: Font to be used on text labels
- canvas_width, % GUI: Canvas width
- canvas_height, % GUI: Canvas height
- canvas, % GUI: Canvas object
- y_pos}). % GUI: Current y position on canvas
-
--record(actor, {name, string}).
-
--define(initial_x, 10).
--define(incr_x, 60).
--define(initial_y, 15).
--define(incr_y, 15).
-
-%%%----------------------------------------------------------------------
-%%% Client side
-%%%----------------------------------------------------------------------
-
-start_link(Options) ->
- case parse_opt(Options, default_state(), []) of
- {ok, S, CollectorOpt} ->
- case S#state.collector_pid of
- CollectorPid when is_pid(CollectorPid) ->
- case gen_server:start_link(?MODULE, [S], []) of
- {ok, Pid} when S#state.parent_pid =/= self() ->
- unlink(Pid),
- {ok, Pid};
- Other ->
- Other
- end;
- undefined ->
- case et_collector:start_link(CollectorOpt) of
- {ok, CollectorPid} ->
- S2 = S#state{collector_pid = CollectorPid},
- case gen_server:start_link(?MODULE, [S2], []) of
- {ok, Pid} when S#state.parent_pid =/= self() ->
- unlink(Pid),
- {ok, Pid};
- Other ->
- Other
- end;
- {error, Reason} ->
- {error, {et_collector, Reason}}
- end
- end;
- {error, Reason} ->
- {error, Reason}
- end.
-
-default_state() ->
- #state{parent_pid = self(),
- collector_pid = undefined,
- detail_level = ?detail_level_max,
- active_filter = ?DEFAULT_FILTER_NAME,
- filters = [?DEFAULT_FILTER],
- event_order = trace_ts,
- is_suspended = false,
- max_events = 100,
- first_event = first,
- last_event = first,
- events = queue_new(),
- max_actors = 5,
- actors = [create_actor(?unknown)],
- selected_actor = ?unknown,
- hide_actions = false,
- hide_unknown = false,
- refresh_needed = false,
- display_mode = all,
- scale = 2,
- canvas_height = 0,
- canvas_width = 0,
- width = 800,
- height = 600}.
-
-parse_opt([], S, CollectorOpt) ->
- {ok, S, [{parent_pid, S#state.parent_pid} | CollectorOpt]};
-parse_opt([H | T], S, CollectorOpt) ->
- case H of
- {parent_pid, Parent} when Parent =:= undefined ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{parent_pid = Parent}, CollectorOpt2);
- {parent_pid, Parent} when is_pid(Parent) ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{parent_pid = Parent}, CollectorOpt2);
- {title, Title} ->
- parse_opt(T, S#state{title = name_to_string(Title)}, CollectorOpt);
- {detail_level, Level} when is_integer(Level),
- Level >= ?detail_level_min,
- Level =< ?detail_level_max ->
- parse_opt(T, S#state{detail_level = Level}, CollectorOpt);
- {detail_level, max} ->
- parse_opt(T, S#state{detail_level = ?detail_level_max}, CollectorOpt);
- {detail_level, min} ->
- parse_opt(T, S#state{detail_level = ?detail_level_min}, CollectorOpt);
- {is_suspended, true} ->
- parse_opt(T, S#state{is_suspended = true}, CollectorOpt);
- {is_suspended, false} ->
- parse_opt(T, S#state{is_suspended = false}, CollectorOpt);
- {scale, Scale} when is_integer(Scale), Scale > 0 ->
- parse_opt(T, S#state{scale = Scale}, CollectorOpt);
- {width, W} when is_integer(W), W > 0 ->
- parse_opt(T, S#state{width = W, canvas_width = W}, CollectorOpt);
- {height, WH} when is_integer(WH), WH > 0 ->
- parse_opt(T, S#state{height = WH, canvas_height = WH}, CollectorOpt);
- {collector_pid, Pid} when is_pid(Pid) ->
- parse_opt(T, S#state{collector_pid = Pid}, CollectorOpt);
- {collector_pid, undefined} ->
- parse_opt(T, S#state{collector_pid = undefined}, CollectorOpt);
- {active_filter, Name} when is_atom(Name) ->
- parse_opt(T, S#state{active_filter = Name}, CollectorOpt);
- {event_order, trace_ts} -> %% BUGBUG: Verify event_order with collector
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{event_order = trace_ts}, CollectorOpt2);
- {event_order, event_ts} -> %% BUGBUG: Verify event_order with collector
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{event_order = event_ts}, CollectorOpt2);
- {trace_port, _Port} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {trace_max_queue, _Queue} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {trace_pattern, _Pattern} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {trace_global, _Boolean} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {trace_client, _Client} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {dict_insert, {filter, Name}, Fun} ->
- if
- is_atom(Name), is_function(Fun) ->
- F = #filter{name = Name, function = Fun},
- Filters = lists:keydelete(Name, #filter.name, S#state.filters),
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{filters = Filters ++ [F]}, CollectorOpt2);
- true ->
- {error, {bad_option, H}}
- end;
- {dict_insert, {subscriber, Pid}, _Val} ->
- if
- is_pid(Pid) ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- true ->
- {error, {bad_option, H}}
- end;
- {dict_insert, _Key, _Val} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {dict_delete, {filter, Name}} ->
- Filters = lists:keydelete(Name, #filter.name, S#state.filters),
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S#state{filters = Filters}, CollectorOpt2);
- {dict_delete, _Key} ->
- CollectorOpt2 = [H | CollectorOpt],
- parse_opt(T, S, CollectorOpt2);
- {max_events, Max} when is_integer(Max), Max > 0->
- parse_opt(T, S#state{max_events = Max}, CollectorOpt);
- {max_events, Max} when Max =:= infinity ->
- parse_opt(T, S#state{max_events = Max}, CollectorOpt);
- {max_actors, Max} when is_integer(Max), Max >= 0->
- parse_opt(T, S#state{max_actors = Max}, CollectorOpt);
- {max_actors, Max} when Max =:= infinity ->
- parse_opt(T, S#state{max_actors = Max}, CollectorOpt);
- {actors, ActorNames} when is_list(ActorNames) ->
- ActorNames2 =
- case lists:member(?unknown, ActorNames) of
- false -> [?unknown | ActorNames];
- true -> ActorNames
- end,
- Actors = [create_actor(Name) || Name <- ActorNames2],
- parse_opt(T, S#state{actors = Actors}, CollectorOpt);
- {first_event, First} ->
- parse_opt(T, S#state{first_event = First}, CollectorOpt);
- {hide_unknown, Bool} when Bool =:= false ->
- parse_opt(T, S#state{hide_unknown = Bool}, CollectorOpt);
- {hide_unknown, Bool} when Bool =:= true ->
- parse_opt(T, S#state{hide_unknown = Bool}, CollectorOpt);
- {hide_actions, Bool} when Bool =:= false ->
- parse_opt(T, S#state{hide_actions = Bool}, CollectorOpt);
- {hide_actions, Bool} when Bool =:= true ->
- parse_opt(T, S#state{hide_actions = Bool}, CollectorOpt);
- {display_mode, Mode = all} ->
- parse_opt(T, S#state{display_mode = Mode}, CollectorOpt);
- {display_mode, Mode = {search_actors, Dir, _Key, Actors}} when is_list(Actors), Dir =:= forward ->
- parse_opt(T, S#state{display_mode = Mode}, CollectorOpt);
- {display_mode, Mode = {search_actors, Dir, _Key, Actors}} when is_list(Actors), Dir =:= reverse ->
- parse_opt(T, S#state{display_mode = Mode}, CollectorOpt);
-
- Bad ->
- {error, {bad_option, Bad}}
- end;
-parse_opt(BadList, _S, _CollectorOpt) ->
- {error, {bad_option_list, BadList}}.
-
-do_dict_insert({filter, Name}, Fun, S) when is_atom(Name), is_function(Fun) ->
- F = #filter{name = Name, function = Fun},
- Filters = lists:keydelete(Name, #filter.name, S#state.filters),
- Filters2 = lists:keysort(#filter.name, [F | Filters]),
- gs:destroy(filter_menu),
- create_filter_menu(S#state.active_filter, Filters2),
- S#state{filters = Filters2};
-do_dict_insert(_Key, _Val, S) ->
- %% ok = error_logger:format("~p(~p): handle_info({et, {dict_insert, ~p, ~p}})~n",
- %% [?MODULE, self(), Key, Val]),
- S.
-
-do_dict_delete({filter, Name}, S) when is_atom(Name), Name =/= S#state.active_filter ->
- Filters = lists:keydelete(Name, #filter.name, S#state.filters),
- gs:destroy(filter_menu),
- create_filter_menu(S#state.active_filter, Filters),
- S#state{filters = Filters};
-do_dict_delete(_Key, S) ->
- %% ok = error_logger:format("~p(~p): handle_info({et, {dict_delete, ~p}})~n",
- %% [?MODULE, self(), Key]),
- S.
-
-%%%----------------------------------------------------------------------
-%%% Callback functions from gen_server
-%%%----------------------------------------------------------------------
-
-%%----------------------------------------------------------------------
-%% Func: init/1
-%% Returns: {ok, State} |
-%% {ok, State, Timeout} |
-%% ignore |
-%% {stop, Reason}
-%%----------------------------------------------------------------------
-
-init([S]) when is_record(S, state) ->
- process_flag(trap_exit, true),
- InitialTimeout = 0,
- case S#state.parent_pid of
- undefined ->
- ignore;
- Pid when is_pid(Pid) ->
- link(Pid)
- end,
- et_collector:dict_insert(S#state.collector_pid,
- {subscriber, self()},
- ?MODULE),
- {ok, create_main_window(S), InitialTimeout}.
-
-%%----------------------------------------------------------------------
-%% Func: handle_call/3
-%% Returns: {reply, Reply, State} |
-%% {reply, Reply, State, Timeout} |
-%% {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, Reply, State} | (terminate/2 is called)
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_call(get_collector_pid, _From, S) ->
- Reply = S#state.collector_pid,
- reply(Reply, S);
-handle_call(stop, _From, S) ->
- gs:destroy(S#state.win),
- {stop, shutdown, ok, S};
-handle_call(Request, From, S) ->
- ok = error_logger:format("~p(~p): handle_call(~p, ~p, ~p)~n",
- [?MODULE, self(), Request, From, S]),
- Reply = {error, {bad_request, Request}},
- reply(Reply, S).
-
-%%----------------------------------------------------------------------
-%% Func: handle_cast/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_cast(Msg, S) ->
- ok = error_logger:format("~p(~p): handle_cast(~p, ~p)~n",
- [?MODULE, self(), Msg, S]),
- noreply(S).
-
-%%----------------------------------------------------------------------
-%% Func: handle_info/2
-%% Returns: {noreply, State} |
-%% {noreply, State, Timeout} |
-%% {stop, Reason, State} (terminate/2 is called)
-%%----------------------------------------------------------------------
-
-handle_info({et, {more_events, _Size}}, S) ->
- noreply(S);
-handle_info({et, {insert_actors, ActorNames}}, S) when is_list(ActorNames) ->
- Fun = fun(N, Actors) ->
- case lists:keymember(N, #actor.name, Actors) of
- true -> Actors;
- false -> Actors ++ [create_actor(N)]
- end
- end,
- Actors = lists:foldl(Fun, S#state.actors, ActorNames),
- S2 = refresh_main_window(S#state{actors = Actors}),
- noreply(S2);
-handle_info({et, {delete_actors, ActorNames}}, S) when is_list(ActorNames)->
- Fun = fun(N, Actors) when N =:= ?unknown ->
- Actors;
- (N, Actors) ->
- lists:keydelete(N, #actor.name, Actors)
- end,
- New = lists:foldl(Fun, S#state.actors, ActorNames),
- S2 = refresh_main_window(S#state{actors = New}),
- noreply(S2);
-handle_info({et, {dict_insert, Key, Val}}, S) ->
- S2 = do_dict_insert(Key, Val, S),
- noreply(S2);
-handle_info({et, {dict_delete, Key}}, S) ->
- S2 = do_dict_delete(Key, S),
- noreply(S2);
-handle_info({et, first}, S) ->
- S2 = scroll_first(S),
- noreply(S2);
-handle_info({et, prev}, S) ->
- S2 = scroll_prev(S),
- noreply(S2);
-handle_info({et, next}, S) ->
- S2 = scroll_next(S),
- noreply(S2);
-handle_info({et, last}, S) ->
- S2 = scroll_last(S),
- noreply(S2);
-handle_info({et, refresh}, S) ->
- S2 = refresh_main_window(S),
- noreply(S2);
-handle_info({et, {display_mode, Mode}}, S) ->
- S2 = change_display_mode(Mode, S),
- noreply(S2);
-handle_info({et, close}, S) ->
- gs:destroy(S#state.win),
- {stop, shutdown, S};
-handle_info({gs, Button, click, Data, Other} = Click, S) ->
- CollectorPid = S#state.collector_pid,
- case Button of
- close ->
- gs:destroy(S#state.win),
- {stop, shutdown, S};
- suspended ->
- case Other of
- [_Text, _Group, Bool | _] when Bool =:= true ->
- S2 = do_suspend(S),
- noreply(S2);
- [_Text, _Group, Bool | _] when Bool =:= false ->
- S2 = do_resume(S),
- noreply(S2);
- _ ->
- click_error(Click, S),
- noreply(S)
- end;
- hide_actions ->
- case Other of
- [_Text, _Group, Bool | _] when Bool =:= true ->
- S2 = refresh_main_window(S#state{hide_actions = Bool}),
- noreply(S2);
- [_Text, _Group, Bool | _] when Bool =:= false ->
- S2 = refresh_main_window(S#state{hide_actions = Bool}),
- noreply(S2);
- _ ->
- click_error(Click, S),
- noreply(S)
- end;
- hide_unknown ->
- case Other of
- [_Text, _Group, Bool | _] when Bool =:= true ->
- S2 = refresh_main_window(S#state{hide_unknown = Bool}),
- noreply(S2);
- [_Text, _Group, Bool | _] when Bool =:= false ->
- S2 = refresh_main_window(S#state{hide_unknown = Bool}),
- noreply(S2);
- _ ->
- click_error(Click, S),
- noreply(S)
- end;
- up ->
- S2 = scroll_up(S),
- noreply(S2);
- down ->
- S2 = scroll_down(S),
- noreply(S2);
- first ->
- S2 = scroll_first(S),
- noreply(S2);
- prev ->
- S2 = scroll_prev(S),
- noreply(S2);
- next ->
- S2 = scroll_next(S),
- noreply(S2);
- last ->
- S2 = scroll_last(S),
- noreply(S2);
- refresh ->
- S2 = refresh_main_window(S),
- noreply(S2);
- {display_mode, Mode} ->
- S2 = change_display_mode(Mode, S),
- noreply(S2);
- close_all ->
- close_all(S);
- close_all_others ->
- close_all_others(S);
- first_all ->
- et_collector:multicast(CollectorPid, first),
- noreply(S);
- prev_all ->
- et_collector:multicast(CollectorPid, prev),
- noreply(S);
- next_all ->
- et_collector:multicast(CollectorPid, next),
- noreply(S);
- last_all ->
- et_collector:multicast(CollectorPid, last),
- noreply(S);
- refresh_all ->
- et_collector:multicast(CollectorPid, refresh),
- noreply(S);
- clear_all ->
- et_collector:clear_table(CollectorPid),
- et_collector:multicast(CollectorPid, refresh),
- noreply(S);
- load_all ->
- et_collector:start_trace_client(CollectorPid, event_file, "et_viewer.log"),
- noreply(S);
- save_all ->
- et_collector:save_event_file(CollectorPid,
- "et_viewer.log",
- [existing, write, keep]),
- noreply(S);
- {open_viewer, Scale} ->
- Actors = [A#actor.name || A <- S#state.actors],
- open_viewer(Scale, S#state.active_filter, Actors, S),
- noreply(S);
- _Level when Data =:= detail_level, is_integer(hd(Other)),
- hd(Other) >= ?detail_level_min,
- hd(Other) =< ?detail_level_max ->
- S2 = S#state{detail_level = hd(Other)},
- noreply(S2);
- _PopupMenuItem when is_record(Data, filter) ->
- open_viewer(S#state.scale, Data#filter.name, [?unknown], S),
- noreply(S);
- _ ->
- click_error(Click, S),
- noreply(S)
- end;
-handle_info({gs, _Obj, destroy,_, _}, S) ->
- gs:destroy(S#state.win),
- {stop, shutdown, S};
-handle_info({gs, _Obj, buttonpress, _, [_Button, X, Y | _]}, S) ->
- S3 =
- case y_to_n(Y, S) of
- actor ->
- %% Actor click
- case S#state.actors of
- [] ->
- S;
- _ ->
- N = x_to_n(X, S),
- A = lists:nth(N, S#state.actors),
- S#state{selected_actor = A}
- end;
- {event, N} ->
- %% Event click
- List = queue_to_list(S#state.events),
- S2 = S#state{events = list_to_queue(List)},
-
- Key = lists:nth(N, List),
- Pid = S#state.collector_pid,
- Fun = fun create_contents_window/2,
- case et_collector:iterate(Pid, Key, -1) of
- Prev when Prev =:= Key ->
- et_collector:iterate(Pid, first, 1, Fun, S2);
- Prev ->
- et_collector:iterate(Pid, Prev, 1, Fun, S2)
- end
- end,
- noreply(S3);
-handle_info({gs, _Obj, buttonrelease, _, [_Button, X, Y | _]}, S) ->
- S2 =
- case y_to_n(Y, S) of
- actor ->
- %% Actor click
- case S#state.actors of
- [] ->
- S;
- Actors ->
- N = x_to_n(X, S),
- New = lists:nth(N, S#state.actors),
- Old = S#state.selected_actor,
- case New#actor.name =:= Old#actor.name of
- true ->
- A = S#state.selected_actor,
- toggle_search_for_actor(A#actor.name, S);
- false ->
- move_actor(Old, New, Actors, S)
- end
- end;
- {event, _N} ->
- %% Event click ignored
- S
- end,
- noreply(S2);
-handle_info({gs, _Obj, keypress, _, [KeySym, _Keycode, _Shift, _Control | _]} = Key, S) ->
- case KeySym of
- 'c' ->
- close_all_others(S);
- 'C' ->
- close_all(S);
- 'Up' ->
- S2 = scroll_up(S),
- noreply(S2);
- 'Down' ->
- S2 = scroll_down(S),
- noreply(S2);
- 'f' ->
- S2 = scroll_first(S),
- noreply(S2);
- 'p' ->
- S2 = scroll_prev(S),
- noreply(S2);
- 'Prior' ->
- S2 = scroll_prev(S),
- noreply(S2);
- 'n' ->
- S2 = scroll_next(S),
- noreply(S2);
- 'Next' ->
- S2 = scroll_next(S),
- noreply(S2);
- 'l' ->
- S2 = scroll_last(S),
- noreply(S2);
- 'r' ->
- S2 = refresh_main_window(S),
- noreply(S2);
- 'F' ->
- et_collector:multicast(S#state.collector_pid, first),
- noreply(S);
- 'P' ->
- et_collector:multicast(S#state.collector_pid, prev),
- noreply(S);
- 'N' ->
- et_collector:multicast(S#state.collector_pid, next),
- noreply(S);
- 'L' ->
- et_collector:multicast(S#state.collector_pid, last),
- noreply(S);
- 'R' ->
- et_collector:multicast(S#state.collector_pid, refresh),
- noreply(S);
-
- 'a' ->
- S2 = S#state{display_mode = all},
- S3 = refresh_main_window(S2),
- noreply(S3);
-
- 'equal' ->
- Scale = S#state.scale,
- Actors = [A#actor.name || A <- S#state.actors],
- open_viewer(Scale, S#state.active_filter, Actors, S),
- noreply(S);
- 'plus' ->
- Scale = S#state.scale + 1,
- Actors = [A#actor.name || A <- S#state.actors],
- open_viewer(Scale, S#state.active_filter, Actors, S),
- noreply(S);
- 'minus' ->
- case S#state.scale of
- 1 ->
- gs:config(S#state.canvas, beep);
- Scale ->
- Actors = [A#actor.name || A <- S#state.actors],
- open_viewer(Scale - 1, S#state.active_filter, Actors, S)
- end,
- noreply(S);
- 0 ->
- case lists:keysearch(?DEFAULT_FILTER_NAME, #filter.name, S#state.filters) of
- {value, F} when is_record(F, filter) ->
- open_viewer(S#state.scale, F#filter.name, [?unknown], S);
- false ->
- gs:config(S#state.canvas, beep)
- end,
- noreply(S);
- Int when is_integer(Int), Int > 0, Int =< 9 ->
- case catch lists:nth(Int, S#state.filters) of
- F when is_record(F, filter) ->
- open_viewer(S#state.scale, F#filter.name, [?unknown], S);
- {'EXIT', _} ->
- gs:config(S#state.canvas, beep)
- end,
- noreply(S);
-
- 'Shift_L' ->
- noreply(S);
- 'Shift_R' ->
- noreply(S);
- 'Caps_Lock' ->
- noreply(S);
-
- _ ->
- click_error(Key, S),
- noreply(S)
- end;
-handle_info({gs, _Obj,configure, [], [W, H | _]}, S) ->
- gs:config(S#state.packer, [{width, W}, {height, H}]),
- S2 = S#state{width = W, height = H},
- noreply(S2);
-handle_info(timeout, S) ->
- Try =
- case S#state.display_mode of
- {search_actors, reverse, _, _} ->
- -10;
- _ ->
- 10
- end,
- if
- S#state.is_suspended =:= true ->
- {noreply, S, infinity};
- S#state.max_events =:= infinity ->
- display_more_events(Try, S);
- true ->
- Needed = S#state.max_events - queue_length(S#state.events),
- if
- Needed =< 0 -> {noreply, S, infinity};
- Needed > 10 -> display_more_events(Try, S);
- Needed =< 10 -> display_more_events(Needed, S)
- end
- end;
-
-handle_info({'EXIT', Pid, Reason}, S) ->
- if
- Pid =:= S#state.collector_pid ->
- unlink(Pid),
- gs:destroy(S#state.win),
- {stop, Reason, S};
- Pid =:= S#state.parent_pid ->
- unlink(Pid),
- gs:destroy(S#state.win),
- {stop, Reason, S};
- true ->
- noreply(S)
- end;
-handle_info(Info, S) ->
- ok = error_logger:format("~p(~p): handle_info(~p, ~p)~n",
- [?MODULE, self(), Info, S]),
- noreply(S).
-
-%%----------------------------------------------------------------------
-%% Func: terminate/2
-%% Purpose: Shutdown the server
-%% Returns: any (ignored by gen_server)
-%%----------------------------------------------------------------------
-
-terminate(_Reason, _S) ->
- ignore.
-
-%%----------------------------------------------------------------------
-%% Func: code_change/3
-%% Purpose: Convert process state when code is changed
-%% Returns: {ok, NewState}
-%%----------------------------------------------------------------------
-
-code_change(_OldVsn, S, _Extra) ->
- {ok, S}.
-
-%%%----------------------------------------------------------------------
-%%% Handle suspend/resume
-%%%----------------------------------------------------------------------
-
-reply(Reply, S) ->
- case queue_length(S#state.events) of
- _ when S#state.is_suspended =:= true ->
- {reply, Reply, S, infinity};
- _ when S#state.max_events =:= infinity ->
- {reply, Reply, S, 500};
- N when N >= S#state.max_events ->
- {reply, Reply, S, infinity};
- _ ->
- {reply, Reply, S, 0}
- end.
-
-noreply(S) ->
- case queue_length(S#state.events) of
- _ when S#state.is_suspended =:= true ->
- {noreply, S, infinity};
- _ when S#state.max_events =:= infinity ->
- {noreply, S, 500};
- N when N >= S#state.max_events ->
- {noreply, S, infinity};
- _ ->
- {noreply, S, 0}
- end.
-
-do_suspend(S) ->
- config_suspend(S#state{is_suspended = true}).
-
-do_resume(S) ->
- config_suspend(S#state{is_suspended = false}).
-
-config_suspend(S) ->
- Suspended = S#state.is_suspended,
- gs:config(refresh, [{enable, not Suspended}]),
- gs:config(refresh_all, [{enable, not Suspended}]),
- gs:config(clear_all, [{enable, not Suspended}]),
- S.
-
-refresh_main_window(S) ->
- Pid = S#state.collector_pid,
- Key = S#state.first_event,
- case et_collector:iterate(Pid, Key, -1) of
- Prev when Prev =:= Key ->
- scroll_first(S);
- _Prev ->
- S2 = S#state{last_event = S#state.first_event},
- clear_canvas(S2)
- end.
-
-scroll_first(S) ->
- S2 = S#state{first_event = first, last_event = first},
- clear_canvas(S2).
-
-scroll_prev(S) ->
- Try =
- case S#state.max_events of
- infinity -> -10;
- Max -> -Max
- end,
- Key = et_collector:iterate(S#state.collector_pid, S#state.first_event, Try),
- S2 = S#state{first_event = Key, last_event = Key},
- clear_canvas(S2).
-
-scroll_next(S) ->
- S2 = S#state{first_event = S#state.last_event},
- clear_canvas(S2).
-
-scroll_up(S) ->
- Key = et_collector:iterate(S#state.collector_pid, S#state.first_event, -5),
- S2 = S#state{first_event = Key, last_event = Key},
- clear_canvas(S2).
-
-scroll_down(S) ->
- Key = et_collector:iterate(S#state.collector_pid, S#state.first_event, 5),
- S2 = S#state{first_event = Key, last_event = Key},
- clear_canvas(S2).
-
-scroll_last(S) ->
- S2 = S#state{first_event = last, last_event = last},
- clear_canvas(S2).
-
-change_display_mode(Mode, S) ->
- case Mode of
- all ->
- S2 = S#state{display_mode = Mode},
- refresh_main_window(S2);
- {search_actors, _Dir, _Key, []} ->
- S2 = S#state{display_mode = all},
- refresh_main_window(S2);
- {search_actors, _Dir, Key, Actors} when is_list(Actors) ->
- Pid = S#state.collector_pid,
- Prev = et_collector:iterate(Pid, Key, -1),
- S2 = S#state{first_event = Prev,
- last_event = Prev,
- display_mode = Mode},
- clear_canvas(S2)
- end.
-
-close_all(S) ->
- et_collector:multicast(S#state.collector_pid, close),
- timer:sleep(timer:seconds(1)),
- spawn(et_collector, stop, [S#state.collector_pid]),
- gs:destroy(S#state.win),
- {stop, shutdown, S}.
-
-close_all_others(S) ->
- Fun =
- fun({{subscriber, Pid}, _}) ->
- if
- Pid =:= self() ->
- ignore;
- true ->
- unlink(Pid),
- Pid ! {et, close}
- end
- end,
- All = et_collector:dict_match(S#state.collector_pid,
- {{subscriber, '_'}, '_'}),
- lists:foreach(Fun, All),
- noreply(S).
-
-click_error(Click, S) ->
- gs:config(S#state.canvas, beep),
- io:format("~p: ignored: ~p~n", [?MODULE, Click]).
-
-%%%----------------------------------------------------------------------
-%%% Clone viewer
-%%%----------------------------------------------------------------------
-
-open_viewer(Scale, FilterName, Actors, S) ->
- Filters = [{dict_insert, {filter, F#filter.name}, F#filter.function}
- || F <- S#state.filters],
- Options =
- [{parent_pid, S#state.parent_pid},
- {title, S#state.title},
- {collector_pid, S#state.collector_pid},
- {is_suspended, S#state.is_suspended},
- {detail_level, S#state.detail_level},
- {active_filter, FilterName},
- {event_order, S#state.event_order},
- {first_event, S#state.first_event},
- {max_events, S#state.max_events},
- {max_actors, S#state.max_actors},
- {hide_actions, S#state.hide_actions},
- {hide_unknown, S#state.hide_unknown},
- {is_suspended, S#state.is_suspended},
- {actors, Actors},
- {scale, Scale},
- {width, S#state.width},
- {height, S#state.height} | Filters],
- case start_link(Options) of
- {ok, ViewerPid} ->
- unlink(ViewerPid),
- ok;
- {error, Reason} ->
- ok = error_logger:format("~p: Failed to start a new window: ~p~n",
- [?MODULE, Reason])
- end.
-
-%%%----------------------------------------------------------------------
-%%% Handle graphics
-%%%----------------------------------------------------------------------
-
-create_main_window(S) ->
- Font = select_font(S#state.scale),
- GS = gs:start(),
- Name = name_to_string(S#state.active_filter),
- Title = case S#state.title of
- undefined -> atom_to_list(?MODULE);
- Explicit -> name_to_string(Explicit)
- end,
- WinOpt = [{title, Title ++ " (filter: " ++ Name ++ ")"},
- {configure, true},
- {width, S#state.width},
- {height, S#state.height}],
- Win = gs:window(GS, WinOpt),
- Bar = gs:menubar(Win, []),
-
- create_file_menu(Bar),
- create_viewer_menu(Bar),
- create_collector_menu(Bar),
- gs:menubutton(filter_button, Bar, [{label, {text, "Filter"}}]),
- create_filter_menu(S#state.active_filter, S#state.filters),
- create_help_menu(Bar),
-
- config_suspend(S),
-
- PackerOpt = [{packer_x, [{fixed, 5}, {fixed, 40}, {fixed, 40},
- {stretch, 1}, {fixed, 5}]},
- {packer_y, [{fixed, 30}, {fixed, 30},
- {stretch, 1}, {fixed, 30}]},
- {x, 0}, {y, 30}],
- Packer = gs:frame(Win, PackerOpt),
- gs:checkbutton(suspended, Packer, [{label,{text,"Freeze"}},
- {x, 10}, {y, 0},
- {width, 120}, {align, w},
- {select, S#state.is_suspended}]),
- gs:checkbutton(hide_actions, Packer, [{label,{text,"Hide From=To"}},
- {x, 10}, {y, 20},
- {width, 120}, {align, w},
- {select, S#state.hide_actions}]),
- gs:checkbutton(hide_unknown, Packer, [{label,{text,"Hide Unknown"}},
- {x, 10}, {y, 40},
- {width, 120}, {align, w},
- {select, S#state.hide_unknown}]),
- gs:scale(Packer, [{text,"Detail Level"},
- {range, {?detail_level_min, ?detail_level_max}},
- {orient, horizontal},
- {x, 150}, {y, 0}, {height, 65}, {width, 200},
- {pos, S#state.detail_level}, {data, detail_level}]),
- CanvasW = calc_canvas_width(S),
- CanvasH = calc_canvas_height(S),
- CanOpt = [{pack_xy, {{2, 4}, 3}}, {vscroll, right}, {hscroll, bottom},
- {scrollregion, {2, 2, CanvasW, CanvasH}}],
- Canvas = gs:canvas(Packer, CanOpt),
- gs:config(Canvas, [{buttonpress, true}, {buttonrelease, true}]),
- gs:config(Packer, [{width, S#state.width}, {height, S#state.height}]),
- gs:config(Win, [{map, true}, {keypress, true}]),
- S2 = S#state{title = Title,
- win = Win, font = Font, packer = Packer,
- canvas_width = CanvasW, canvas_height = CanvasH,
- canvas = Canvas,
- y_pos = ?initial_y * S#state.scale},
- draw_all_actors(S2).
-
-select_font(Scale) when is_integer(Scale) ->
- case Scale of
- 1 -> {courier, 7};
- 2 -> {courier, 10};
- 3 -> {courier, 12};
- 4 -> {courier, 14};
- S -> {courier, S * 4}
- end.
-
-create_file_menu(Bar) ->
- Button = gs:menubutton(Bar, [{label, {text, "File"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(close_all, Menu, [{label, {text, "Close Collector and all Viewers (C) "}}]),
- gs:menuitem(close_all_others, Menu, [{label, {text, "Close other Viewers, but keep Collector (c)"}}]),
- gs:menuitem(close, Menu, [{label, {text, "Close this Viewer, but keep Collector"}}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
-
- gs:menuitem(clear_all, Menu, [{label, {text, "Clear Collector"}}]),
- gs:menuitem(load_all, Menu, [{label, {text, "Load Collector from the file \"et_viewer.log\""}}]),
- gs:menuitem(save_all, Menu, [{label, {text, "Save Collector to the file \"et_viewer.log\""}}]).
-
-create_viewer_menu(Bar) ->
- Button = gs:menubutton(Bar, [{label, {text, "Viewer"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(Menu, [{label, {text, "Scroll this Viewer"}}, {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(first, Menu, [{label, {text, "First (f)"}}]),
- gs:menuitem(prev, Menu, [{label, {text, "Prev (p)"}}]),
- gs:menuitem(next, Menu, [{label, {text, "Next (n)"}}]),
- gs:menuitem(last, Menu, [{label, {text, "Last (l)"}}]),
- gs:menuitem(refresh, Menu, [{label, {text, "Refresh (r)"}}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(up, Menu, [{label, {text, "Up 5 (Up)"}}]),
- gs:menuitem(down, Menu, [{label, {text, "Down 5 (Down)"}}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "Search in this Viewer"}}, {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem({mode, all}, Menu, [{label, {text, "Abort search. Display all (a)"}}]).
-
-create_collector_menu(Bar) ->
- Button = gs:menubutton(Bar, [{label, {text, "Collector"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(Menu, [{label, {text, "Scroll all Viewers"}}, {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(first_all, Menu, [{label, {text, "First (F)"}}]),
- gs:menuitem(prev_all, Menu, [{label, {text, "Prev (P)"}}]),
- gs:menuitem(next_all, Menu, [{label, {text, "Next (N)"}}]),
- gs:menuitem(last_all, Menu, [{label, {text, "Last (L)"}}]),
- gs:menuitem(refresh_all, Menu, [{label, {text, "Refresh (R)"}}]).
-
-create_filter_menu(ActiveFilterName, Filters) ->
- Menu = gs:menu(filter_menu, filter_button, []),
- Item = fun(F, N) when F#filter.name =:= collector ->
- Label = lists:concat([pad_string(F#filter.name, 20), "(0)"]),
- gs:menuitem(Menu, [{label, {text, Label}}, {data, F}]),
- N + 1;
- (F, N) ->
- Label = lists:concat([pad_string(F#filter.name, 20), "(", N, ")"]),
- gs:menuitem(Menu, [{label, {text, Label}}, {data, F}]),
- N + 1
- end,
- gs:menuitem(Menu, [{label, {text, "Same Filter New Scale"}}, {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- {value, Filter} = lists:keysearch(ActiveFilterName, #filter.name, Filters),
- Same = lists:concat([pad_string(ActiveFilterName, 20), "(=)"]),
- Larger = lists:concat([pad_string(ActiveFilterName, 20), "(+)"]),
- Smaller = lists:concat([pad_string(ActiveFilterName, 20), "(-)"]),
- gs:menuitem(Menu, [{label, {text, Same}}, {data, Filter}]),
- gs:menuitem(Menu, [{label, {text, Smaller}}, {data, Filter}]),
- gs:menuitem(Menu, [{label, {text, Larger}}, {data, Filter}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "New Filter Same Scale"}}, {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- lists:foldl(Item, 1, Filters).
-
-create_help_menu(Bar) ->
- Button = gs:menubutton(Bar, [{label, {text, "Help"}}]),
- Menu = gs:menu(Button, []),
- gs:menuitem(Menu, [{label, {text, "Display details of an event"}},
- {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{label, {text, " Single click on the name tag or the arrow (Mouse-1)"}},
- {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "Toggle actor search"}},
- {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{label, {text, " Single click on the name tag (Mouse-1)"}},
- {enable,false}]),
- gs:menuitem(Menu, [{itemtype, separator}]),
- gs:menuitem(Menu, [{label, {text, "Move actor"}},
- {bg, lightblue}, {enable,false}]),
- gs:menuitem(Menu, [{label, {text, " se drag and drop on name tag (Mouse-1)"}},
- {enable,false}]).
-
-clear_canvas(S) ->
- gs:destroy(S#state.canvas),
- CanvasW = calc_canvas_width(S),
- CanvasH = calc_canvas_height(S),
- CanOpt = [{pack_xy, {{2, 4}, 3}}, {vscroll, right}, {hscroll, bottom},
- {scrollregion, {2, 2, CanvasW, CanvasH}}],
- Canvas = gs:canvas(S#state.packer, CanOpt),
- gs:config(S#state.packer, [{width, S#state.width}, {height, S#state.height}]),
- gs:config(Canvas, [{buttonpress, true}, {buttonrelease, true}]),
- S2 = S#state{refresh_needed = false,
- y_pos = ?initial_y * S#state.scale,
- canvas = Canvas,
- canvas_width = CanvasW,
- canvas_height = CanvasH,
- events = queue_new()},
- draw_all_actors(S2).
-
-calc_canvas_width(S) ->
- Min = calc_min_actors(S),
- CanvasW = ((2 * ?initial_x) + (Min * ?incr_x)) * S#state.scale,
- lists:max([CanvasW, S#state.width - (15 * S#state.scale), S#state.canvas_width]).
-
-calc_canvas_height(S) ->
- Min = calc_min_events(S),
- CanvasH = ((2 * ?initial_y) + (Min * ?incr_y)) * S#state.scale,
- lists:max([CanvasH, S#state.height - (4 * 30), S#state.canvas_height]).
-
-calc_min_actors(S) ->
- Max = S#state.max_actors,
- N = length(S#state.actors),
- if
- Max =:= infinity ->
- N * 2;
- Max < N ->
- N;
- true ->
- Max
- end.
-
-calc_min_events(S) ->
- Max = S#state.max_events,
- N = queue_length(S#state.events),
- if
- Max =:= infinity ->
- N * 2;
- Max < N ->
- N;
- true ->
- Max
- end.
-
-display_more_events(Try, S) ->
- Name = S#state.active_filter,
- {value, F} = lists:keysearch(Name, #filter.name, S#state.filters),
- FilterFun = F#filter.function,
- Fun = fun(Event, State) ->
- case catch FilterFun(Event) of
- true ->
- State2 = ensure_key(Event, State),
- opt_display_event(Event, State2);
- {true, Event2} ->
- State2 = ensure_key(Event2, State),
- opt_display_event(Event2, State2);
- false ->
- ensure_key(Event, State);
- Bad ->
- Contents = {bad_filter, Name, Bad, Event},
- Event2 = Event#event{contents = Contents,
- from = bad_filter,
- to = bad_filter},
- State2 = ensure_key(Event2, State),
- opt_display_event(Event2, State2)
- end
- end,
- Pid = S#state.collector_pid,
- S2 = et_collector:iterate(Pid, S#state.last_event, Try, Fun, S),
- case queue_length(S2#state.events) - queue_length(S#state.events) of
- Diff when Diff =:= Try ->
- %% Got as much as requested, look for more
- %% io:format("Done: ~p~n", [{Try, Diff}]),
- {noreply, S2, 0};
- _Diff when S2#state.first_event =:= S#state.first_event,
- S2#state.last_event =:= S#state.last_event ->
- %% Got lesser than requested, wait a while before looking for more
- %% io:format("More: ~p~n", [{Try, Diff}]),
- {noreply, S2, 500};
- _Diff ->
- %% Got lesser than requested, look for more
- %% io:format("More2: ~p~n", [{Try, Diff}]),
- {noreply, S2, 0}
- end.
-
-ensure_key(E, S) when is_record(E, event), is_record(S, state) ->
- Key = et_collector:make_key(S#state.event_order, E),
- case S#state.first_event of
- first ->
- S#state{first_event = Key, last_event = Key};
- last ->
- S#state{first_event = Key, last_event = Key};
- _ ->
- S#state{last_event = Key}
- end.
-
-opt_display_event(E, S) ->
- case S#state.display_mode of
- all ->
- display_event(E, S);
- {search_actors, _Dir, _FirstKey, Actors} ->
- %% Key = S#state.last_event,
- From = select_actor_name(E#event.from, S),
- case lists:member(From, Actors) of
- true ->
- display_event(E, S);
- false ->
- To = select_actor_name(E#event.to, S),
- case lists:member(To, Actors) of
- true ->
- display_event(E, S);
- false ->
- S
- end
- end
- end.
-
-select_actor_name(Name, S) ->
- case lists:keymember(Name, #actor.name, S#state.actors) of
- true -> Name;
- false -> ?unknown
- end.
-
-display_event(E, S) when E#event.detail_level < S#state.detail_level ->
- {FromRefresh, From} = ensure_actor(E#event.from, S),
- {FromName, FromPos, S2} = From,
- {ToRefresh, To} = ensure_actor(E#event.to, S2),
- {ToName, ToPos, S3} = To,
- if
- FromRefresh =/= false, ToRefresh =/= false ->
- Key = S#state.last_event,
- refresh_beep(S),
- S3#state{refresh_needed = true,
- events = queue_in(Key, S3#state.events)};
- FromName =:= ToName ->
- case S#state.hide_actions of
- true ->
- S3;
- false ->
- Label = name_to_string(E#event.label),
- draw_named_arrow(Label, FromName, FromPos, ToName, ToPos, S3)
- end;
- true ->
- Label = name_to_string(E#event.label),
- draw_named_arrow(Label, FromName, FromPos, ToName, ToPos, S3)
- end;
-display_event(_, S) ->
- S.
-
-draw_named_arrow(Label, FromName, FromPos, ToName, ToPos, S) ->
- Key = S#state.last_event,
- case S#state.y_pos + (?incr_y * S#state.scale) of
- _ when S#state.hide_unknown =:= true, FromName =:= ?unknown ->
- S;
- _ when S#state.hide_unknown =:= true, ToName =:= ?unknown ->
- S;
- Y when Y > S#state.canvas_height ->
- refresh_beep(S),
- S#state{refresh_needed = true,
- events = queue_in(Key, S#state.events)};
- Y ->
- S2 = S#state{y_pos = Y, events = queue_in(Key, S#state.events)},
- S3 = draw_arrow(FromPos, ToPos, S2),
- draw_label(Label, FromName, ToName, FromPos, ToPos, S3)
- end.
-
-refresh_beep(S) ->
- case S#state.refresh_needed of
- false ->
- gs:config(S#state.canvas, beep),
- gs:config(S#state.canvas, beep),
- gs:config(S#state.canvas, beep);
- true ->
- ignore
- end.
-
-draw_arrow(Pos, Pos, S) ->
- S;
-draw_arrow(FromPos, ToPos, S) ->
- Y = S#state.y_pos,
- CanOpts = [{coords, [{FromPos , Y}, {ToPos, Y}]},
- {arrow, last},{width, 1}, {fg, black}],
- gs:line(S#state.canvas, CanOpts),
- S.
-
-draw_label(Label, FromName, ToName, FromPos, ToPos, S) ->
- Colour =
- if
- FromName =:= ?unknown,
- ToName =:= ?unknown -> blue; %turquoise;
- FromName =:= ?unknown -> orange;
- ToName =:= ?unknown -> orange;
- FromPos =:= ToPos -> blue;
- true -> red
- end,
- Scale = S#state.scale,
- X = lists:min([FromPos, ToPos]) + (6 * Scale),
- Y = S#state.y_pos,
- write_text(Label, X, Y, Colour, S),
- S.
-
-draw_all_actors(State) ->
- Scale = State#state.scale,
- Fun = fun(A, X) ->
- draw_actor(A, X, State),
- X + (?incr_x * Scale)
- end,
- lists:foldl(Fun, ?initial_x * Scale, State#state.actors),
- State.
-
-%% Returns: {NeedsRefreshBool, {ActorPos, NewsS, NewActors}}
-ensure_actor(Name, S) ->
- do_ensure_actor(Name, S, S#state.actors, 0).
-
-do_ensure_actor(Name, S, [H | _], N) when H#actor.name =:= Name ->
- Pos = (?initial_x + (N * ?incr_x)) * S#state.scale,
- {false, {Name, Pos, S}};
-do_ensure_actor(Name, S, [_ | T], N) ->
- do_ensure_actor(Name, S, T, N + 1);
-do_ensure_actor(Name, S, [], N) ->
- %% A brand new actor, let's see if it does fit
- Pos = (?initial_x + (N * ?incr_x)) * S#state.scale,
- MaxActors = S#state.max_actors,
- if
- is_integer(MaxActors), N > MaxActors ->
- %% Failed on max_actors limit, put into unknown
- %% Assume that unknown always is in actor list
- ensure_actor(?unknown, S);
- Pos > (S#state.canvas_width - ((?initial_x - 15) * S#state.scale)) ->
- %% New actor does not fit in canvas, refresh needed
- A = create_actor(Name),
- draw_actor(A, Pos, S),
- {true, {Name, Pos, S#state{actors = S#state.actors ++ [A]}}};
- true ->
- %% New actor fits in canvas. Draw the new actor.
- A = create_actor(Name),
- draw_actor(A, Pos, S),
- {false, {Name, Pos, S#state{actors = S#state.actors ++ [A]}}}
- end.
-
-draw_actor(A, LineX, S) ->
- Scale = S#state.scale,
- TextX = LineX - (5 * Scale),
- TextY = ?initial_y * Scale,
- LineTopY = TextY + ((?incr_y / 2) * Scale),
- LineBotY = S#state.canvas_height - ((?incr_y / 2) * Scale),
- Colour = case A#actor.name of
- ?unknown -> orange;
- _ -> red
- end,
- write_text(A#actor.string, TextX, TextY, Colour, S),
- LineOpt = [{coords, [{LineX, LineTopY}, {LineX, LineBotY}]},
- {width, 1}, {fg, Colour}],
- gs:line(S#state.canvas, LineOpt).
-
-toggle_search_for_actor(ActorName,S) ->
- case S#state.display_mode of
- all ->
- io:format("~p: search for: ~p ++ ~p~n", [?MODULE, [], [ActorName]]),
- %% Search for this actor
- Key = S#state.first_event,
- Actors = [ActorName],
- Mode = {search_actors, forward, Key, Actors},
- change_display_mode(Mode, S);
- {search_actors, Dir, Key, Actors}->
- Actors2 =
- case lists:member(ActorName, Actors) of
- true ->
- io:format("~p: search for: ~p -- ~p~n", [?MODULE, Actors, [ActorName]]),
- %% Remove actor from search list
- Actors -- [ActorName];
- false ->
- io:format("~p: search for: ~p ++ ~p~n", [?MODULE, Actors, [ActorName]]),
- %% Add actor from search list
- [ActorName | Actors]
- end,
- Mode2 = {search_actors, Dir, Key, Actors2},
- change_display_mode(Mode2, S)
- end.
-
-move_actor(From, To, Actors, S) ->
- Pos = #actor.name,
- ToName = To#actor.name,
- FromName = From#actor.name,
- ToIx = actor_index(ToName, Pos, Actors),
- FromIx = actor_index(FromName, Pos, Actors),
- if
- FromIx =/= 0, ToIx =/= 0, ToIx > FromIx ->
- Actors2 = lists:keydelete(FromName, Pos, Actors),
- Actors3 = insert_actor_after(From, To, Actors2),
- S2 = S#state{actors = Actors3},
- refresh_main_window(S2);
- FromIx =/= 0, ToIx =/= 0 ->
- Actors2 = lists:keydelete(FromName, Pos, Actors),
- Actors3 = insert_actor_before(From, To, Actors2),
- S2 = S#state{actors = Actors3},
- refresh_main_window(S2);
- true ->
- %% Ignore
- S
- end.
-
-insert_actor_after(From, To, [H | T]) ->
- case To#actor.name =:= H#actor.name of
- true -> [H, From | T];
- false -> [H | insert_actor_after(From, To, T)]
- end;
-insert_actor_after(_From, _To, []) ->
- [].
-
-insert_actor_before(From, To, [H | T]) ->
- case To#actor.name =:= H#actor.name of
- true -> [From, H | T];
- false -> [H | insert_actor_before(From, To, T)]
- end;
-insert_actor_before(_From, _To, []) ->
- [].
-
-actor_index(_Key, _Pos, []) ->
- 0;
-actor_index(Key, Pos, [H | T]) ->
- case Key =:= element(Pos, H) of
- false -> actor_index(Key, Pos, T) + 1;
- true -> 1
- end.
-
-y_to_n(Y, S) ->
- Y2 = ((Y / S#state.scale) - ?initial_y + (?incr_y / 2)),
- N = round(Y2 / ?incr_y - 0.2),
- MaxN = queue_length(S#state.events),
- if
- N =< 0 -> actor;
- N > MaxN -> actor;
- true -> {event, N}
- end.
-
-x_to_n(X, S) ->
- Scale = S#state.scale,
- Len = length(S#state.actors),
- X2 = X - (?initial_x * Scale),
- N = X2 / (?incr_x * Scale),
- N2 = trunc(N + 1.5),
- if
- N2 > Len -> Len;
- N2 < 1 -> 1;
- true -> N2
- end.
-
-write_text(Text, X, Y, Colour, S) ->
- Opt = [{coords, [{X, Y - (?incr_y * S#state.scale / 2)}]},
- {font, S#state.font}, {fg, Colour}, {text, Text}],
- gs:text(S#state.canvas, Opt).
-
-create_contents_window(Event, S) ->
- Options = [{viewer_pid, self()},
- {event, Event},
- {event_order, S#state.event_order},
- {active_filter, S#state.active_filter}
- | S#state.filters],
- case et_gs_contents_viewer:start_link(Options) of
- {ok, _Pid} ->
- S;
- {error, Reason} ->
- ok = error_logger:format("~p(~p): create_contents_window(~p) ->~n ~p~n",
- [?MODULE, self(), Options, Reason]),
- S
- end.
-
-%%%----------------------------------------------------------------------
-%%% String padding of actors
-%%%----------------------------------------------------------------------
-
-create_actor(Name) ->
- String = name_to_string(Name),
- PaddedString = pad_string(String, 8),
- #actor{name = Name, string = PaddedString}.
-
-name_to_string(Name) ->
- case catch io_lib:format("~s", [Name]) of
- {'EXIT', _} -> lists:flatten(io_lib:format("~w", [Name]));
- GoodString -> lists:flatten(GoodString)
- end.
-
-pad_string(Atom, MinLen) when is_atom(Atom) ->
- pad_string(atom_to_list(Atom), MinLen);
-pad_string(String, MinLen) when is_integer(MinLen), MinLen >= 0 ->
- Len = length(String),
- case Len >= MinLen of
- true ->
- String;
- false ->
- String ++ lists:duplicate(MinLen - Len, $ )
- end.
-
-%%%----------------------------------------------------------------------
-%%% Queue management
-%%%----------------------------------------------------------------------
-
-queue_new() ->
- {0, [], []}.
-
-queue_in(X, {Size, In, Out}) ->
- {Size + 1, [X | In], Out}.
-
-%% queue_out(Q) ->
-%% case Q of
-%% {Size, In, [H | Out]} -> {{value, H}, {Size - 1, In, Out}};
-%% {Size, [], []} -> {empty, {Size, [], []}};
-%% {Size, In, _} -> queue_out({Size, [], lists:reverse(In)})
-%% end.
-
-queue_to_list({_Size, [], Out}) ->
- Out;
-queue_to_list({_Size, In, Out}) ->
- Out ++ lists:reverse(In).
-
-queue_length({Size, _In, _Out}) ->
- Size.
-
-list_to_queue(List) when is_list(List) ->
- {length(List), [], List}.
diff --git a/lib/et/src/et_viewer.erl b/lib/et/src/et_viewer.erl
index d9bd01f8d0..ead5639da6 100644
--- a/lib/et/src/et_viewer.erl
+++ b/lib/et/src/et_viewer.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -76,7 +76,7 @@ start() ->
%% start(Options) -> {ok, ViewerPid} | {error, Reason}
%%----------------------------------------------------------------------
-start(GUI) when GUI =:= wx; GUI =:= gs; GUI =:= default ->
+start(GUI) when GUI =:= wx; GUI =:= default ->
start_link([{trace_global, true}], GUI);
start(Options) ->
start_link([{parent_pid, undefined} | Options], default).
@@ -139,7 +139,7 @@ start(Options, GUI) ->
%% and returns false | true | {true, NewEvent}.
%%----------------------------------------------------------------------
-start_link(GUI) when GUI =:= wx; GUI =:= gs; GUI =:= default ->
+start_link(GUI) when GUI =:= wx; GUI =:= default ->
start_link([{trace_global, true}], GUI);
start_link(Options) ->
start_link(Options, default).
@@ -148,22 +148,11 @@ start_link(Options, GUI) ->
case GUI of
wx ->
et_wx_viewer:start_link(Options);
- gs ->
- et_gs_viewer:start_link(Options);
default ->
start_link(Options, which_gui())
end.
-
-which_gui() ->
- try
- wx:new(),
- wx:destroy(),
- wx
- catch _:_ ->
- gs
- end.
-
+which_gui() -> wx.
get_collector_pid(ViewerPid) ->
call(ViewerPid, get_collector_pid).
diff --git a/lib/et/src/modules.mk b/lib/et/src/modules.mk
index 8d6c0902fb..b2d2f0b481 100644
--- a/lib/et/src/modules.mk
+++ b/lib/et/src/modules.mk
@@ -1,7 +1,7 @@
#-*-makefile-*- ; force emacs to enter makefile-mode
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2010. All Rights Reserved.
+# Copyright Ericsson AB 2001-2013. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -19,8 +19,6 @@
MODULES = \
et \
et_collector \
- et_gs_contents_viewer \
- et_gs_viewer \
et_selector \
et_viewer \
et_wx_contents_viewer \
diff --git a/lib/hipe/cerl/erl_bif_types.erl b/lib/hipe/cerl/erl_bif_types.erl
index 42c7e360c1..32a502e212 100644
--- a/lib/hipe/cerl/erl_bif_types.erl
+++ b/lib/hipe/cerl/erl_bif_types.erl
@@ -30,19 +30,17 @@
%-define(BITS, (hipe_rtl_arch:word_size() * 8) - ?TAG_IMMED1_SIZE).
-define(BITS, 128). %This is only in bsl to convert answer to pos_inf/neg_inf.
--define(TAG_IMMED1_SIZE, 4).
+-export([type/3, type/4, type/5, arg_types/3,
+ is_known/3, opaque_args/5, infinity_add/2]).
--export([type/3, type/4, arg_types/3,
- is_known/3, structure_inspecting_args/3, infinity_add/2]).
-
--import(erl_types, [number_max/1,
- number_min/1,
+-import(erl_types, [number_max/2,
+ number_min/2,
t_any/0,
t_arity/0,
t_atom/0,
t_atom/1,
t_atoms/1,
- t_atom_vals/1,
+ t_atom_vals/2,
t_binary/0,
t_bitstr/0,
t_boolean/0,
@@ -60,10 +58,11 @@
t_from_term/1,
t_fun/0,
t_fun/2,
- t_fun_args/1,
- t_fun_range/1,
+ t_fun_args/2,
+ t_fun_range/2,
t_identifier/0,
- t_inf/2,
+ t_has_opaque_subtype/2,
+ t_inf/3,
t_integer/0,
t_integer/1,
t_non_neg_fixnum/0,
@@ -71,30 +70,28 @@
t_pos_integer/0,
t_integers/1,
t_is_any/1,
- t_is_atom/1,
- t_is_binary/1,
- t_is_bitstr/1,
- t_is_boolean/1,
- t_is_cons/1,
- t_is_float/1,
- t_is_float/1,
- t_is_fun/1,
- t_is_integer/1,
- t_is_integer/1,
- t_is_nil/1,
+ t_is_atom/2,
+ t_is_binary/2,
+ t_is_bitstr/2,
+ t_is_boolean/2,
+ t_is_cons/2,
+ t_is_float/2,
+ t_is_fun/2,
+ t_is_integer/2,
+ t_is_nil/1, t_is_nil/2,
t_is_none/1,
t_is_none_or_unit/1,
- t_is_number/1,
- t_is_pid/1,
- t_is_port/1,
- t_is_maybe_improper_list/1,
- t_is_reference/1,
+ t_is_number/2,
+ t_is_pid/2,
+ t_is_port/2,
+ t_is_maybe_improper_list/2,
+ t_is_reference/2,
t_is_string/1,
t_is_subtype/2,
- t_is_tuple/1,
+ t_is_tuple/2,
t_list/0,
t_list/1,
- t_list_elements/1,
+ t_list_elements/2,
t_list_termination/1,
t_mfa/0,
t_module/0,
@@ -104,7 +101,7 @@
t_nonempty_list/0,
t_nonempty_list/1,
t_number/0,
- t_number_vals/1,
+ t_number_vals/2,
t_pid/0,
t_port/0,
t_maybe_improper_list/0,
@@ -115,9 +112,9 @@
t_sup/2,
t_tuple/0,
t_tuple/1,
- t_tuple_args/1,
- t_tuple_size/1,
- t_tuple_subtypes/1
+ t_tuple_args/2,
+ t_tuple_size/2,
+ t_tuple_subtypes/2
]).
-ifdef(DO_ERL_BIF_TYPES_TEST).
@@ -129,47 +126,61 @@
-spec type(atom(), atom(), arity()) -> erl_types:erl_type().
type(M, F, A) ->
- type(M, F, A, any_list(A)).
+ type(M, F, A, any_list(A), []).
%% Arguments should be checked for undefinedness, so we do not make
%% unnecessary overapproximations.
-spec type(atom(), atom(), arity(), [erl_types:erl_type()]) -> erl_types:erl_type().
+type(M, F, A, Xs) ->
+ type(M, F, A, Xs, 'universe').
+
+-type opaques() :: 'universe' | [erl_types:erl_type()].
+
+-type arg_types() :: [erl_types:erl_type()].
+
+-spec type(atom(), atom(), arity(), arg_types(), opaques()) ->
+ erl_types:erl_type().
+
%%-- erlang -------------------------------------------------------------------
-type(erlang, halt, 0, _) -> t_none();
-type(erlang, halt, 1, _) -> t_none();
-type(erlang, halt, 2, _) -> t_none();
-type(erlang, exit, 1, _) -> t_none();
-type(erlang, error, 1, _) -> t_none();
-type(erlang, error, 2, _) -> t_none();
-type(erlang, throw, 1, _) -> t_none();
-type(erlang, '==', 2, Xs = [X1, X2]) ->
- case t_is_atom(X1) andalso t_is_atom(X2) of
- true -> type(erlang, '=:=', 2, Xs);
+type(erlang, halt, 0, _, _) -> t_none();
+type(erlang, halt, 1, _, _) -> t_none();
+type(erlang, halt, 2, _, _) -> t_none();
+type(erlang, exit, 1, _, _) -> t_none();
+type(erlang, error, 1, _, _) -> t_none();
+type(erlang, error, 2, _, _) -> t_none();
+type(erlang, throw, 1, _, _) -> t_none();
+type(erlang, '==', 2, Xs = [X1, X2], Opaques) ->
+ case
+ t_is_atom(X1, Opaques) andalso t_is_atom(X2, Opaques)
+ of
+ true -> type(erlang, '=:=', 2, Xs, Opaques);
false ->
- case t_is_integer(X1) andalso t_is_integer(X2) of
- true -> type(erlang, '=:=', 2, Xs);
- false -> strict(Xs, t_boolean())
+ case t_is_integer(X1, Opaques) andalso t_is_integer(X2, Opaques) of
+ true -> type(erlang, '=:=', 2, Xs, Opaques);
+ false -> strict2(Xs, t_boolean())
end
end;
-type(erlang, '/=', 2, Xs = [X1, X2]) ->
- case t_is_atom(X1) andalso t_is_atom(X2) of
- true -> type(erlang, '=/=', 2, Xs);
+type(erlang, '/=', 2, Xs = [X1, X2], Opaques) ->
+ case
+ t_is_atom(X1, Opaques) andalso t_is_atom(X2, Opaques)
+ of
+ true -> type(erlang, '=/=', 2, Xs, Opaques);
false ->
- case t_is_integer(X1) andalso t_is_integer(X2) of
- true -> type(erlang, '=/=', 2, Xs);
- false -> strict(Xs, t_boolean())
+ case t_is_integer(X1, Opaques) andalso t_is_integer(X2, Opaques) of
+ true -> type(erlang, '=/=', 2, Xs, Opaques);
+ false -> strict2(Xs, t_boolean())
end
end;
-type(erlang, '=:=', 2, Xs = [Lhs, Rhs]) ->
+type(erlang, '=:=', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_none(t_inf(Lhs, Rhs)) of
+ case t_is_none(t_inf(Lhs, Rhs, Opaques)) of
true -> t_atom('false');
false ->
- case t_is_atom(Lhs) andalso t_is_atom(Rhs) of
+ case t_is_atom(Lhs, Opaques) andalso t_is_atom(Rhs, Opaques) of
true ->
- case {t_atom_vals(Lhs), t_atom_vals(Rhs)} of
+ case {t_atom_vals(Lhs, Opaques), t_atom_vals(Rhs, Opaques)} of
{unknown, _} -> t_boolean();
{_, unknown} -> t_boolean();
{[X], [X]} -> t_atom('true');
@@ -181,16 +192,20 @@ type(erlang, '=:=', 2, Xs = [Lhs, Rhs]) ->
end
end;
false ->
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case
+ t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques)
+ of
false -> t_boolean();
true ->
- case {t_number_vals(Lhs), t_number_vals(Rhs)} of
+ case
+ {t_number_vals(Lhs, Opaques), t_number_vals(Rhs, Opaques)}
+ of
{[X], [X]} when is_integer(X) -> t_atom('true');
_ ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
Ans1 = (is_integer(LhsMin)
andalso is_integer(RhsMax)
andalso (LhsMin > RhsMax)),
@@ -205,15 +220,15 @@ type(erlang, '=:=', 2, Xs = [Lhs, Rhs]) ->
end
end
end,
- strict(Xs, Ans);
-type(erlang, '=/=', 2, Xs = [Lhs, Rhs]) ->
+ strict2(Xs, Ans);
+type(erlang, '=/=', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_none(t_inf(Lhs, Rhs)) of
+ case t_is_none(t_inf(Lhs, Rhs, Opaques)) of
true -> t_atom('true');
false ->
- case t_is_atom(Lhs) andalso t_is_atom(Rhs) of
+ case t_is_atom(Lhs, Opaques) andalso t_is_atom(Rhs, Opaques) of
true ->
- case {t_atom_vals(Lhs), t_atom_vals(Rhs)} of
+ case {t_atom_vals(Lhs, Opaques), t_atom_vals(Rhs, Opaques)} of
{unknown, _} -> t_boolean();
{_, unknown} -> t_boolean();
{[Val], [Val]} -> t_atom('false');
@@ -221,13 +236,15 @@ type(erlang, '=/=', 2, Xs = [Lhs, Rhs]) ->
t_sup([t_from_term(X =/= Y) || X <- LhsVals, Y <- RhsVals])
end;
false ->
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case
+ t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques)
+ of
false -> t_boolean();
true ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
Ans1 = (is_integer(LhsMin) andalso is_integer(RhsMax)
andalso (LhsMin > RhsMax)),
Ans2 = (is_integer(LhsMax) andalso is_integer(RhsMin)
@@ -244,15 +261,15 @@ type(erlang, '=/=', 2, Xs = [Lhs, Rhs]) ->
end
end
end,
- strict(Xs, Ans);
-type(erlang, '>', 2, Xs = [Lhs, Rhs]) ->
+ strict2(Xs, Ans);
+type(erlang, '>', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques) of
true ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
T = t_atom('true'),
F = t_atom('false'),
if
@@ -260,17 +277,17 @@ type(erlang, '>', 2, Xs = [Lhs, Rhs]) ->
is_integer(LhsMax), is_integer(RhsMin), RhsMin >= LhsMax -> F;
true -> t_boolean()
end;
- false -> compare('>', Lhs, Rhs)
+ false -> compare('>', Lhs, Rhs, Opaques)
end,
- strict(Xs, Ans);
-type(erlang, '>=', 2, Xs = [Lhs, Rhs]) ->
+ strict2(Xs, Ans);
+type(erlang, '>=', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques) of
true ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
T = t_atom('true'),
F = t_atom('false'),
if
@@ -278,17 +295,17 @@ type(erlang, '>=', 2, Xs = [Lhs, Rhs]) ->
is_integer(LhsMax), is_integer(RhsMin), RhsMin > LhsMax -> F;
true -> t_boolean()
end;
- false -> compare('>=', Lhs, Rhs)
+ false -> compare('>=', Lhs, Rhs, Opaques)
end,
- strict(Xs, Ans);
-type(erlang, '<', 2, Xs = [Lhs, Rhs]) ->
+ strict2(Xs, Ans);
+type(erlang, '<', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques) of
true ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
T = t_atom('true'),
F = t_atom('false'),
if
@@ -296,17 +313,17 @@ type(erlang, '<', 2, Xs = [Lhs, Rhs]) ->
is_integer(LhsMin), is_integer(RhsMax), RhsMax =< LhsMin -> F;
true -> t_boolean()
end;
- false -> compare('<', Lhs, Rhs)
+ false -> compare('<', Lhs, Rhs, Opaques)
end,
- strict(Xs, Ans);
-type(erlang, '=<', 2, Xs = [Lhs, Rhs]) ->
+ strict2(Xs, Ans);
+type(erlang, '=<', 2, Xs = [Lhs, Rhs], Opaques) ->
Ans =
- case t_is_integer(Lhs) andalso t_is_integer(Rhs) of
+ case t_is_integer(Lhs, Opaques) andalso t_is_integer(Rhs, Opaques) of
true ->
- LhsMax = number_max(Lhs),
- LhsMin = number_min(Lhs),
- RhsMax = number_max(Rhs),
- RhsMin = number_min(Rhs),
+ LhsMax = number_max(Lhs, Opaques),
+ LhsMin = number_min(Lhs, Opaques),
+ RhsMax = number_max(Rhs, Opaques),
+ RhsMin = number_min(Rhs, Opaques),
T = t_atom('true'),
F = t_atom('false'),
if
@@ -314,232 +331,237 @@ type(erlang, '=<', 2, Xs = [Lhs, Rhs]) ->
is_integer(LhsMin), is_integer(RhsMax), RhsMax < LhsMin -> F;
true -> t_boolean()
end;
- false -> compare('=<', Lhs, Rhs)
+ false -> compare('=<', Lhs, Rhs, Opaques)
end,
- strict(Xs, Ans);
-type(erlang, '+', 1, Xs) ->
- strict(arg_types(erlang, '+', 1), Xs,
- fun ([X]) -> X end);
-type(erlang, '-', 1, Xs) ->
- strict(arg_types(erlang, '-', 1), Xs,
+ strict2(Xs, Ans);
+type(erlang, '+', 1, Xs, Opaques) ->
+ strict(erlang, '+', 1, Xs, fun ([X]) -> X end, Opaques);
+type(erlang, '-', 1, Xs, Opaques) ->
+ strict(erlang, '-', 1, Xs,
fun ([X]) ->
- case t_is_integer(X) of
+ case t_is_integer(X, Opaques) of
true -> type(erlang, '-', 2, [t_integer(0), X]);
false -> X
end
- end);
-type(erlang, '!', 2, Xs) ->
- strict(arg_types(erlang, '!', 2), Xs, fun ([_, X2]) -> X2 end);
-type(erlang, '+', 2, Xs) ->
- strict(arg_types(erlang, '+', 2), Xs,
+ end, Opaques);
+type(erlang, '!', 2, Xs, Opaques) ->
+ strict(erlang, '!', 2, Xs, fun ([_, X2]) -> X2 end, Opaques);
+type(erlang, '+', 2, Xs, Opaques) ->
+ strict(erlang, '+', 2, Xs,
fun ([X1, X2]) ->
- case arith('+', X1, X2) of
+ case arith('+', X1, X2, Opaques) of
{ok, T} -> T;
error ->
- case t_is_float(X1) orelse t_is_float(X2) of
+ case
+ t_is_float(X1, Opaques) orelse t_is_float(X2, Opaques)
+ of
true -> t_float();
false -> t_number()
end
end
- end);
-type(erlang, '-', 2, Xs) ->
- strict(arg_types(erlang, '-', 2), Xs,
+ end, Opaques);
+type(erlang, '-', 2, Xs, Opaques) ->
+ strict(erlang, '-', 2, Xs,
fun ([X1, X2]) ->
- case arith('-', X1, X2) of
+ case arith('-', X1, X2, Opaques) of
{ok, T} -> T;
error ->
- case t_is_float(X1) orelse t_is_float(X2) of
+ case
+ t_is_float(X1, Opaques) orelse t_is_float(X2, Opaques)
+ of
true -> t_float();
false -> t_number()
end
end
- end);
-type(erlang, '*', 2, Xs) ->
- strict(arg_types(erlang, '*', 2), Xs,
+ end, Opaques);
+type(erlang, '*', 2, Xs, Opaques) ->
+ strict(erlang, '*', 2, Xs,
fun ([X1, X2]) ->
- case arith('*', X1, X2) of
+ case arith('*', X1, X2, Opaques) of
{ok, T} -> T;
error ->
- case t_is_float(X1) orelse t_is_float(X2) of
+ case
+ t_is_float(X1, Opaques) orelse t_is_float(X2, Opaques)
+ of
true -> t_float();
false -> t_number()
end
end
- end);
-type(erlang, '/', 2, Xs) ->
- strict(arg_types(erlang, '/', 2), Xs,
- fun (_) -> t_float() end);
-type(erlang, 'div', 2, Xs) ->
- strict(arg_types(erlang, 'div', 2), Xs,
+ end, Opaques);
+type(erlang, '/', 2, Xs, Opaques) ->
+ strict(erlang, '/', 2, Xs, fun (_) -> t_float() end, Opaques);
+type(erlang, 'div', 2, Xs, Opaques) ->
+ strict(erlang, 'div', 2, Xs,
fun ([X1, X2]) ->
- case arith('div', X1, X2) of
+ case arith('div', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
-type(erlang, 'rem', 2, Xs) ->
- strict(arg_types(erlang, 'rem', 2), Xs,
+ end, Opaques);
+type(erlang, 'rem', 2, Xs, Opaques) ->
+ strict(erlang, 'rem', 2, Xs,
fun ([X1, X2]) ->
- case arith('rem', X1, X2) of
+ case arith('rem', X1, X2, Opaques) of
error -> t_non_neg_integer();
{ok, T} -> T
end
- end);
-type(erlang, '++', 2, Xs) ->
- strict(arg_types(erlang, '++', 2), Xs,
+ end, Opaques);
+type(erlang, '++', 2, Xs, Opaques) ->
+ strict(erlang, '++', 2, Xs,
fun ([X1, X2]) ->
- case t_is_nil(X1) of
+ case t_is_nil(X1, Opaques) of
true -> X2; % even if X2 is not a list
false ->
- case t_is_nil(X2) of
+ case t_is_nil(X2, Opaques) of
true -> X1;
false ->
- E1 = t_list_elements(X1),
- case t_is_cons(X1) of
+ E1 = t_list_elements(X1, Opaques),
+ case t_is_cons(X1, Opaques) of
true -> t_cons(E1, X2);
false ->
t_sup(X2, t_cons(E1, X2))
end
end
end
- end);
-type(erlang, '--', 2, Xs) ->
+ end, Opaques);
+type(erlang, '--', 2, Xs, Opaques) ->
%% We don't know which elements (if any) in X2 will be found and
%% removed from X1, even if they would have the same type. Thus, we
%% must assume that X1 can remain unchanged. However, if we succeed,
%% we know that X1 must be a proper list, but the result could
%% possibly be empty even if X1 is nonempty.
- strict(arg_types(erlang, '--', 2), Xs,
+ strict(erlang, '--', 2, Xs,
fun ([X1, X2]) ->
- case t_is_nil(X1) of
+ case t_is_nil(X1, Opaques) of
true -> t_nil();
false ->
- case t_is_nil(X2) of
+ case t_is_nil(X2, Opaques) of
true -> X1;
- false -> t_list(t_list_elements(X1))
+ false -> t_list(t_list_elements(X1, Opaques))
end
end
- end);
-type(erlang, 'and', 2, Xs) ->
- strict(arg_types(erlang, 'and', 2), Xs, fun (_) -> t_boolean() end);
-type(erlang, 'or', 2, Xs) ->
- strict(arg_types(erlang, 'or', 2), Xs, fun (_) -> t_boolean() end);
-type(erlang, 'xor', 2, Xs) ->
- strict(arg_types(erlang, 'xor', 2), Xs, fun (_) -> t_boolean() end);
-type(erlang, 'not', 1, Xs) ->
- strict(arg_types(erlang, 'not', 1), Xs, fun (_) -> t_boolean() end);
-type(erlang, 'band', 2, Xs) ->
- strict(arg_types(erlang, 'band', 2), Xs,
+ end, Opaques);
+type(erlang, 'and', 2, Xs, Opaques) ->
+ strict(erlang, 'and', 2, Xs, fun (_) -> t_boolean() end, Opaques);
+type(erlang, 'or', 2, Xs, Opaques) ->
+ strict(erlang, 'or', 2, Xs, fun (_) -> t_boolean() end, Opaques);
+type(erlang, 'xor', 2, Xs, Opaques) ->
+ strict(erlang, 'xor', 2, Xs, fun (_) -> t_boolean() end, Opaques);
+type(erlang, 'not', 1, Xs, Opaques) ->
+ strict(erlang, 'not', 1, Xs, fun (_) -> t_boolean() end, Opaques);
+type(erlang, 'band', 2, Xs, Opaques) ->
+ strict(erlang, 'band', 2, Xs,
fun ([X1, X2]) ->
- case arith('band', X1, X2) of
+ case arith('band', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% The result is not wider than the smallest argument. We need to
%% kill any value-sets in the result.
-%% strict(arg_types(erlang, 'band', 2), Xs,
-%% fun ([X1, X2]) -> t_sup(t_inf(X1, X2), t_byte()) end);
-type(erlang, 'bor', 2, Xs) ->
- strict(arg_types(erlang, 'bor', 2), Xs,
+%% strict(erlang, 'band', 2, Xs,
+%% fun ([X1, X2]) -> t_sup(t_inf(X1, X2, Opaques), t_byte()) end, Opaques);
+type(erlang, 'bor', 2, Xs, Opaques) ->
+ strict(erlang, 'bor', 2, Xs,
fun ([X1, X2]) ->
- case arith('bor', X1, X2) of
+ case arith('bor', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% The result is not wider than the largest argument. We need to
%% kill any value-sets in the result.
-%% strict(arg_types(erlang, 'bor', 2), Xs,
-%% fun ([X1, X2]) -> t_sup(t_sup(X1, X2), t_byte()) end);
-type(erlang, 'bxor', 2, Xs) ->
- strict(arg_types(erlang, 'bxor', 2), Xs,
+%% strict(erlang, 'bor', 2, Xs,
+%% fun ([X1, X2]) -> t_sup(t_sup(X1, X2), t_byte()) end, Opaques);
+type(erlang, 'bxor', 2, Xs, Opaques) ->
+ strict(erlang, 'bxor', 2, Xs,
fun ([X1, X2]) ->
- case arith('bxor', X1, X2) of
+ case arith('bxor', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% The result is not wider than the largest argument. We need to
%% kill any value-sets in the result.
-%% strict(arg_types(erlang, 'bxor', 2), Xs,
-%% fun ([X1, X2]) -> t_sup(t_sup(X1, X2), t_byte()) end);
-type(erlang, 'bsr', 2, Xs) ->
- strict(arg_types(erlang, 'bsr', 2), Xs,
+%% strict(erlang, 'bxor', 2, Xs,
+%% fun ([X1, X2]) -> t_sup(t_sup(X1, X2), t_byte()) end, Opaques);
+type(erlang, 'bsr', 2, Xs, Opaques) ->
+ strict(erlang, 'bsr', 2, Xs,
fun ([X1, X2]) ->
- case arith('bsr', X1, X2) of
+ case arith('bsr', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% If the first argument is unsigned (which is the case for
%% characters and bytes), the result is never wider. We need to kill
%% any value-sets in the result.
-%% strict(arg_types(erlang, 'bsr', 2), Xs,
-%% fun ([X, _]) -> t_sup(X, t_byte()) end);
-type(erlang, 'bsl', 2, Xs) ->
- strict(arg_types(erlang, 'bsl', 2), Xs,
+%% strict(erlang, 'bsr', 2, Xs,
+%% fun ([X, _]) -> t_sup(X, t_byte()) end, Opaques);
+type(erlang, 'bsl', 2, Xs, Opaques) ->
+ strict(erlang, 'bsl', 2, Xs,
fun ([X1, X2]) ->
- case arith('bsl', X1, X2) of
+ case arith('bsl', X1, X2, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% Not worth doing anything special here.
-%% strict(arg_types(erlang, 'bsl', 2), Xs, fun (_) -> t_integer() end);
-type(erlang, 'bnot', 1, Xs) ->
- strict(arg_types(erlang, 'bnot', 1), Xs,
+%% strict(erlang, 'bsl', 2, Xs, fun (_) -> t_integer() end, Opaques);
+type(erlang, 'bnot', 1, Xs, Opaques) ->
+ strict(erlang, 'bnot', 1, Xs,
fun ([X1]) ->
- case arith('bnot', X1) of
+ case arith('bnot', X1, Opaques) of
error -> t_integer();
{ok, T} -> T
end
- end);
+ end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, abs, 1, Xs) ->
- strict(arg_types(erlang, abs, 1), Xs, fun ([X]) -> X end);
+type(erlang, abs, 1, Xs, Opaques) ->
+ strict(erlang, abs, 1, Xs, fun ([X]) -> X end, Opaques);
%% This returns (-X)-1, so it often gives a negative result.
-%% strict(arg_types(erlang, 'bnot', 1), Xs, fun (_) -> t_integer() end);
-type(erlang, append, 2, Xs) -> type(erlang, '++', 2, Xs); % alias
-type(erlang, apply, 2, Xs) ->
+%% strict(erlang, 'bnot', 1, Xs, fun (_) -> t_integer() end, Opaques);
+type(erlang, append, 2, Xs, _Opaques) -> type(erlang, '++', 2, Xs); % alias
+type(erlang, apply, 2, Xs, Opaques) ->
Fun = fun ([X, _Y]) ->
- case t_is_fun(X) of
+ case t_is_fun(X, Opaques) of
true ->
- t_fun_range(X);
+ t_fun_range(X, Opaques);
false ->
t_any()
end
end,
- strict(arg_types(erlang, apply, 2), Xs, Fun);
-type(erlang, apply, 3, Xs) ->
- strict(arg_types(erlang, apply, 3), Xs, fun (_) -> t_any() end);
+ strict(erlang, apply, 2, Xs, Fun, Opaques);
+type(erlang, apply, 3, Xs, Opaques) ->
+ strict(erlang, apply, 3, Xs, fun (_) -> t_any() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, binary_part, 2, Xs) ->
- strict(arg_types(erlang, binary_part, 2), Xs, fun (_) -> t_binary() end);
+type(erlang, binary_part, 2, Xs, Opaques) ->
+ strict(erlang, binary_part, 2, Xs, fun (_) -> t_binary() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, binary_part, 3, Xs) ->
- strict(arg_types(erlang, binary_part, 3), Xs, fun (_) -> t_binary() end);
+type(erlang, binary_part, 3, Xs, Opaques) ->
+ strict(erlang, binary_part, 3, Xs, fun (_) -> t_binary() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, bit_size, 1, Xs) ->
- strict(arg_types(erlang, bit_size, 1), Xs,
- fun (_) -> t_non_neg_integer() end);
+type(erlang, bit_size, 1, Xs, Opaques) ->
+ strict(erlang, bit_size, 1, Xs,
+ fun (_) -> t_non_neg_integer() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, byte_size, 1, Xs) ->
- strict(arg_types(erlang, byte_size, 1), Xs,
- fun (_) -> t_non_neg_integer() end);
-type(erlang, disconnect_node, 1, Xs) ->
- strict(arg_types(erlang, disconnect_node, 1), Xs, fun (_) -> t_sup([t_boolean(), t_atom('ignored')]) end);
+type(erlang, byte_size, 1, Xs, Opaques) ->
+ strict(erlang, byte_size, 1, Xs,
+ fun (_) -> t_non_neg_integer() end, Opaques);
+type(erlang, disconnect_node, 1, Xs, Opaques) ->
+ strict(erlang, disconnect_node, 1, Xs,
+ fun (_) -> t_sup([t_boolean(), t_atom('ignored')]) end, Opaques);
%% Guard bif, needs to be here.
%% Also much more expressive than anything you could write in a spec...
-type(erlang, element, 2, Xs) ->
- strict(arg_types(erlang, element, 2), Xs,
+type(erlang, element, 2, Xs, Opaques) ->
+ strict(erlang, element, 2, Xs,
fun ([X1, X2]) ->
- case t_tuple_subtypes(X2) of
+ case t_tuple_subtypes(X2, Opaques) of
unknown -> t_any();
[_] ->
- Sz = t_tuple_size(X2),
- As = t_tuple_args(X2),
- case t_number_vals(X1) of
+ Sz = t_tuple_size(X2, Opaques),
+ As = t_tuple_args(X2, Opaques),
+ case t_number_vals(X1, Opaques) of
unknown -> t_sup(As);
Ns when is_list(Ns) ->
Fun = fun
@@ -553,165 +575,161 @@ type(erlang, element, 2, Xs) ->
Ts when is_list(Ts) ->
t_sup([type(erlang, element, 2, [X1, Y]) || Y <- Ts])
end
- end);
+ end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, float, 1, Xs) ->
- strict(arg_types(erlang, float, 1), Xs, fun (_) -> t_float() end);
-type(erlang, fun_info, 1, Xs) ->
- strict(arg_types(erlang, fun_info, 1), Xs,
- fun (_) -> t_list(t_tuple([t_atom(), t_any()])) end);
-type(erlang, get_cookie, 0, _) -> t_atom(); % | t_atom('nocookie')
+type(erlang, float, 1, Xs, Opaques) ->
+ strict(erlang, float, 1, Xs, fun (_) -> t_float() end, Opaques);
+type(erlang, fun_info, 1, Xs, Opaques) ->
+ strict(erlang, fun_info, 1, Xs,
+ fun (_) -> t_list(t_tuple([t_atom(), t_any()])) end, Opaques);
+type(erlang, get_cookie, 0, _, _Opaques) -> t_atom(); % | t_atom('nocookie')
%% Guard bif, needs to be here.
-type(erlang, hd, 1, Xs) ->
- strict(arg_types(erlang, hd, 1), Xs, fun ([X]) -> t_cons_hd(X) end);
-type(erlang, integer_to_list, 2, Xs) ->
- strict(arg_types(erlang, integer_to_list, 2), Xs,
- fun (_) -> t_string() end);
-type(erlang, info, 1, Xs) -> type(erlang, system_info, 1, Xs); % alias
+type(erlang, hd, 1, Xs, Opaques) ->
+ strict(erlang, hd, 1, Xs, fun ([X]) -> t_cons_hd(X) end, Opaques);
+type(erlang, integer_to_list, 2, Xs, Opaques) ->
+ strict(erlang, integer_to_list, 2, Xs,
+ fun (_) -> t_string() end, Opaques);
+type(erlang, info, 1, Xs, _) -> type(erlang, system_info, 1, Xs); % alias
%% All type tests are guard BIF's and may be implemented in ways that
%% cannot be expressed in a type spec, why they are kept in erl_bif_types.
-type(erlang, is_atom, 1, Xs) ->
- Fun = fun (X) -> check_guard(X, fun (Y) -> t_is_atom(Y) end, t_atom()) end,
- strict(arg_types(erlang, is_atom, 1), Xs, Fun);
-type(erlang, is_binary, 1, Xs) ->
+type(erlang, is_atom, 1, Xs, Opaques) ->
+ Fun = fun (X) ->
+ check_guard(X, fun (Y) -> t_is_atom(Y, Opaques) end,
+ t_atom(), Opaques)
+ end,
+ strict(erlang, is_atom, 1, Xs, Fun, Opaques);
+type(erlang, is_binary, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_binary(Y) end, t_binary())
+ check_guard(X, fun (Y) -> t_is_binary(Y, Opaques) end,
+ t_binary(), Opaques)
end,
- strict(arg_types(erlang, is_binary, 1), Xs, Fun);
-type(erlang, is_bitstring, 1, Xs) ->
+ strict(erlang, is_binary, 1, Xs, Fun, Opaques);
+type(erlang, is_bitstring, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_bitstr(Y) end, t_bitstr())
+ check_guard(X, fun (Y) -> t_is_bitstr(Y, Opaques) end,
+ t_bitstr(), Opaques)
end,
- strict(arg_types(erlang, is_bitstring, 1), Xs, Fun);
-type(erlang, is_boolean, 1, Xs) ->
+ strict(erlang, is_bitstring, 1, Xs, Fun, Opaques);
+type(erlang, is_boolean, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_boolean(Y) end, t_boolean())
+ check_guard(X, fun (Y) -> t_is_boolean(Y, Opaques) end,
+ t_boolean(), Opaques)
end,
- strict(arg_types(erlang, is_boolean, 1), Xs, Fun);
-type(erlang, is_float, 1, Xs) ->
+ strict(erlang, is_boolean, 1, Xs, Fun, Opaques);
+type(erlang, is_float, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_float(Y) end, t_float())
+ check_guard(X, fun (Y) -> t_is_float(Y, Opaques) end,
+ t_float(), Opaques)
end,
- strict(arg_types(erlang, is_float, 1), Xs, Fun);
-type(erlang, is_function, 1, Xs) ->
- Fun = fun (X) -> check_guard(X, fun (Y) -> t_is_fun(Y) end, t_fun()) end,
- strict(arg_types(erlang, is_function, 1), Xs, Fun);
-type(erlang, is_function, 2, Xs) ->
+ strict(erlang, is_float, 1, Xs, Fun, Opaques);
+type(erlang, is_function, 1, Xs, Opaques) ->
+ Fun = fun (X) ->
+ check_guard(X, fun (Y) -> t_is_fun(Y, Opaques) end,
+ t_fun(), Opaques)
+ end,
+ strict(erlang, is_function, 1, Xs, Fun, Opaques);
+type(erlang, is_function, 2, Xs, Opaques) ->
Fun = fun ([FunType, ArityType]) ->
- case t_number_vals(ArityType) of
+ case t_number_vals(ArityType, Opaques) of
unknown -> t_boolean();
[Val] ->
FunConstr = t_fun(any_list(Val), t_any()),
Fun2 = fun (X) ->
t_is_subtype(X, FunConstr) andalso (not t_is_none(X))
end,
- check_guard_single(FunType, Fun2, FunConstr);
+ check_guard_single(FunType, Fun2, FunConstr, Opaques);
IntList when is_list(IntList) -> t_boolean() %% true?
end
end,
- strict(arg_types(erlang, is_function, 2), Xs, Fun);
-type(erlang, is_integer, 1, Xs) ->
+ strict(erlang, is_function, 2, Xs, Fun, Opaques);
+type(erlang, is_integer, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_integer(Y) end, t_integer())
+ check_guard(X, fun (Y) -> t_is_integer(Y, Opaques) end,
+ t_integer(), Opaques)
end,
- strict(arg_types(erlang, is_integer, 1), Xs, Fun);
-type(erlang, is_list, 1, Xs) ->
+ strict(erlang, is_integer, 1, Xs, Fun, Opaques);
+type(erlang, is_list, 1, Xs, Opaques) ->
Fun = fun (X) ->
- Fun2 = fun (Y) -> t_is_maybe_improper_list(Y) end,
- check_guard(X, Fun2, t_maybe_improper_list())
+ Fun2 = fun (Y) -> t_is_maybe_improper_list(Y, Opaques) end,
+ check_guard(X, Fun2, t_maybe_improper_list(), Opaques)
end,
- strict(arg_types(erlang, is_list, 1), Xs, Fun);
-type(erlang, is_number, 1, Xs) ->
+ strict(erlang, is_list, 1, Xs, Fun, Opaques);
+type(erlang, is_number, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_number(Y) end, t_number())
+ check_guard(X, fun (Y) -> t_is_number(Y, Opaques) end,
+ t_number(), Opaques)
end,
- strict(arg_types(erlang, is_number, 1), Xs, Fun);
-type(erlang, is_pid, 1, Xs) ->
- Fun = fun (X) -> check_guard(X, fun (Y) -> t_is_pid(Y) end, t_pid()) end,
- strict(arg_types(erlang, is_pid, 1), Xs, Fun);
-type(erlang, is_port, 1, Xs) ->
- Fun = fun (X) -> check_guard(X, fun (Y) -> t_is_port(Y) end, t_port()) end,
- strict(arg_types(erlang, is_port, 1), Xs, Fun);
-type(erlang, is_record, 2, Xs) ->
+ strict(erlang, is_number, 1, Xs, Fun, Opaques);
+type(erlang, is_pid, 1, Xs, Opaques) ->
+ Fun = fun (X) ->
+ check_guard(X, fun (Y) -> t_is_pid(Y, Opaques) end,
+ t_pid(), Opaques)
+ end,
+ strict(erlang, is_pid, 1, Xs, Fun, Opaques);
+type(erlang, is_port, 1, Xs, Opaques) ->
+ Fun = fun (X) ->
+ check_guard(X, fun (Y) -> t_is_port(Y, Opaques) end,
+ t_port(), Opaques)
+ end,
+ strict(erlang, is_port, 1, Xs, Fun, Opaques);
+type(erlang, is_record, 2, Xs, Opaques) ->
Fun = fun ([X, Y]) ->
- case t_is_tuple(X) of
+ case t_is_tuple(X, Opaques) of
false ->
- case t_is_none(t_inf(t_tuple(), X)) of
- true -> t_atom('false');
+ case t_is_none(t_inf(t_tuple(), X, Opaques)) of
+ true ->
+ case t_has_opaque_subtype(X, Opaques) of
+ true -> t_none();
+ false -> t_atom('false')
+ end;
false -> t_boolean()
end;
true ->
- case t_tuple_subtypes(X) of
+ case t_tuple_subtypes(X, Opaques) of
unknown -> t_boolean();
[Tuple] ->
- case t_tuple_args(Tuple) of
+ case t_tuple_args(Tuple, Opaques) of
%% any -> t_boolean();
- [Tag|_] ->
- case t_is_atom(Tag) of
- false ->
- TagAtom = t_inf(Tag, t_atom()),
- case t_is_none(TagAtom) of
- true -> t_atom('false');
- false -> t_boolean()
- end;
- true ->
- case t_atom_vals(Tag) of
- [RealTag] ->
- case t_atom_vals(Y) of
- [RealTag] -> t_atom('true');
- _ -> t_boolean()
- end;
- _ -> t_boolean()
- end
- end
+ [Tag|_] -> check_record_tag(Tag, Y, Opaques)
end;
List when length(List) >= 2 ->
t_sup([type(erlang, is_record, 2, [T, Y]) || T <- List])
end
end
end,
- strict(arg_types(erlang, is_record, 2), Xs, Fun);
-type(erlang, is_record, 3, Xs) ->
+ strict(erlang, is_record, 2, Xs, Fun, Opaques);
+type(erlang, is_record, 3, Xs, Opaques) ->
Fun = fun ([X, Y, Z]) ->
- Arity = t_number_vals(Z),
- case t_is_tuple(X) of
+ Arity = t_number_vals(Z, Opaques),
+ case t_is_tuple(X, Opaques) of
false when length(Arity) =:= 1 ->
[RealArity] = Arity,
- case t_is_none(t_inf(t_tuple(RealArity), X)) of
- true -> t_atom('false');
+ case t_is_none(t_inf(t_tuple(RealArity), X, Opaques)) of
+ true ->
+ case t_has_opaque_subtype(X, Opaques) of
+ true -> t_none();
+ false -> t_atom('false')
+ end;
false -> t_boolean()
end;
false ->
- case t_is_none(t_inf(t_tuple(), X)) of
- true -> t_atom('false');
+ case t_is_none(t_inf(t_tuple(), X, Opaques)) of
+ true ->
+ case t_has_opaque_subtype(X, Opaques) of
+ true -> t_none();
+ false -> t_atom('false')
+ end;
false -> t_boolean()
end;
true when length(Arity) =:= 1 ->
[RealArity] = Arity,
- case t_tuple_subtypes(X) of
+ case t_tuple_subtypes(X, Opaques) of
unknown -> t_boolean();
[Tuple] ->
- case t_tuple_args(Tuple) of
+ case t_tuple_args(Tuple, Opaques) of
%% any -> t_boolean();
Args when length(Args) =:= RealArity ->
- Tag = hd(Args),
- case t_is_atom(Tag) of
- false ->
- TagAtom = t_inf(Tag, t_atom()),
- case t_is_none(TagAtom) of
- true -> t_atom('false');
- false -> t_boolean()
- end;
- true ->
- case t_atom_vals(Tag) of
- [RealTag] ->
- case t_atom_vals(Y) of
- [RealTag] -> t_atom('true');
- _ -> t_boolean()
- end;
- _ -> t_boolean()
- end
- end;
+ check_record_tag(hd(Args), Y, Opaques);
Args when length(Args) =/= RealArity ->
t_atom('false')
end;
@@ -722,62 +740,66 @@ type(erlang, is_record, 3, Xs) ->
t_boolean()
end
end,
- strict(arg_types(erlang, is_record, 3), Xs, Fun);
-type(erlang, is_reference, 1, Xs) ->
+ strict(erlang, is_record, 3, Xs, Fun, Opaques);
+type(erlang, is_reference, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_reference(Y) end, t_reference())
+ check_guard(X, fun (Y) -> t_is_reference(Y, Opaques) end,
+ t_reference(), Opaques)
end,
- strict(arg_types(erlang, is_reference, 1), Xs, Fun);
-type(erlang, is_tuple, 1, Xs) ->
+ strict(erlang, is_reference, 1, Xs, Fun, Opaques);
+type(erlang, is_tuple, 1, Xs, Opaques) ->
Fun = fun (X) ->
- check_guard(X, fun (Y) -> t_is_tuple(Y) end, t_tuple())
+ check_guard(X, fun (Y) -> t_is_tuple(Y, Opaques) end,
+ t_tuple(), Opaques)
end,
- strict(arg_types(erlang, is_tuple, 1), Xs, Fun);
+ strict(erlang, is_tuple, 1, Xs, Fun, Opaques);
%% Guard bif, needs to be here.
-type(erlang, length, 1, Xs) ->
- strict(arg_types(erlang, length, 1), Xs, fun (_) -> t_non_neg_fixnum() end);
-type(erlang, make_tuple, 2, Xs) ->
- strict(arg_types(erlang, make_tuple, 2), Xs,
+type(erlang, length, 1, Xs, Opaques) ->
+ strict(erlang, length, 1, Xs, fun (_) -> t_non_neg_fixnum() end, Opaques);
+type(erlang, make_tuple, 2, Xs, Opaques) ->
+ strict(erlang, make_tuple, 2, Xs,
fun ([Int, _]) ->
- case t_number_vals(Int) of
+ case t_number_vals(Int, Opaques) of
[N] when is_integer(N), N >= 0 -> t_tuple(N);
_Other -> t_tuple()
end
- end);
-type(erlang, make_tuple, 3, Xs) ->
- strict(arg_types(erlang, make_tuple, 3), Xs,
+ end, Opaques);
+type(erlang, make_tuple, 3, Xs, Opaques) ->
+ strict(erlang, make_tuple, 3, Xs,
fun ([Int, _, _]) ->
- case t_number_vals(Int) of
+ case t_number_vals(Int, Opaques) of
[N] when is_integer(N), N >= 0 -> t_tuple(N);
_Other -> t_tuple()
end
- end);
-type(erlang, memory, 0, _) -> t_list(t_tuple([t_atom(), t_non_neg_fixnum()]));
-type(erlang, nif_error, 1, _) ->
- t_any(); % this BIF and the next one are stubs for NIFs and never return
-type(erlang, nif_error, 2, Xs) ->
- strict(arg_types(erlang, nif_error, 2), Xs, fun (_) -> t_any() end);
+ end, Opaques);
+type(erlang, memory, 0, _, _Opaques) ->
+ t_list(t_tuple([t_atom(), t_non_neg_fixnum()]));
+type(erlang, nif_error, 1, Xs, Opaques) ->
+ %% this BIF and the next one are stubs for NIFs and never return
+ strict(erlang, nif_error, 1, Xs, fun (_) -> t_any() end, Opaques);
+type(erlang, nif_error, 2, Xs, Opaques) ->
+ strict(erlang, nif_error, 2, Xs, fun (_) -> t_any() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, node, 0, _) -> t_node();
+type(erlang, node, 0, _, _Opaques) -> t_node();
%% Guard bif, needs to be here.
-type(erlang, node, 1, Xs) ->
- strict(arg_types(erlang, node, 1), Xs, fun (_) -> t_node() end);
+type(erlang, node, 1, Xs, Opaques) ->
+ strict(erlang, node, 1, Xs, fun (_) -> t_node() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, round, 1, Xs) ->
- strict(arg_types(erlang, round, 1), Xs, fun (_) -> t_integer() end);
+type(erlang, round, 1, Xs, Opaques) ->
+ strict(erlang, round, 1, Xs, fun (_) -> t_integer() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, self, 0, _) -> t_pid();
-type(erlang, set_cookie, 2, Xs) ->
- strict(arg_types(erlang, set_cookie, 2), Xs, fun (_) -> t_atom('true') end);
-type(erlang, setelement, 3, Xs) ->
- strict(arg_types(erlang, setelement, 3), Xs,
+type(erlang, self, 0, _, _Opaques) -> t_pid();
+type(erlang, set_cookie, 2, Xs, Opaques) ->
+ strict(erlang, set_cookie, 2, Xs, fun (_) -> t_atom('true') end, Opaques);
+type(erlang, setelement, 3, Xs, Opaques) ->
+ strict(erlang, setelement, 3, Xs,
fun ([X1, X2, X3]) ->
- case t_tuple_subtypes(X2) of
+ case t_tuple_subtypes(X2, Opaques) of
unknown -> t_tuple();
[_] ->
- Sz = t_tuple_size(X2),
- As = t_tuple_args(X2),
- case t_number_vals(X1) of
+ Sz = t_tuple_size(X2, Opaques),
+ As = t_tuple_args(X2, Opaques),
+ case t_number_vals(X1, Opaques) of
unknown ->
t_tuple([t_sup(X, X3) || X <- As]);
[N] when is_integer(N), 1 =< N, N =< Sz ->
@@ -799,29 +821,29 @@ type(erlang, setelement, 3, Xs) ->
Ts when is_list(Ts) ->
t_sup([type(erlang, setelement, 3, [X1, Y, X3]) || Y <- Ts])
end
- end);
+ end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, size, 1, Xs) ->
- strict(arg_types(erlang, size, 1), Xs, fun (_) -> t_non_neg_integer() end);
-type(erlang, spawn, 1, Xs) ->
- strict(arg_types(erlang, spawn, 1), Xs, fun (_) -> t_pid() end);
-type(erlang, spawn, 2, Xs) ->
- strict(arg_types(erlang, spawn, 2), Xs, fun (_) -> t_pid() end);
-type(erlang, spawn, 4, Xs) ->
- strict(arg_types(erlang, spawn, 4), Xs, fun (_) -> t_pid() end);
-type(erlang, spawn_link, 1, Xs) -> type(erlang, spawn, 1, Xs); % same
-type(erlang, spawn_link, 2, Xs) -> type(erlang, spawn, 2, Xs); % same
-type(erlang, spawn_link, 4, Xs) -> type(erlang, spawn, 4, Xs); % same
-type(erlang, subtract, 2, Xs) -> type(erlang, '--', 2, Xs); % alias
-type(erlang, suspend_process, 1, Xs) ->
- strict(arg_types(erlang, suspend_process, 1), Xs,
- fun (_) -> t_atom('true') end);
-type(erlang, system_info, 1, Xs) ->
- strict(arg_types(erlang, system_info, 1), Xs,
+type(erlang, size, 1, Xs, Opaques) ->
+ strict(erlang, size, 1, Xs, fun (_) -> t_non_neg_integer() end, Opaques);
+type(erlang, spawn, 1, Xs, Opaques) ->
+ strict(erlang, spawn, 1, Xs, fun (_) -> t_pid() end, Opaques);
+type(erlang, spawn, 2, Xs, Opaques) ->
+ strict(erlang, spawn, 2, Xs, fun (_) -> t_pid() end, Opaques);
+type(erlang, spawn, 4, Xs, Opaques) ->
+ strict(erlang, spawn, 4, Xs, fun (_) -> t_pid() end, Opaques);
+type(erlang, spawn_link, 1, Xs, _) -> type(erlang, spawn, 1, Xs); % same
+type(erlang, spawn_link, 2, Xs, _) -> type(erlang, spawn, 2, Xs); % same
+type(erlang, spawn_link, 4, Xs, _) -> type(erlang, spawn, 4, Xs); % same
+type(erlang, subtract, 2, Xs, _Opaques) -> type(erlang, '--', 2, Xs); % alias
+type(erlang, suspend_process, 1, Xs, Opaques) ->
+ strict(erlang, suspend_process, 1, Xs,
+ fun (_) -> t_atom('true') end, Opaques);
+type(erlang, system_info, 1, Xs, Opaques) ->
+ strict(erlang, system_info, 1, Xs,
fun ([Type]) ->
- case t_is_atom(Type) of
+ case t_is_atom(Type, Opaques) of
true ->
- case t_atom_vals(Type) of
+ case t_atom_vals(Type, Opaques) of
['allocated_areas'] ->
t_list(t_sup([t_tuple([t_atom(),t_non_neg_integer()]),
t_tuple([t_atom(),
@@ -936,26 +958,28 @@ type(erlang, system_info, 1, Xs) ->
false -> %% This currently handles only {allocator, Alloc}
t_any() %% overapproximation as the return value might change
end
- end);
+ end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, tl, 1, Xs) ->
- strict(arg_types(erlang, tl, 1), Xs, fun ([X]) -> t_cons_tl(X) end);
+type(erlang, tl, 1, Xs, Opaques) ->
+ strict(erlang, tl, 1, Xs, fun ([X]) -> t_cons_tl(X) end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, trunc, 1, Xs) ->
- strict(arg_types(erlang, trunc, 1), Xs, fun (_) -> t_integer() end);
+type(erlang, trunc, 1, Xs, Opaques) ->
+ strict(erlang, trunc, 1, Xs, fun (_) -> t_integer() end, Opaques);
%% Guard bif, needs to be here.
-type(erlang, tuple_size, 1, Xs) ->
- strict(arg_types(erlang, tuple_size, 1), Xs, fun (_) -> t_non_neg_integer() end);
-type(erlang, tuple_to_list, 1, Xs) ->
- strict(arg_types(erlang, tuple_to_list, 1), Xs,
+type(erlang, tuple_size, 1, Xs, Opaques) ->
+ strict(erlang, tuple_size, 1, Xs,
+ fun (_) -> t_non_neg_integer() end, Opaques);
+type(erlang, tuple_to_list, 1, Xs, Opaques) ->
+ strict(erlang, tuple_to_list, 1, Xs,
fun ([X]) ->
- case t_tuple_subtypes(X) of
+ case t_tuple_subtypes(X, Opaques) of
unknown -> t_list();
SubTypes ->
- Args = lists:flatten([t_tuple_args(ST) || ST <- SubTypes]),
+ Args = lists:append([t_tuple_args(ST, Opaques) ||
+ ST <- SubTypes]),
%% Can be nil if the tuple can be {}
case lists:any(fun (T) ->
- t_tuple_size(T) =:= 0
+ t_tuple_size(T, Opaques) =:= 0
end, SubTypes) of
true ->
%% Be careful here. If we had only {} we need to
@@ -965,279 +989,284 @@ type(erlang, tuple_to_list, 1, Xs) ->
t_nonempty_list(t_sup(Args))
end
end
- end);
-type(erlang, yield, 0, _) -> t_atom('true');
+ end, Opaques);
+type(erlang, yield, 0, _, _Opaques) -> t_atom('true');
%%-- ets ----------------------------------------------------------------------
-type(ets, rename, 2, Xs) ->
- strict(arg_types(ets, rename, 2), Xs, fun ([_, Name]) -> Name end);
+type(ets, rename, 2, Xs, Opaques) ->
+ strict(ets, rename, 2, Xs, fun ([_, Name]) -> Name end, Opaques);
%%-- hipe_bifs ----------------------------------------------------------------
-type(hipe_bifs, add_ref, 2, Xs) ->
- strict(arg_types(hipe_bifs, add_ref, 2), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, alloc_data, 2, Xs) ->
- strict(arg_types(hipe_bifs, alloc_data, 2), Xs,
- fun (_) -> t_integer() end); % address
-type(hipe_bifs, array, 2, Xs) ->
- strict(arg_types(hipe_bifs, array, 2), Xs, fun (_) -> t_immarray() end);
-type(hipe_bifs, array_length, 1, Xs) ->
- strict(arg_types(hipe_bifs, array_length, 1), Xs,
- fun (_) -> t_non_neg_fixnum() end);
-type(hipe_bifs, array_sub, 2, Xs) ->
- strict(arg_types(hipe_bifs, array_sub, 2), Xs, fun (_) -> t_immediate() end);
-type(hipe_bifs, array_update, 3, Xs) ->
- strict(arg_types(hipe_bifs, array_update, 3), Xs,
- fun (_) -> t_immarray() end);
-type(hipe_bifs, atom_to_word, 1, Xs) ->
- strict(arg_types(hipe_bifs, atom_to_word, 1), Xs,
- fun (_) -> t_integer() end);
-type(hipe_bifs, bif_address, 3, Xs) ->
- strict(arg_types(hipe_bifs, bif_address, 3), Xs,
- fun (_) -> t_sup(t_integer(), t_atom('false')) end);
-type(hipe_bifs, bitarray, 2, Xs) ->
- strict(arg_types(hipe_bifs, bitarray, 2), Xs, fun (_) -> t_bitarray() end);
-type(hipe_bifs, bitarray_sub, 2, Xs) ->
- strict(arg_types(hipe_bifs, bitarray_sub, 2), Xs, fun (_) -> t_boolean() end);
-type(hipe_bifs, bitarray_update, 3, Xs) ->
- strict(arg_types(hipe_bifs, bitarray_update, 3), Xs,
- fun (_) -> t_bitarray() end);
-type(hipe_bifs, bytearray, 2, Xs) ->
- strict(arg_types(hipe_bifs, bytearray, 2), Xs, fun (_) -> t_bytearray() end);
-type(hipe_bifs, bytearray_sub, 2, Xs) ->
- strict(arg_types(hipe_bifs, bytearray_sub, 2), Xs, fun (_) -> t_byte() end);
-type(hipe_bifs, bytearray_update, 3, Xs) ->
- strict(arg_types(hipe_bifs, bytearray_update, 3), Xs,
- fun (_) -> t_bytearray() end);
-type(hipe_bifs, call_count_clear, 1, Xs) ->
- strict(arg_types(hipe_bifs, call_count_clear, 1), Xs,
- fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end);
-type(hipe_bifs, call_count_get, 1, Xs) ->
- strict(arg_types(hipe_bifs, call_count_get, 1), Xs,
- fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end);
-type(hipe_bifs, call_count_off, 1, Xs) ->
- strict(arg_types(hipe_bifs, call_count_off, 1), Xs,
- fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end);
-type(hipe_bifs, call_count_on, 1, Xs) ->
- strict(arg_types(hipe_bifs, call_count_on, 1), Xs,
- fun (_) -> t_sup(t_atom('true'), t_nil()) end);
-type(hipe_bifs, check_crc, 1, Xs) ->
- strict(arg_types(hipe_bifs, check_crc, 1), Xs, fun (_) -> t_boolean() end);
-type(hipe_bifs, enter_code, 2, Xs) ->
- strict(arg_types(hipe_bifs, enter_code, 2), Xs,
+type(hipe_bifs, add_ref, 2, Xs, Opaques) ->
+ strict(hipe_bifs, add_ref, 2, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, alloc_data, 2, Xs, Opaques) ->
+ strict(hipe_bifs, alloc_data, 2, Xs,
+ fun (_) -> t_integer() end, Opaques); % address
+type(hipe_bifs, array, 2, Xs, Opaques) ->
+ strict(hipe_bifs, array, 2, Xs, fun (_) -> t_immarray() end, Opaques);
+type(hipe_bifs, array_length, 1, Xs, Opaques) ->
+ strict(hipe_bifs, array_length, 1, Xs,
+ fun (_) -> t_non_neg_fixnum() end, Opaques);
+type(hipe_bifs, array_sub, 2, Xs, Opaques) ->
+ strict(hipe_bifs, array_sub, 2, Xs, fun (_) -> t_immediate() end, Opaques);
+type(hipe_bifs, array_update, 3, Xs, Opaques) ->
+ strict(hipe_bifs, array_update, 3, Xs,
+ fun (_) -> t_immarray() end, Opaques);
+type(hipe_bifs, atom_to_word, 1, Xs, Opaques) ->
+ strict(hipe_bifs, atom_to_word, 1, Xs,
+ fun (_) -> t_integer() end, Opaques);
+type(hipe_bifs, bif_address, 3, Xs, Opaques) ->
+ strict(hipe_bifs, bif_address, 3, Xs,
+ fun (_) -> t_sup(t_integer(), t_atom('false')) end, Opaques);
+type(hipe_bifs, bitarray, 2, Xs, Opaques) ->
+ strict(hipe_bifs, bitarray, 2, Xs, fun (_) -> t_bitarray() end, Opaques);
+type(hipe_bifs, bitarray_sub, 2, Xs, Opaques) ->
+ strict(hipe_bifs, bitarray_sub, 2, Xs,
+ fun (_) -> t_boolean() end, Opaques);
+type(hipe_bifs, bitarray_update, 3, Xs, Opaques) ->
+ strict(hipe_bifs, bitarray_update, 3, Xs,
+ fun (_) -> t_bitarray() end, Opaques);
+type(hipe_bifs, bytearray, 2, Xs, Opaques) ->
+ strict(hipe_bifs, bytearray, 2, Xs, fun (_) -> t_bytearray() end, Opaques);
+type(hipe_bifs, bytearray_sub, 2, Xs, Opaques) ->
+ strict(hipe_bifs, bytearray_sub, 2, Xs, fun (_) -> t_byte() end, Opaques);
+type(hipe_bifs, bytearray_update, 3, Xs, Opaques) ->
+ strict(hipe_bifs, bytearray_update, 3, Xs,
+ fun (_) -> t_bytearray() end, Opaques);
+type(hipe_bifs, call_count_clear, 1, Xs, Opaques) ->
+ strict(hipe_bifs, call_count_clear, 1, Xs,
+ fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end, Opaques);
+type(hipe_bifs, call_count_get, 1, Xs, Opaques) ->
+ strict(hipe_bifs, call_count_get, 1, Xs,
+ fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end, Opaques);
+type(hipe_bifs, call_count_off, 1, Xs, Opaques) ->
+ strict(hipe_bifs, call_count_off, 1, Xs,
+ fun (_) -> t_sup(t_non_neg_integer(), t_atom('false')) end, Opaques);
+type(hipe_bifs, call_count_on, 1, Xs, Opaques) ->
+ strict(hipe_bifs, call_count_on, 1, Xs,
+ fun (_) -> t_sup(t_atom('true'), t_nil()) end, Opaques);
+type(hipe_bifs, check_crc, 1, Xs, Opaques) ->
+ strict(hipe_bifs, check_crc, 1, Xs, fun (_) -> t_boolean() end, Opaques);
+type(hipe_bifs, enter_code, 2, Xs, Opaques) ->
+ strict(hipe_bifs, enter_code, 2, Xs,
fun (_) -> t_tuple([t_integer(),
%% XXX: The tuple below contains integers and
%% is of size same as the length of the MFA list
- t_sup(t_nil(), t_binary())]) end);
-type(hipe_bifs, enter_sdesc, 1, Xs) ->
- strict(arg_types(hipe_bifs, enter_sdesc, 1), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, find_na_or_make_stub, 2, Xs) ->
- strict(arg_types(hipe_bifs, find_na_or_make_stub, 2), Xs,
- fun (_) -> t_integer() end); % address
-type(hipe_bifs, fun_to_address, 1, Xs) ->
- strict(arg_types(hipe_bifs, fun_to_address, 1), Xs,
- fun (_) -> t_integer() end);
-%% type(hipe_bifs, get_emu_address, 1, Xs) ->
-%% strict(arg_types(hipe_bifs, get_emu_address, 1), Xs,
-%% fun (_) -> t_integer() end); % address
-type(hipe_bifs, get_rts_param, 1, Xs) ->
- strict(arg_types(hipe_bifs, get_rts_param, 1), Xs,
- fun (_) -> t_sup(t_integer(), t_nil()) end);
-type(hipe_bifs, invalidate_funinfo_native_addresses, 1, Xs) ->
- strict(arg_types(hipe_bifs, invalidate_funinfo_native_addresses, 1), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, make_fe, 3, Xs) ->
- strict(arg_types(hipe_bifs, make_fe, 3), Xs, fun (_) -> t_integer() end);
-%% type(hipe_bifs, make_native_stub, 2, Xs) ->
-%% strict(arg_types(hipe_bifs, make_native_stub, 2), Xs,
-%% fun (_) -> t_integer() end); % address
-type(hipe_bifs, mark_referred_from, 1, Xs) ->
- strict(arg_types(hipe_bifs, mark_referred_from, 1), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, merge_term, 1, Xs) ->
- strict(arg_types(hipe_bifs, merge_term, 1), Xs, fun ([X]) -> X end);
-type(hipe_bifs, nstack_used_size, 0, _) ->
+ t_sup(t_nil(), t_binary())]) end, Opaques);
+type(hipe_bifs, enter_sdesc, 1, Xs, Opaques) ->
+ strict(hipe_bifs, enter_sdesc, 1, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, find_na_or_make_stub, 2, Xs, Opaques) ->
+ strict(hipe_bifs, find_na_or_make_stub, 2, Xs,
+ fun (_) -> t_integer() end, Opaques); % address
+type(hipe_bifs, fun_to_address, 1, Xs, Opaques) ->
+ strict(hipe_bifs, fun_to_address, 1, Xs,
+ fun (_) -> t_integer() end, Opaques);
+%% type(hipe_bifs, get_emu_address, 1, Xs, Opaques) ->
+%% strict(hipe_bifs, get_emu_address, 1, Xs,
+%% fun (_) -> t_integer() end, Opaques); % address
+type(hipe_bifs, get_rts_param, 1, Xs, Opaques) ->
+ strict(hipe_bifs, get_rts_param, 1, Xs,
+ fun (_) -> t_sup(t_integer(), t_nil()) end, Opaques);
+type(hipe_bifs, invalidate_funinfo_native_addresses, 1, Xs, Opaques) ->
+ strict(hipe_bifs, invalidate_funinfo_native_addresses, 1, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, make_fe, 3, Xs, Opaques) ->
+ strict(hipe_bifs, make_fe, 3, Xs, fun (_) -> t_integer() end, Opaques);
+%% type(hipe_bifs, make_native_stub, 2, Xs, Opaques) ->
+%% strict(hipe_bifs, make_native_stub, 2, Xs,
+%% fun (_) -> t_integer() end, Opaques); % address
+type(hipe_bifs, mark_referred_from, 1, Xs, Opaques) ->
+ strict(hipe_bifs, mark_referred_from, 1, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, merge_term, 1, Xs, Opaques) ->
+ strict(hipe_bifs, merge_term, 1, Xs, fun ([X]) -> X end, Opaques);
+type(hipe_bifs, nstack_used_size, 0, _, _Opaques) ->
t_non_neg_fixnum();
-type(hipe_bifs, patch_call, 3, Xs) ->
- strict(arg_types(hipe_bifs, patch_call, 3), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, patch_insn, 3, Xs) ->
- strict(arg_types(hipe_bifs, patch_insn, 3), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, primop_address, 1, Xs) ->
- strict(arg_types(hipe_bifs, primop_address, 1), Xs,
- fun (_) -> t_sup(t_integer(), t_atom('false')) end);
-type(hipe_bifs, redirect_referred_from, 1, Xs) ->
- strict(arg_types(hipe_bifs, redirect_referred_from, 1), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, ref, 1, Xs) ->
- strict(arg_types(hipe_bifs, ref, 1), Xs, fun (_) -> t_immarray() end);
-type(hipe_bifs, ref_get, 1, Xs) ->
- strict(arg_types(hipe_bifs, ref_get, 1), Xs, fun (_) -> t_immediate() end);
-type(hipe_bifs, ref_set, 2, Xs) ->
- strict(arg_types(hipe_bifs, ref_set, 2), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, remove_refs_from, 1, Xs) ->
- strict(arg_types(hipe_bifs, remove_refs_from, 1), Xs,
- fun (_) -> t_atom('ok') end);
-type(hipe_bifs, set_funinfo_native_address, 3, Xs) ->
- strict(arg_types(hipe_bifs, set_funinfo_native_address, 3), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, set_native_address, 3, Xs) ->
- strict(arg_types(hipe_bifs, set_native_address, 3), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, system_crc, 1, Xs) ->
- strict(arg_types(hipe_bifs, system_crc, 1), Xs, fun (_) -> t_crc32() end);
-type(hipe_bifs, term_to_word, 1, Xs) ->
- strict(arg_types(hipe_bifs, term_to_word, 1), Xs,
- fun (_) -> t_integer() end);
-type(hipe_bifs, update_code_size, 3, Xs) ->
- strict(arg_types(hipe_bifs, update_code_size, 3), Xs,
- fun (_) -> t_nil() end);
-type(hipe_bifs, write_u8, 2, Xs) ->
- strict(arg_types(hipe_bifs, write_u8, 2), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, write_u32, 2, Xs) ->
- strict(arg_types(hipe_bifs, write_u32, 2), Xs, fun (_) -> t_nil() end);
-type(hipe_bifs, write_u64, 2, Xs) ->
- strict(arg_types(hipe_bifs, write_u64, 2), Xs, fun (_) -> t_nil() end);
+type(hipe_bifs, patch_call, 3, Xs, Opaques) ->
+ strict(hipe_bifs, patch_call, 3, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, patch_insn, 3, Xs, Opaques) ->
+ strict(hipe_bifs, patch_insn, 3, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, primop_address, 1, Xs, Opaques) ->
+ strict(hipe_bifs, primop_address, 1, Xs,
+ fun (_) -> t_sup(t_integer(), t_atom('false')) end, Opaques);
+type(hipe_bifs, redirect_referred_from, 1, Xs, Opaques) ->
+ strict(hipe_bifs, redirect_referred_from, 1, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, ref, 1, Xs, Opaques) ->
+ strict(hipe_bifs, ref, 1, Xs, fun (_) -> t_immarray() end, Opaques);
+type(hipe_bifs, ref_get, 1, Xs, Opaques) ->
+ strict(hipe_bifs, ref_get, 1, Xs, fun (_) -> t_immediate() end, Opaques);
+type(hipe_bifs, ref_set, 2, Xs, Opaques) ->
+ strict(hipe_bifs, ref_set, 2, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, remove_refs_from, 1, Xs, Opaques) ->
+ strict(hipe_bifs, remove_refs_from, 1, Xs,
+ fun (_) -> t_atom('ok') end, Opaques);
+type(hipe_bifs, set_funinfo_native_address, 3, Xs, Opaques) ->
+ strict(hipe_bifs, set_funinfo_native_address, 3, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, set_native_address, 3, Xs, Opaques) ->
+ strict(hipe_bifs, set_native_address, 3, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, system_crc, 1, Xs, Opaques) ->
+ strict(hipe_bifs, system_crc, 1, Xs, fun (_) -> t_crc32() end, Opaques);
+type(hipe_bifs, term_to_word, 1, Xs, Opaques) ->
+ strict(hipe_bifs, term_to_word, 1, Xs,
+ fun (_) -> t_integer() end, Opaques);
+type(hipe_bifs, update_code_size, 3, Xs, Opaques) ->
+ strict(hipe_bifs, update_code_size, 3, Xs,
+ fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, write_u8, 2, Xs, Opaques) ->
+ strict(hipe_bifs, write_u8, 2, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, write_u32, 2, Xs, Opaques) ->
+ strict(hipe_bifs, write_u32, 2, Xs, fun (_) -> t_nil() end, Opaques);
+type(hipe_bifs, write_u64, 2, Xs, Opaques) ->
+ strict(hipe_bifs, write_u64, 2, Xs, fun (_) -> t_nil() end, Opaques);
%%-- lists --------------------------------------------------------------------
-type(lists, all, 2, Xs) ->
- strict(arg_types(lists, all, 2), Xs,
+type(lists, all, 2, Xs, Opaques) ->
+ strict(lists, all, 2, Xs,
fun ([F, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_atom('true');
false ->
- El = t_list_elements(L),
- case check_fun_application(F, [El]) of
+ El = t_list_elements(L, Opaques),
+ case check_fun_application(F, [El], Opaques) of
ok ->
- case t_is_cons(L) of
- true -> t_fun_range(F);
+ case t_is_cons(L, Opaques) of
+ true -> t_fun_range(F, Opaques);
false ->
%% The list can be empty.
- t_sup(t_atom('true'), t_fun_range(F))
+ t_sup(t_atom('true'), t_fun_range(F, Opaques))
end;
error ->
- case t_is_cons(L) of
+ case t_is_cons(L, Opaques) of
true -> t_none();
- false -> t_fun_range(F)
+ false -> t_fun_range(F, Opaques)
end
end
end
- end);
-type(lists, any, 2, Xs) ->
- strict(arg_types(lists, any, 2), Xs,
+ end, Opaques);
+type(lists, any, 2, Xs, Opaques) ->
+ strict(lists, any, 2, Xs,
fun ([F, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_atom('false');
false ->
- El = t_list_elements(L),
- case check_fun_application(F, [El]) of
+ El = t_list_elements(L, Opaques),
+ case check_fun_application(F, [El], Opaques) of
ok ->
- case t_is_cons(L) of
- true -> t_fun_range(F);
+ case t_is_cons(L, Opaques) of
+ true -> t_fun_range(F, Opaques);
false ->
%% The list can be empty
- t_sup(t_atom('false'), t_fun_range(F))
+ t_sup(t_atom('false'), t_fun_range(F, Opaques))
end;
error ->
- case t_is_cons(L) of
+ case t_is_cons(L, Opaques) of
true -> t_none();
- false -> t_fun_range(F)
+ false -> t_fun_range(F, Opaques)
end
end
end
- end);
-type(lists, append, 2, Xs) -> type(erlang, '++', 2, Xs); % alias
-type(lists, delete, 2, Xs) ->
- strict(arg_types(lists, delete, 2), Xs,
+ end, Opaques);
+type(lists, append, 2, Xs, _Opaques) -> type(erlang, '++', 2, Xs); % alias
+type(lists, delete, 2, Xs, Opaques) ->
+ strict(lists, delete, 2, Xs,
fun ([_, List]) ->
- case t_is_cons(List) of
+ case t_is_cons(List, Opaques) of
true -> t_cons_tl(List);
false -> List
end
- end);
-type(lists, dropwhile, 2, Xs) ->
- strict(arg_types(lists, dropwhile, 2), Xs,
+ end, Opaques);
+type(lists, dropwhile, 2, Xs, Opaques) ->
+ strict(lists, dropwhile, 2, Xs,
fun ([F, X]) ->
- case t_is_nil(X) of
+ case t_is_nil(X, Opaques) of
true -> t_nil();
false ->
- X1 = t_list_elements(X),
- case check_fun_application(F, [X1]) of
+ X1 = t_list_elements(X, Opaques),
+ case check_fun_application(F, [X1], Opaques) of
ok ->
- case t_atom_vals(t_fun_range(F)) of
+ case t_atom_vals(t_fun_range(F, Opaques), Opaques) of
['true'] ->
- case t_is_none(t_inf(t_list(), X)) of
+ case t_is_none(t_inf(t_list(), X, Opaques)) of
true -> t_none();
false -> t_nil()
end;
['false'] ->
- case t_is_none(t_inf(t_list(), X)) of
+ case t_is_none(t_inf(t_list(), X, Opaques)) of
true -> t_none();
false -> X
end;
_ ->
- t_inf(t_cons_tl(t_inf(X, t_cons())),
- t_maybe_improper_list())
+ t_inf(t_cons_tl(t_inf(X, t_cons(), Opaques)),
+ t_maybe_improper_list(), Opaques)
end;
error ->
- case t_is_cons(X) of
+ case t_is_cons(X, Opaques) of
true -> t_none();
false -> t_nil()
end
end
end
- end);
-type(lists, filter, 2, Xs) ->
- strict(arg_types(lists, filter, 2), Xs,
+ end, Opaques);
+type(lists, filter, 2, Xs, Opaques) ->
+ strict(lists, filter, 2, Xs,
fun ([F, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_nil();
false ->
- T = t_list_elements(L),
- case check_fun_application(F, [T]) of
+ T = t_list_elements(L, Opaques),
+ case check_fun_application(F, [T], Opaques) of
ok ->
- case t_atom_vals(t_fun_range(F)) =:= ['false'] of
+ RangeVals = t_atom_vals(t_fun_range(F, Opaques), Opaques),
+ case RangeVals =:= ['false'] of
true -> t_nil();
false ->
- case t_atom_vals(t_fun_range(F)) =:= ['true'] of
+ case RangeVals =:= ['true'] of
true -> L;
false -> t_list(T)
end
end;
error ->
- case t_is_cons(L) of
+ case t_is_cons(L, Opaques) of
true -> t_none();
false -> t_nil()
end
end
end
- end);
-type(lists, flatten, 1, Xs) ->
- strict(arg_types(lists, flatten, 1), Xs,
+ end, Opaques);
+type(lists, flatten, 1, Xs, Opaques) ->
+ strict(lists, flatten, 1, Xs,
fun ([L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> L; % (nil has undefined elements)
false ->
%% Avoiding infinite recursion is tricky
- X1 = t_list_elements(L),
+ X1 = t_list_elements(L, Opaques),
case t_is_any(X1) of
true ->
t_list();
false ->
- X2 = type(lists, flatten, 1, [t_inf(X1, t_list())]),
+ X2 = type(lists, flatten, 1, [t_inf(X1, t_list(), Opaques)]),
t_sup(t_list(t_subtract(X1, t_list())), X2)
end
end
- end);
-type(lists, flatmap, 2, Xs) ->
- strict(arg_types(lists, flatmap, 2), Xs,
+ end, Opaques);
+type(lists, flatmap, 2, Xs, Opaques) ->
+ strict(lists, flatmap, 2, Xs,
fun ([F, List]) ->
- case t_is_nil(List) of
+ case t_is_nil(List, Opaques) of
true -> t_nil();
false ->
- case check_fun_application(F, [t_list_elements(List)]) of
+ case
+ check_fun_application(F, [t_list_elements(List, Opaques)],
+ Opaques)
+ of
ok ->
- R = t_fun_range(F),
+ R = t_fun_range(F, Opaques),
case t_is_nil(R) of
true -> t_nil();
false ->
- Elems = t_list_elements(R),
- case t_is_cons(List) of
+ Elems = t_list_elements(R, Opaques),
+ case t_is_cons(List, Opaques) of
true ->
case t_is_subtype(t_nil(), R) of
true -> t_list(Elems);
@@ -1247,58 +1276,65 @@ type(lists, flatmap, 2, Xs) ->
end
end;
error ->
- case t_is_cons(List) of
+ case t_is_cons(List, Opaques) of
true -> t_none();
false -> t_nil()
end
end
end
- end);
-type(lists, foreach, 2, Xs) ->
- strict(arg_types(lists, foreach, 2), Xs,
+ end, Opaques);
+type(lists, foreach, 2, Xs, Opaques) ->
+ strict(lists, foreach, 2, Xs,
fun ([F, List]) ->
- case t_is_cons(List) of
+ case t_is_cons(List, Opaques) of
true ->
- case check_fun_application(F, [t_list_elements(List)]) of
+ case
+ check_fun_application(F, [t_list_elements(List, Opaques)],
+ Opaques)
+ of
ok -> t_atom('ok');
error -> t_none()
end;
false ->
t_atom('ok')
end
- end);
-type(lists, foldl, 3, Xs) ->
- strict(arg_types(lists, foldl, 3), Xs,
+ end, Opaques);
+type(lists, foldl, 3, Xs, Opaques) ->
+ strict(lists, foldl, 3, Xs,
fun ([F, Acc, List]) ->
- case t_is_nil(List) of
+ case t_is_nil(List, Opaques) of
true -> Acc;
false ->
- case check_fun_application(F, [t_list_elements(List), Acc]) of
+ case
+ check_fun_application(F,
+ [t_list_elements(List, Opaques),Acc],
+ Opaques)
+ of
ok ->
- case t_is_cons(List) of
- true -> t_fun_range(F);
- false -> t_sup(t_fun_range(F), Acc)
+ case t_is_cons(List, Opaques) of
+ true -> t_fun_range(F, Opaques);
+ false -> t_sup(t_fun_range(F, Opaques), Acc)
end;
error ->
- case t_is_cons(List) of
+ case t_is_cons(List, Opaques) of
true -> t_none();
false -> Acc
end
end
end
- end);
-type(lists, foldr, 3, Xs) -> type(lists, foldl, 3, Xs); % same
-type(lists, keydelete, 3, Xs) ->
- strict(arg_types(lists, keydelete, 3), Xs,
+ end, Opaques);
+type(lists, foldr, 3, Xs, _Opaques) -> type(lists, foldl, 3, Xs); % same
+type(lists, keydelete, 3, Xs, Opaques) ->
+ strict(lists, keydelete, 3, Xs,
fun ([_, _, L]) ->
Term = t_list_termination(L),
t_sup(Term, erl_types:lift_list_to_pos_empty(L))
- end);
-type(lists, keyfind, 3, Xs) ->
- strict(arg_types(lists, keyfind, 3), Xs,
+ end, Opaques);
+type(lists, keyfind, 3, Xs, Opaques) ->
+ strict(lists, keyfind, 3, Xs,
fun ([X, Y, Z]) ->
- ListEs = t_list_elements(Z),
- Tuple = t_inf(t_tuple(), ListEs),
+ ListEs = t_list_elements(Z, Opaques),
+ Tuple = t_inf(t_tuple(), ListEs, Opaques),
case t_is_none(Tuple) of
true -> t_atom('false');
false ->
@@ -1308,58 +1344,61 @@ type(lists, keyfind, 3, Xs) ->
case t_is_any(X) of
true -> Ret;
false ->
- case t_tuple_subtypes(Tuple) of
+ case t_tuple_subtypes(Tuple, Opaques) of
unknown -> Ret;
List ->
- case key_comparisons_fail(X, Y, List) of
+ case key_comparisons_fail(X, Y, List, Opaques) of
true -> t_atom('false');
false -> Ret
end
end
end
end
- end);
-type(lists, keymap, 3, Xs) ->
- strict(arg_types(lists, keymap, 3), Xs,
+ end, Opaques);
+type(lists, keymap, 3, Xs, Opaques) ->
+ strict(lists, keymap, 3, Xs,
fun ([F, _I, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> L;
- false -> t_list(t_sup(t_fun_range(F), t_list_elements(L)))
+ false -> t_list(t_sup(t_fun_range(F, Opaques),
+ t_list_elements(L, Opaques)))
end
- end);
-type(lists, keymember, 3, Xs) ->
- strict(arg_types(lists, keymember, 3), Xs,
+ end, Opaques);
+type(lists, keymember, 3, Xs, Opaques) ->
+ strict(lists, keymember, 3, Xs,
fun ([X, Y, Z]) ->
- ListEs = t_list_elements(Z),
- Tuple = t_inf(t_tuple(), ListEs),
+ ListEs = t_list_elements(Z, Opaques),
+ Tuple = t_inf(t_tuple(), ListEs, Opaques),
case t_is_none(Tuple) of
true -> t_atom('false');
false ->
case t_is_any(X) of
true -> t_boolean();
false ->
- case t_tuple_subtypes(Tuple) of
+ case t_tuple_subtypes(Tuple, Opaques) of
unknown -> t_boolean();
List ->
- case key_comparisons_fail(X, Y, List) of
+ case key_comparisons_fail(X, Y, List, Opaques) of
true -> t_atom('false');
false -> t_boolean()
end
end
end
end
- end);
-type(lists, keymerge, 3, Xs) ->
- strict(arg_types(lists, keymerge, 3), Xs,
- fun ([_I, L1, L2]) -> type(lists, merge, 2, [L1, L2]) end);
-type(lists, keyreplace, 4, Xs) ->
- strict(arg_types(lists, keyreplace, 4), Xs,
- fun ([_K, _I, L, T]) -> t_list(t_sup(t_list_elements(L), T)) end);
-type(lists, keysearch, 3, Xs) ->
- strict(arg_types(lists, keysearch, 3), Xs,
+ end, Opaques);
+type(lists, keymerge, 3, Xs, Opaques) ->
+ strict(lists, keymerge, 3, Xs,
+ fun ([_I, L1, L2]) -> type(lists, merge, 2, [L1, L2]) end, Opaques);
+type(lists, keyreplace, 4, Xs, Opaques) ->
+ strict(lists, keyreplace, 4, Xs,
+ fun ([_K, _I, L, T]) ->
+ t_list(t_sup(t_list_elements(L, Opaques), T))
+ end, Opaques);
+type(lists, keysearch, 3, Xs, Opaques) ->
+ strict(lists, keysearch, 3, Xs,
fun ([X, Y, Z]) ->
- ListEs = t_list_elements(Z),
- Tuple = t_inf(t_tuple(), ListEs),
+ ListEs = t_list_elements(Z, Opaques),
+ Tuple = t_inf(t_tuple(), ListEs, Opaques),
case t_is_none(Tuple) of
true -> t_atom('false');
false ->
@@ -1368,91 +1407,93 @@ type(lists, keysearch, 3, Xs) ->
case t_is_any(X) of
true -> Ret;
false ->
- case t_tuple_subtypes(Tuple) of
+ case t_tuple_subtypes(Tuple, Opaques) of
unknown -> Ret;
List ->
- case key_comparisons_fail(X, Y, List) of
+ case key_comparisons_fail(X, Y, List, Opaques) of
true -> t_atom('false');
false -> Ret
end
end
end
end
- end);
-type(lists, keysort, 2, Xs) ->
- strict(arg_types(lists, keysort, 2), Xs, fun ([_, L]) -> L end);
-type(lists, last, 1, Xs) ->
- strict(arg_types(lists, last, 1), Xs, fun ([L]) -> t_list_elements(L) end);
-type(lists, map, 2, Xs) ->
- strict(arg_types(lists, map, 2), Xs,
+ end, Opaques);
+type(lists, keysort, 2, Xs, Opaques) ->
+ strict(lists, keysort, 2, Xs, fun ([_, L]) -> L end, Opaques);
+type(lists, last, 1, Xs, Opaques) ->
+ strict(lists, last, 1, Xs,
+ fun ([L]) -> t_list_elements(L, Opaques) end, Opaques);
+type(lists, map, 2, Xs, Opaques) ->
+ strict(lists, map, 2, Xs,
fun ([F, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> L;
false ->
- El = t_list_elements(L),
- case t_is_cons(L) of
+ El = t_list_elements(L, Opaques),
+ case t_is_cons(L, Opaques) of
true ->
- case check_fun_application(F, [El]) of
- ok -> t_nonempty_list(t_fun_range(F));
+ case check_fun_application(F, [El], Opaques) of
+ ok -> t_nonempty_list(t_fun_range(F, Opaques));
error -> t_none()
end;
false ->
- case check_fun_application(F, [El]) of
- ok -> t_list(t_fun_range(F));
+ case check_fun_application(F, [El], Opaques) of
+ ok -> t_list(t_fun_range(F, Opaques));
error -> t_nil()
end
end
end
- end);
-type(lists, mapfoldl, 3, Xs) ->
- strict(arg_types(lists, mapfoldl, 3), Xs,
+ end, Opaques);
+type(lists, mapfoldl, 3, Xs, Opaques) ->
+ strict(lists, mapfoldl, 3, Xs,
fun ([F, Acc, List]) ->
- case t_is_nil(List) of
+ case t_is_nil(List, Opaques) of
true -> t_tuple([List, Acc]);
false ->
- El = t_list_elements(List),
- R = t_fun_range(F),
- case t_is_cons(List) of
+ El = t_list_elements(List, Opaques),
+ R = t_fun_range(F, Opaques),
+ case t_is_cons(List, Opaques) of
true ->
- case check_fun_application(F, [El, Acc]) of
+ case check_fun_application(F, [El, Acc], Opaques) of
ok ->
Fun = fun (RangeTuple) ->
- [T1, T2] = t_tuple_args(RangeTuple),
+ [T1, T2] = t_tuple_args(RangeTuple, Opaques),
t_tuple([t_nonempty_list(T1), T2])
end,
- t_sup([Fun(ST) || ST <- t_tuple_subtypes(R)]);
+ t_sup([Fun(ST) || ST <- t_tuple_subtypes(R, Opaques)]);
error ->
t_none()
end;
false ->
- case check_fun_application(F, [El, Acc]) of
+ case check_fun_application(F, [El, Acc], Opaques) of
ok ->
Fun = fun (RangeTuple) ->
- [T1, T2] = t_tuple_args(RangeTuple),
+ [T1, T2] = t_tuple_args(RangeTuple, Opaques),
t_tuple([t_list(T1), t_sup(Acc, T2)])
end,
- t_sup([Fun(ST) || ST <- t_tuple_subtypes(R)]);
+ t_sup([Fun(ST) || ST <- t_tuple_subtypes(R, Opaques)]);
error ->
t_tuple([t_nil(), Acc])
end
end
end
- end);
-type(lists, mapfoldr, 3, Xs) -> type(lists, mapfoldl, 3, Xs); % same
-type(lists, max, 1, Xs) ->
- strict(arg_types(lists, max, 1), Xs, fun ([L]) -> t_list_elements(L) end);
-type(lists, member, 2, Xs) ->
- strict(arg_types(lists, member, 2), Xs,
+ end, Opaques);
+type(lists, mapfoldr, 3, Xs, _Opaques) -> type(lists, mapfoldl, 3, Xs); % same
+type(lists, max, 1, Xs, Opaques) ->
+ strict(lists, max, 1, Xs,
+ fun ([L]) -> t_list_elements(L, Opaques) end, Opaques);
+type(lists, member, 2, Xs, Opaques) ->
+ strict(lists, member, 2, Xs,
fun ([X, Y]) ->
- Y1 = t_list_elements(Y),
- case t_is_none(t_inf(Y1, X)) of
+ Y1 = t_list_elements(Y, Opaques),
+ case t_is_none(t_inf(Y1, X, Opaques)) of
true -> t_atom('false');
false -> t_boolean()
end
- end);
-%% type(lists, merge, 1, Xs) ->
-type(lists, merge, 2, Xs) ->
- strict(arg_types(lists, merge, 2), Xs,
+ end, Opaques);
+%% type(lists, merge, 1, Xs, Opaques) ->
+type(lists, merge, 2, Xs, Opaques) ->
+ strict(lists, merge, 2, Xs,
fun ([L1, L2]) ->
case t_is_none(L1) of
true -> L2;
@@ -1462,30 +1503,31 @@ type(lists, merge, 2, Xs) ->
false -> t_sup(L1, L2)
end
end
- end);
-type(lists, min, 1, Xs) ->
- strict(arg_types(lists, min, 1), Xs, fun ([L]) -> t_list_elements(L) end);
-type(lists, nth, 2, Xs) ->
- strict(arg_types(lists, nth, 2), Xs,
- fun ([_, Y]) -> t_list_elements(Y) end);
-type(lists, nthtail, 2, Xs) ->
- strict(arg_types(lists, nthtail, 2), Xs,
- fun ([_, Y]) -> t_sup(Y, t_list()) end);
-type(lists, partition, 2, Xs) ->
- strict(arg_types(lists, partition, 2), Xs,
+ end, Opaques);
+type(lists, min, 1, Xs, Opaques) ->
+ strict(lists, min, 1, Xs,
+ fun ([L]) -> t_list_elements(L, Opaques) end, Opaques);
+type(lists, nth, 2, Xs, Opaques) ->
+ strict(lists, nth, 2, Xs,
+ fun ([_, Y]) -> t_list_elements(Y, Opaques) end, Opaques);
+type(lists, nthtail, 2, Xs, Opaques) ->
+ strict(lists, nthtail, 2, Xs,
+ fun ([_, Y]) -> t_sup(Y, t_list()) end, Opaques);
+type(lists, partition, 2, Xs, Opaques) ->
+ strict(lists, partition, 2, Xs,
fun ([F, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_tuple([L,L]);
false ->
- El = t_list_elements(L),
- case check_fun_application(F, [El]) of
+ El = t_list_elements(L, Opaques),
+ case check_fun_application(F, [El], Opaques) of
error ->
- case t_is_cons(L) of
+ case t_is_cons(L, Opaques) of
true -> t_none();
false -> t_tuple([t_nil(), t_nil()])
end;
ok ->
- case t_atom_vals(t_fun_range(F)) of
+ case t_atom_vals(t_fun_range(F, Opaques), Opaques) of
['true'] -> t_tuple([L, t_nil()]);
['false'] -> t_tuple([t_nil(), L]);
[_, _] ->
@@ -1494,123 +1536,131 @@ type(lists, partition, 2, Xs) ->
end
end
end
- end);
-type(lists, reverse, 1, Xs) ->
- strict(arg_types(lists, reverse, 1), Xs, fun ([X]) -> X end);
-type(lists, reverse, 2, Xs) ->
+ end, Opaques);
+type(lists, reverse, 1, Xs, Opaques) ->
+ strict(lists, reverse, 1, Xs, fun ([X]) -> X end, Opaques);
+type(lists, reverse, 2, Xs, _Opaques) ->
type(erlang, '++', 2, Xs); % reverse-onto is just like append
-type(lists, sort, 1, Xs) ->
- strict(arg_types(lists, sort, 1), Xs, fun ([X]) -> X end);
-type(lists, sort, 2, Xs) ->
- strict(arg_types(lists, sort, 2), Xs,
+type(lists, sort, 1, Xs, Opaques) ->
+ strict(lists, sort, 1, Xs, fun ([X]) -> X end, Opaques);
+type(lists, sort, 2, Xs, Opaques) ->
+ strict(lists, sort, 2, Xs,
fun ([F, L]) ->
- R = t_fun_range(F),
- case t_is_boolean(R) of
+ R = t_fun_range(F, Opaques),
+ case t_is_boolean(R, Opaques) of
true -> L;
false ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_nil();
false -> t_none()
end
end
- end);
-type(lists, split, 2, Xs) ->
- strict(arg_types(lists, split, 2), Xs,
+ end, Opaques);
+type(lists, split, 2, Xs, Opaques) ->
+ strict(lists, split, 2, Xs,
fun ([_, L]) ->
- case t_is_nil(L) of
+ case t_is_nil(L, Opaques) of
true -> t_tuple([L, L]);
false ->
- T = t_list_elements(L),
+ T = t_list_elements(L, Opaques),
t_tuple([t_list(T), t_list(T)])
end
- end);
-type(lists, splitwith, 2, Xs) ->
+ end, Opaques);
+type(lists, splitwith, 2, Xs, _Opaques) ->
T1 = type(lists, takewhile, 2, Xs),
T2 = type(lists, dropwhile, 2, Xs),
case t_is_none(T1) orelse t_is_none(T2) of
true -> t_none();
false -> t_tuple([T1, T2])
end;
-type(lists, subtract, 2, Xs) -> type(erlang, '--', 2, Xs); % alias
-type(lists, takewhile, 2, Xs) ->
- strict(arg_types(lists, takewhile, 2), Xs,
+type(lists, subtract, 2, Xs, _Opaques) -> type(erlang, '--', 2, Xs); % alias
+type(lists, takewhile, 2, Xs, Opaques) ->
+ strict(lists, takewhile, 2, Xs,
fun([F, L]) ->
- case t_is_none(t_inf(t_list(), L)) of
+ case t_is_none(t_inf(t_list(), L, Opaques)) of
false -> type(lists, filter, 2, Xs);
true ->
%% This works for non-proper lists as well.
- El = t_list_elements(L),
+ El = t_list_elements(L, Opaques),
type(lists, filter, 2, [F, t_list(El)])
end
- end);
-type(lists, usort, 1, Xs) -> type(lists, sort, 1, Xs); % same
-type(lists, usort, 2, Xs) -> type(lists, sort, 2, Xs); % same
-type(lists, unzip, 1, Xs) ->
- strict(arg_types(lists, unzip, 1), Xs,
+ end, Opaques);
+type(lists, usort, 1, Xs, _Opaques) -> type(lists, sort, 1, Xs); % same
+type(lists, usort, 2, Xs, _Opaques) -> type(lists, sort, 2, Xs); % same
+type(lists, unzip, 1, Xs, Opaques) ->
+ strict(lists, unzip, 1, Xs,
fun ([Ps]) ->
- case t_is_nil(Ps) of
+ case t_is_nil(Ps, Opaques) of
true ->
t_tuple([t_nil(), t_nil()]);
false -> % Ps is a proper list of pairs
- TupleTypes = t_tuple_subtypes(t_list_elements(Ps)),
+ TupleTypes = t_tuple_subtypes(t_list_elements(Ps, Opaques),
+ Opaques),
lists:foldl(fun(Tuple, Acc) ->
- [A, B] = t_tuple_args(Tuple),
+ [A, B] = t_tuple_args(Tuple, Opaques),
t_sup(t_tuple([t_list(A), t_list(B)]), Acc)
end, t_none(), TupleTypes)
end
- end);
-type(lists, unzip3, 1, Xs) ->
- strict(arg_types(lists, unzip3, 1), Xs,
+ end, Opaques);
+type(lists, unzip3, 1, Xs, Opaques) ->
+ strict(lists, unzip3, 1, Xs,
fun ([Ts]) ->
- case t_is_nil(Ts) of
+ case t_is_nil(Ts, Opaques) of
true ->
t_tuple([t_nil(), t_nil(), t_nil()]);
false -> % Ps is a proper list of triples
- TupleTypes = t_tuple_subtypes(t_list_elements(Ts)),
+ TupleTypes = t_tuple_subtypes(t_list_elements(Ts, Opaques),
+ Opaques),
lists:foldl(fun(T, Acc) ->
- [A, B, C] = t_tuple_args(T),
+ [A, B, C] = t_tuple_args(T, Opaques),
t_sup(t_tuple([t_list(A),
t_list(B),
t_list(C)]),
Acc)
end, t_none(), TupleTypes)
end
- end);
-type(lists, zip, 2, Xs) ->
- strict(arg_types(lists, zip, 2), Xs,
+ end, Opaques);
+type(lists, zip, 2, Xs, Opaques) ->
+ strict(lists, zip, 2, Xs,
fun ([As, Bs]) ->
- case (t_is_nil(As) orelse t_is_nil(Bs)) of
+ case (t_is_nil(As, Opaques) orelse t_is_nil(Bs, Opaques)) of
true -> t_nil();
false ->
- A = t_list_elements(As),
- B = t_list_elements(Bs),
+ A = t_list_elements(As, Opaques),
+ B = t_list_elements(Bs, Opaques),
t_list(t_tuple([A, B]))
end
- end);
-type(lists, zip3, 3, Xs) ->
- strict(arg_types(lists, zip3, 3), Xs,
+ end, Opaques);
+type(lists, zip3, 3, Xs, Opaques) ->
+ strict(lists, zip3, 3, Xs,
fun ([As, Bs, Cs]) ->
- case (t_is_nil(As) orelse t_is_nil(Bs) orelse t_is_nil(Cs)) of
+ case
+ (t_is_nil(As, Opaques)
+ orelse t_is_nil(Bs, Opaques)
+ orelse t_is_nil(Cs, Opaques))
+ of
true -> t_nil();
false ->
- A = t_list_elements(As),
- B = t_list_elements(Bs),
- C = t_list_elements(Cs),
+ A = t_list_elements(As, Opaques),
+ B = t_list_elements(Bs, Opaques),
+ C = t_list_elements(Cs, Opaques),
t_list(t_tuple([A, B, C]))
end
- end);
-type(lists, zipwith, 3, Xs) ->
- strict(arg_types(lists, zipwith, 3), Xs,
- fun ([F, _As, _Bs]) -> t_sup(t_list(t_fun_range(F)), t_nil()) end);
-type(lists, zipwith3, 4, Xs) ->
- strict(arg_types(lists, zipwith3, 4), Xs,
- fun ([F,_As,_Bs,_Cs]) -> t_sup(t_list(t_fun_range(F)), t_nil()) end);
+ end, Opaques);
+type(lists, zipwith, 3, Xs, Opaques) ->
+ strict(lists, zipwith, 3, Xs,
+ fun ([F, _As, _Bs]) -> t_sup(t_list(t_fun_range(F, Opaques)),
+ t_nil()) end, Opaques);
+type(lists, zipwith3, 4, Xs, Opaques) ->
+ strict(lists, zipwith3, 4, Xs,
+ fun ([F,_As,_Bs,_Cs]) -> t_sup(t_list(t_fun_range(F, Opaques)),
+ t_nil()) end, Opaques);
%%-- string -------------------------------------------------------------------
-type(string, chars, 2, Xs) -> % NOTE: added to avoid loss of information
- strict(arg_types(string, chars, 2), Xs, fun (_) -> t_string() end);
-type(string, chars, 3, Xs) -> % NOTE: added to avoid loss of information
- strict(arg_types(string, chars, 3), Xs,
+type(string, chars, 2, Xs, Opaques) -> % NOTE: added to avoid loss of info
+ strict(string, chars, 2, Xs, fun (_) -> t_string() end, Opaques);
+type(string, chars, 3, Xs, Opaques) -> % NOTE: added to avoid loss of info
+ strict(string, chars, 3, Xs,
fun ([Char, N, Tail]) ->
case t_is_nil(Tail) of
true ->
@@ -1623,10 +1673,10 @@ type(string, chars, 3, Xs) -> % NOTE: added to avoid loss of information
t_sup(t_sup(t_string(), Tail), t_cons(Char, Tail))
end
end
- end);
+ end, Opaques);
%%-----------------------------------------------------------------------------
-type(M, F, A, Xs) when is_atom(M), is_atom(F),
+type(M, F, A, Xs, _O) when is_atom(M), is_atom(F),
is_integer(A), 0 =< A, A =< 255 ->
strict(Xs, t_any()). % safe approximation for all functions.
@@ -1635,13 +1685,20 @@ type(M, F, A, Xs) when is_atom(M), is_atom(F),
%% Auxiliary functions
%%-----------------------------------------------------------------------------
-strict(Xs, Ts, F) ->
- %% io:format("inf lists arg~n1:~p~n2:~p ~n", [Xs, Ts]),
- Xs1 = inf_lists(Xs, Ts),
+strict(M, F, A, Xs, Fun, Opaques) ->
+ Ts = arg_types(M, F, A),
+ %% io:format("inf lists arg~nXs: ~p~nTs: ~p ~n", [Xs, Ts]),
+ Xs1 = inf_lists(Xs, Ts, Opaques),
%% io:format("inf lists return ~p ~n", [Xs1]),
case any_is_none_or_unit(Xs1) of
true -> t_none();
- false -> F(Xs1)
+ false -> Fun(Xs1)
+ end.
+
+strict2(Xs, X) ->
+ case any_is_none_or_unit(Xs) of
+ true -> t_none();
+ false -> X
end.
strict(Xs, X) ->
@@ -1650,9 +1707,9 @@ strict(Xs, X) ->
false -> X
end.
-inf_lists([X | Xs], [T | Ts]) ->
- [t_inf(X, T) | inf_lists(Xs, Ts)];
-inf_lists([], []) ->
+inf_lists([X | Xs], [T | Ts], Opaques) ->
+ [t_inf(X, T, Opaques) | inf_lists(Xs, Ts, Opaques)];
+inf_lists([], [], _Opaques) ->
[].
any_list(N) -> any_list(N, t_any()).
@@ -1670,20 +1727,43 @@ list_replace(1, E, [_X | Xs]) ->
any_is_none_or_unit(Ts) ->
lists:any(fun erl_types:t_is_none_or_unit/1, Ts).
-check_guard([X], Test, Type) ->
- check_guard_single(X, Test, Type).
+check_guard([X], Test, Type, Opaques) ->
+ check_guard_single(X, Test, Type, Opaques).
-check_guard_single(X, Test, Type) ->
+check_guard_single(X, Test, Type, Opaques) ->
case Test(X) of
true -> t_atom('true');
false ->
- case erl_types:t_is_opaque(X) of
- true -> t_none();
- false ->
- case t_is_none(t_inf(Type, X)) of
- true -> t_atom('false');
- false -> t_boolean()
- end
+ case t_is_none(t_inf(Type, X, Opaques)) of
+ true ->
+ case t_has_opaque_subtype(X, Opaques) of
+ true -> t_none();
+ false -> t_atom('false')
+ end;
+ false -> t_boolean()
+ end
+ end.
+
+check_record_tag(Tag, Y, Opaques) ->
+ case t_is_atom(Tag, Opaques) of
+ false ->
+ TagAtom = t_inf(Tag, t_atom(), Opaques),
+ case t_is_none(TagAtom) of
+ true ->
+ case t_has_opaque_subtype(Tag, Opaques) of
+ true -> t_none();
+ false -> t_atom('false')
+ end;
+ false -> t_boolean()
+ end;
+ true ->
+ case t_atom_vals(Tag, Opaques) of
+ [RealTag] ->
+ case t_atom_vals(Y, Opaques) of
+ [RealTag] -> t_atom('true');
+ _ -> t_boolean()
+ end;
+ _ -> t_boolean()
end
end.
@@ -1828,12 +1908,12 @@ negwidth(X, N) ->
false -> negwidth(X, N+1)
end.
-arith('bnot', X1) ->
- case t_is_integer(X1) of
+arith('bnot', X1, Opaques) ->
+ case t_is_integer(X1, Opaques) of
false -> error;
true ->
- Min1 = number_min(X1),
- Max1 = number_max(X1),
+ Min1 = number_min(X1, Opaques),
+ Max1 = number_max(X1, Opaques),
{ok, t_from_range(infinity_add(infinity_inv(Max1), -1),
infinity_add(infinity_inv(Min1), -1))}
end.
@@ -1907,13 +1987,13 @@ arith_bor_range_set({Min, Max}, [Int|IntList]) ->
IntList),
{infinity_bor(Min, SafeAnd), infinity_bor(Max, SafeAnd)}.
-arith_band(X1, X2) ->
- L1 = t_number_vals(X1),
- L2 = t_number_vals(X2),
- Min1 = number_min(X1),
- Max1 = number_max(X1),
- Min2 = number_min(X2),
- Max2 = number_max(X2),
+arith_band(X1, X2, Opaques) ->
+ L1 = t_number_vals(X1, Opaques),
+ L2 = t_number_vals(X2, Opaques),
+ Min1 = number_min(X1, Opaques),
+ Max1 = number_max(X1, Opaques),
+ Min2 = number_min(X2, Opaques),
+ Max2 = number_max(X2, Opaques),
case {L1 =:= unknown, L2 =:= unknown} of
{true, false} ->
arith_band_range_set(arith_band_ranges(Min1, Max1, Min2, Max2), L2);
@@ -1923,13 +2003,13 @@ arith_band(X1, X2) ->
arith_band_ranges(Min1, Max1, Min2, Max2)
end.
-arith_bor(X1, X2) ->
- L1 = t_number_vals(X1),
- L2 = t_number_vals(X2),
- Min1 = number_min(X1),
- Max1 = number_max(X1),
- Min2 = number_min(X2),
- Max2 = number_max(X2),
+arith_bor(X1, X2, Opaques) ->
+ L1 = t_number_vals(X1, Opaques),
+ L2 = t_number_vals(X2, Opaques),
+ Min1 = number_min(X1, Opaques),
+ Max1 = number_max(X1, Opaques),
+ Min2 = number_min(X2, Opaques),
+ Max2 = number_max(X2, Opaques),
case {L1 =:= unknown, L2 =:= unknown} of
{true, false} ->
arith_bor_range_set(arith_bor_ranges(Min1, Max1, Min2, Max2), L2);
@@ -1967,19 +2047,19 @@ arith_bor_ranges(Min1, Max1, Min2, Max2) ->
end,
{Min, Max}.
-arith(Op, X1, X2) ->
+arith(Op, X1, X2, Opaques) ->
%% io:format("arith ~p ~p ~p~n", [Op, X1, X2]),
- case t_is_integer(X1) andalso t_is_integer(X2) of
+ case t_is_integer(X1, Opaques) andalso t_is_integer(X2, Opaques) of
false -> error;
true ->
- L1 = t_number_vals(X1),
- L2 = t_number_vals(X2),
+ L1 = t_number_vals(X1, Opaques),
+ L2 = t_number_vals(X2, Opaques),
case (L1 =:= unknown) orelse (L2 =:= unknown) of
true ->
- Min1 = number_min(X1),
- Max1 = number_max(X1),
- Min2 = number_min(X2),
- Max2 = number_max(X2),
+ Min1 = number_min(X1, Opaques),
+ Max1 = number_max(X1, Opaques),
+ Min2 = number_min(X2, Opaques),
+ Max2 = number_max(X2, Opaques),
{NewMin, NewMax} =
case Op of
'+' -> {infinity_add(Min1, Min2), infinity_add(Max1, Max2)};
@@ -1992,8 +2072,8 @@ arith(Op, X1, X2) ->
'bsr' -> NewMin2 = infinity_inv(Max2),
NewMax2 = infinity_inv(Min2),
arith_bsl(Min1, Max1, NewMin2, NewMax2);
- 'band' -> arith_band(X1, X2);
- 'bor' -> arith_bor(X1, X2);
+ 'band' -> arith_band(X1, X2, Opaques);
+ 'bor' -> arith_bor(X1, X2, Opaques);
'bxor' -> arith_bor_ranges(Min1, Max1, Min2, Max2) %% overaprox.
end,
%% io:format("done arith ~p = ~p~n", [Op, {NewMin, NewMax}]),
@@ -2025,58 +2105,62 @@ arith(Op, X1, X2) ->
%% Comparison of terms
%%=============================================================================
-compare(Op, Lhs, Rhs) ->
- case t_is_none(t_inf(Lhs, Rhs)) of
+compare(Op, Lhs, Rhs, Opaques) ->
+ case t_is_none(t_inf(Lhs, Rhs, Opaques)) of
false -> t_boolean();
true ->
- case Op of
- '<' -> always_smaller(Lhs, Rhs);
- '>' -> always_smaller(Rhs, Lhs);
- '=<' -> always_smaller(Lhs, Rhs);
- '>=' -> always_smaller(Rhs, Lhs)
+ case opaque_args(erlang, Op, 2, [Lhs, Rhs], Opaques) =:= [] of
+ true ->
+ case Op of
+ '<' -> always_smaller(Lhs, Rhs, Opaques);
+ '>' -> always_smaller(Rhs, Lhs, Opaques);
+ '=<' -> always_smaller(Lhs, Rhs, Opaques);
+ '>=' -> always_smaller(Rhs, Lhs, Opaques)
+ end;
+ false -> t_none()
end
end.
-always_smaller(Type1, Type2) ->
- {Min1, Max1} = type_ranks(Type1),
- {Min2, Max2} = type_ranks(Type2),
+always_smaller(Type1, Type2, Opaques) ->
+ {Min1, Max1} = type_ranks(Type1, Opaques),
+ {Min2, Max2} = type_ranks(Type2, Opaques),
if Max1 < Min2 -> t_atom('true');
Min1 > Max2 -> t_atom('false');
true -> t_boolean()
end.
-type_ranks(Type) ->
- type_ranks(Type, 1, 0, 0, type_order()).
+type_ranks(Type, Opaques) ->
+ type_ranks(Type, 1, 0, 0, type_order(), Opaques).
-type_ranks(_Type, _I, Min, Max, []) -> {Min, Max};
-type_ranks(Type, I, Min, Max, [TypeClass|Rest]) ->
+type_ranks(_Type, _I, Min, Max, [], _Opaques) -> {Min, Max};
+type_ranks(Type, I, Min, Max, [TypeClass|Rest], Opaques) ->
{NewMin, NewMax} =
- case t_is_none(t_inf(Type, TypeClass)) of
+ case t_is_none(t_inf(Type, TypeClass, Opaques)) of
true -> {Min, Max};
false -> case Min of
0 -> {I, I};
_ -> {Min, I}
end
end,
- type_ranks(Type, I+1, NewMin, NewMax, Rest).
+ type_ranks(Type, I+1, NewMin, NewMax, Rest, Opaques).
type_order() ->
[t_number(), t_atom(), t_reference(), t_fun(), t_port(), t_pid(), t_tuple(),
t_list(), t_binary()].
-key_comparisons_fail(X0, KeyPos, TupleList) ->
- X = case t_is_number(t_inf(X0, t_number())) of
+key_comparisons_fail(X0, KeyPos, TupleList, Opaques) ->
+ X = case t_is_number(t_inf(X0, t_number(), Opaques), Opaques) of
false -> X0;
true -> t_number()
end,
lists:all(fun(Tuple) ->
Key = type(erlang, element, 2, [KeyPos, Tuple]),
- t_is_none(t_inf(Key, X))
+ t_is_none(t_inf(Key, X, Opaques))
end, TupleList).
%%=============================================================================
--spec arg_types(atom(), atom(), arity()) -> [erl_types:erl_type()] | 'unknown'.
+-spec arg_types(atom(), atom(), arity()) -> arg_types() | 'unknown'.
%%------- erlang --------------------------------------------------------------
arg_types(erlang, '!', 2) ->
@@ -2508,47 +2592,78 @@ arg_types(M, F, A) when is_atom(M), is_atom(F),
unknown. % safe approximation for all functions.
--spec is_known(atom(), atom(), arity()) -> boolean().
+-spec is_known(module(), atom(), arity()) -> boolean().
is_known(M, F, A) ->
arg_types(M, F, A) =/= unknown.
+-spec opaque_args(module(), atom(), arity(),
+ arg_types(), opaques()) -> [pos_integer()].
+
+%% Use this function to find out which argument caused empty type.
+
+opaque_args(_M, _F, _A, _Xs, 'universe') -> [];
+opaque_args(M, F, A, Xs, Opaques) ->
+ case kind_of_check(M, F, A) of
+ record ->
+ [X,Y|_] = Xs,
+ [1 ||
+ case t_is_tuple(X, Opaques) of
+ true ->
+ case t_tuple_subtypes(X, Opaques) of
+ unknown -> false;
+ List when length(List) >= 1 -> opaque_recargs(List, Y, Opaques)
+ end;
+ false -> t_has_opaque_subtype(X, Opaques)
+ end];
+ subtype ->
+ [N ||
+ {N, X} <- lists:zip(lists:seq(1, length(Xs)), Xs),
+ t_has_opaque_subtype(X, Opaques)];
+ find_unknown ->
+ [L, R] = Xs,
+ erl_types:t_find_unknown_opaque(L, R, Opaques);
+ no_check -> []
+ end.
--spec structure_inspecting_args(atom(), atom(), arity()) -> [1..255].
-
-structure_inspecting_args(erlang, element, 2) -> [2];
-structure_inspecting_args(erlang, is_atom, 1) -> [1];
-structure_inspecting_args(erlang, is_boolean, 1) -> [1];
-structure_inspecting_args(erlang, is_binary, 1) -> [1];
-structure_inspecting_args(erlang, is_bitstring, 1) -> [1];
-structure_inspecting_args(erlang, is_float, 1) -> [1];
-structure_inspecting_args(erlang, is_function, 1) -> [1];
-structure_inspecting_args(erlang, is_integer, 1) -> [1];
-structure_inspecting_args(erlang, is_list, 1) -> [1];
-structure_inspecting_args(erlang, is_number, 1) -> [1];
-structure_inspecting_args(erlang, is_pid, 1) -> [1];
-structure_inspecting_args(erlang, is_port, 1) -> [1];
-structure_inspecting_args(erlang, is_reference, 1) -> [1];
-structure_inspecting_args(erlang, is_tuple, 1) -> [1];
-structure_inspecting_args(erlang, length, 1) -> [1];
-%%structure_inspecting_args(erlang, setelement, 3) -> [2].
-structure_inspecting_args(_, _, _) -> []. % XXX: assume no arg needs inspection
-
-
-check_fun_application(Fun, Args) ->
- case t_is_fun(Fun) of
+kind_of_check(erlang, is_record, 3) ->
+ record;
+kind_of_check(erlang, is_record, 2) ->
+ record;
+kind_of_check(erlang, F, A) ->
+ case erl_internal:guard_bif(F, A) orelse erl_internal:bool_op(F, A) of
+ true -> subtype;
+ false ->
+ case erl_internal:comp_op(F, A) of
+ true -> find_unknown;
+ false -> no_check
+ end
+ end;
+kind_of_check(_M, _F, _A) -> no_check.
+
+opaque_recargs(Tuples, Y, Opaques) ->
+ Fun = fun(Tuple) ->
+ case t_tuple_args(Tuple, Opaques) of
+ [Tag|_] -> t_is_none(check_record_tag(Tag, Y, Opaques));
+ _ -> false
+ end
+ end,
+ lists:all(Fun, Tuples).
+
+check_fun_application(Fun, Args, Opaques) ->
+ case t_is_fun(Fun, Opaques) of
true ->
- case t_fun_args(Fun) of
+ case t_fun_args(Fun, Opaques) of
unknown ->
- case t_is_none_or_unit(t_fun_range(Fun)) of
+ case t_is_none_or_unit(t_fun_range(Fun, Opaques)) of
true -> error;
false -> ok
end;
FunDom when length(FunDom) =:= length(Args) ->
- case any_is_none_or_unit(inf_lists(FunDom, Args)) of
+ case any_is_none_or_unit(inf_lists(FunDom, Args, Opaques)) of
true -> error;
false ->
- case t_is_none_or_unit(t_fun_range(Fun)) of
+ case t_is_none_or_unit(t_fun_range(Fun, Opaques)) of
true -> error;
false -> ok
end
diff --git a/lib/hipe/cerl/erl_types.erl b/lib/hipe/cerl/erl_types.erl
index d7d8a878c5..cfa72d85b7 100644
--- a/lib/hipe/cerl/erl_types.erl
+++ b/lib/hipe/cerl/erl_types.erl
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2003-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2003-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -42,15 +42,15 @@
max/2,
module_builtin_opaques/1,
min/2,
- number_max/1,
- number_min/1,
+ number_max/1, number_max/2,
+ number_min/1, number_min/2,
t_abstract_records/2,
t_any/0,
t_arity/0,
t_atom/0,
t_atom/1,
t_atoms/1,
- t_atom_vals/1,
+ t_atom_vals/1, t_atom_vals/2,
t_binary/0,
t_bitstr/0,
t_bitstr/2,
@@ -66,12 +66,14 @@
t_collect_vars/1,
t_cons/0,
t_cons/2,
- t_cons_hd/1,
- t_cons_tl/1,
+ t_cons_hd/1, t_cons_hd/2,
+ t_cons_tl/1, t_cons_tl/2,
t_constant/0,
- t_contains_opaque/1,
+ t_contains_opaque/1, t_contains_opaque/2,
+ t_decorate_with_opaque/3,
t_elements/1,
t_find_opaque_mismatch/2,
+ t_find_unknown_opaque/3,
t_fixnum/0,
t_map/2,
t_non_neg_fixnum/0,
@@ -87,18 +89,18 @@
t_fun/0,
t_fun/1,
t_fun/2,
- t_fun_args/1,
- t_fun_arity/1,
- t_fun_range/1,
- t_has_opaque_subtype/1,
+ t_fun_args/1, t_fun_args/2,
+ t_fun_arity/1, t_fun_arity/2,
+ t_fun_range/1, t_fun_range/2,
+ t_has_opaque_subtype/2,
t_has_var/1,
t_identifier/0,
%% t_improper_list/2,
- t_inf/2,
- t_inf/3,
- t_inf_lists/2,
- t_inf_lists/3,
- t_inf_lists_masked/3,
+ t_inf/1,
+ t_inf/2,
+ t_inf/3,
+ t_inf_lists/2,
+ t_inf_lists/3,
t_integer/0,
t_integer/1,
t_non_neg_integer/0,
@@ -107,44 +109,44 @@
t_iodata/0,
t_iolist/0,
t_is_any/1,
- t_is_atom/1,
- t_is_atom/2,
- t_is_binary/1,
- t_is_bitstr/1,
+ t_is_atom/1, t_is_atom/2,
+ t_is_any_atom/2, t_is_any_atom/3,
+ t_is_binary/1, t_is_binary/2,
+ t_is_bitstr/1, t_is_bitstr/2,
t_is_bitwidth/1,
- t_is_boolean/1,
+ t_is_boolean/1, t_is_boolean/2,
%% t_is_byte/1,
%% t_is_char/1,
- t_is_cons/1,
+ t_is_cons/1, t_is_cons/2,
t_is_constant/1,
t_is_equal/2,
t_is_fixnum/1,
- t_is_float/1,
- t_is_fun/1,
+ t_is_float/1, t_is_float/2,
+ t_is_fun/1, t_is_fun/2,
t_is_instance/2,
- t_is_integer/1,
+ t_is_integer/1, t_is_integer/2,
t_is_list/1,
t_is_matchstate/1,
- t_is_nil/1,
+ t_is_nil/1, t_is_nil/2,
t_is_non_neg_integer/1,
t_is_none/1,
t_is_none_or_unit/1,
- t_is_number/1,
- t_is_opaque/1,
- t_is_pid/1,
- t_is_port/1,
- t_is_maybe_improper_list/1,
- t_is_reference/1,
+ t_is_number/1, t_is_number/2,
+ t_is_opaque/1, t_is_opaque/2,
+ t_is_pid/1, t_is_pid/2,
+ t_is_port/1, t_is_port/2,
+ t_is_maybe_improper_list/1, t_is_maybe_improper_list/2,
+ t_is_reference/1, t_is_reference/2,
t_is_remote/1,
t_is_string/1,
t_is_subtype/2,
- t_is_tuple/1,
+ t_is_tuple/1, t_is_tuple/2,
t_is_unit/1,
t_is_var/1,
t_limit/2,
t_list/0,
t_list/1,
- t_list_elements/1,
+ t_list_elements/1, t_list_elements/2,
t_list_termination/1,
t_matchstate/0,
t_matchstate/2,
@@ -163,11 +165,8 @@
t_nonempty_string/0,
t_number/0,
t_number/1,
- t_number_vals/1,
+ t_number_vals/1, t_number_vals/2,
t_opaque_from_records/1,
- t_opaque_match_atom/2,
- t_opaque_match_record/2,
- t_opaque_matching_structure/2,
t_opaque_structure/1,
%% t_parameterized_module/0,
t_pid/0,
@@ -192,16 +191,14 @@
t_to_tlist/1,
t_tuple/0,
t_tuple/1,
- t_tuple_args/1,
- t_tuple_size/1,
+ t_tuple_args/1, t_tuple_args/2,
+ t_tuple_size/1, t_tuple_size/2,
t_tuple_sizes/1,
t_tuple_subtypes/1,
+ t_tuple_subtypes/2,
t_unify/2,
- t_unify/3,
t_unit/0,
- t_unopaque/1,
- t_unopaque/2,
- t_unopaque_on_mismatch/3,
+ t_unopaque/1, t_unopaque/2,
t_var/1,
t_var_name/1,
%% t_assign_variables_to_subtype/2,
@@ -209,6 +206,7 @@
record_field_diffs_to_string/2,
subst_all_vars_to_any/1,
lift_list_to_pos_empty/1,
+ is_opaque_type/2,
is_erl_type/1,
atom_to_string/1
]).
@@ -228,6 +226,14 @@
-export_type([erl_type/0]).
+%%-define(DEBUG, true).
+
+-ifdef(DEBUG).
+-define(debug(__A), __A).
+-else.
+-define(debug(__A), ok).
+-endif.
+
%%=============================================================================
%%
%% Definition of the type structure
@@ -310,6 +316,9 @@
-record(int_set, {set :: [integer()]}).
-record(int_rng, {from :: rng_elem(), to :: rng_elem()}).
+%% Note: the definition of #opaque{} was changed to 'mod' and 'name';
+%% it used to be an ordsets of {Mod, Name} pairs. The Dialyzer version
+%% was updated to 2.7 due to this change.
-record(opaque, {mod :: module(), name :: atom(),
args = [] :: [erl_type()], struct :: erl_type()}).
-record(remote, {mod:: module(), name :: atom(), args = [] :: [erl_type()]}).
@@ -346,6 +355,8 @@
-define(integer_non_neg, ?int_range(0, pos_inf)).
-define(integer_neg, ?int_range(neg_inf, -1)).
+-type opaques() :: [erl_type()] | 'universe'.
+
%%-----------------------------------------------------------------------------
%% Unions
%%
@@ -384,8 +395,11 @@ t_any() ->
-spec t_is_any(erl_type()) -> boolean().
-t_is_any(?any) -> true;
-t_is_any(_) -> false.
+t_is_any(Type) ->
+ do_opaque(Type, 'universe', fun is_any/1).
+
+is_any(?any) -> true;
+is_any(_) -> false.
-spec t_none() -> erl_type().
@@ -407,16 +421,25 @@ t_opaque(Mod, Name, Args, Struct) ->
O = #opaque{mod = Mod, name = Name, args = Args, struct = Struct},
?opaque(set_singleton(O)).
+-spec t_is_opaque(erl_type(), [erl_type()]) -> boolean().
+
+t_is_opaque(?opaque(_) = Type, Opaques) ->
+ not is_opaque_type(Type, Opaques);
+t_is_opaque(_Type, _Opaques) -> false.
+
-spec t_is_opaque(erl_type()) -> boolean().
t_is_opaque(?opaque(_)) -> true;
t_is_opaque(_) -> false.
--spec t_has_opaque_subtype(erl_type()) -> boolean().
+-spec t_has_opaque_subtype(erl_type(), opaques()) -> boolean().
+
+t_has_opaque_subtype(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun has_opaque_subtype/1).
-t_has_opaque_subtype(?union(Ts)) ->
+has_opaque_subtype(?union(Ts)) ->
lists:any(fun t_is_opaque/1, Ts);
-t_has_opaque_subtype(T) ->
+has_opaque_subtype(T) ->
t_is_opaque(T).
-spec t_opaque_structure(erl_type()) -> erl_type().
@@ -424,74 +447,62 @@ t_has_opaque_subtype(T) ->
t_opaque_structure(?opaque(Elements)) ->
t_sup([Struct || #opaque{struct = Struct} <- ordsets:to_list(Elements)]).
--spec t_opaque_module(erl_type()) -> module().
+-spec t_opaque_modules(erl_type()) -> [module()].
-t_opaque_module(?opaque(Elements)) ->
+t_opaque_modules(?opaque(Elements)) ->
case ordsets:size(Elements) of
1 ->
- [#opaque{mod = Module}] = ordsets:to_list(Elements),
- Module;
+ [#opaque{mod = Mod}] = set_to_list(Elements),
+ [Mod];
_ -> throw({error, "Unexpected multiple opaque types"})
end.
-%% This only makes sense if we know that Type matches Opaque
--spec t_opaque_matching_structure(erl_type(), erl_type()) -> erl_type().
-
-t_opaque_matching_structure(Type, Opaque) ->
- OpaqueStruct = t_opaque_structure(Opaque),
- case OpaqueStruct of
- ?union(L1) ->
- case Type of
- ?union(_L2) -> OpaqueStruct;
- _OtherType -> t_opaque_matching_structure_list(Type, L1)
- end;
- ?tuple_set(_Set1) = TupleSet ->
- case Type of
- ?tuple_set(_Set2) -> OpaqueStruct;
- _ -> t_opaque_matching_structure_list(Type, t_tuple_subtypes(TupleSet))
- end;
- _Other -> OpaqueStruct
- end.
-
-t_opaque_matching_structure_list(Type, List) ->
- NewList = [t_inf(Element, Type) || Element <- List],
- Results = [NotNone || NotNone <- NewList, NotNone =/= ?none],
- case Results of
- [] -> ?none;
- [First|_] -> First
- end.
-
-spec t_contains_opaque(erl_type()) -> boolean().
-t_contains_opaque(?any) -> false;
-t_contains_opaque(?none) -> false;
-t_contains_opaque(?unit) -> false;
-t_contains_opaque(?atom(_Set)) -> false;
-t_contains_opaque(?bitstr(_Unit, _Base)) -> false;
-t_contains_opaque(?float) -> false;
-t_contains_opaque(?function(Domain, Range)) ->
- t_contains_opaque(Domain) orelse t_contains_opaque(Range);
-t_contains_opaque(?identifier(_Types)) -> false;
-t_contains_opaque(?integer(_Types)) -> false;
-t_contains_opaque(?int_range(_From, _To)) -> false;
-t_contains_opaque(?int_set(_Set)) -> false;
-t_contains_opaque(?list(Type, _, _)) -> t_contains_opaque(Type);
-t_contains_opaque(?matchstate(_P, _Slots)) -> false;
-t_contains_opaque(?nil) -> false;
-t_contains_opaque(?number(_Set, _Tag)) -> false;
-t_contains_opaque(?opaque(_)) -> true;
-t_contains_opaque(?product(Types)) -> list_contains_opaque(Types);
-t_contains_opaque(?tuple(?any, _, _)) -> false;
-t_contains_opaque(?tuple(Types, _, _)) -> list_contains_opaque(Types);
-t_contains_opaque(?tuple_set(_Set) = T) ->
- list_contains_opaque(t_tuple_subtypes(T));
-t_contains_opaque(?union(List)) -> list_contains_opaque(List);
-t_contains_opaque(?var(_Id)) -> false.
-
--spec list_contains_opaque([erl_type()]) -> boolean().
-
-list_contains_opaque(List) ->
- lists:any(fun t_contains_opaque/1, List).
+t_contains_opaque(Type) ->
+ t_contains_opaque(Type, []).
+
+%% Returns 'true' iff there is an opaque type that is *not* one of
+%% the types of the second argument.
+
+-spec t_contains_opaque(erl_type(), [erl_type()]) -> boolean().
+
+t_contains_opaque(?any, _Opaques) -> false;
+t_contains_opaque(?none, _Opaques) -> false;
+t_contains_opaque(?unit, _Opaques) -> false;
+t_contains_opaque(?atom(_Set), _Opaques) -> false;
+t_contains_opaque(?bitstr(_Unit, _Base), _Opaques) -> false;
+t_contains_opaque(?float, _Opaques) -> false;
+t_contains_opaque(?function(Domain, Range), Opaques) ->
+ t_contains_opaque(Domain, Opaques)
+ orelse t_contains_opaque(Range, Opaques);
+t_contains_opaque(?identifier(_Types), _Opaques) -> false;
+t_contains_opaque(?integer(_Types), _Opaques) -> false;
+t_contains_opaque(?int_range(_From, _To), _Opaques) -> false;
+t_contains_opaque(?int_set(_Set), _Opaques) -> false;
+t_contains_opaque(?list(Type, Tail, _), Opaques) ->
+ t_contains_opaque(Type, Opaques) orelse t_contains_opaque(Tail, Opaques);
+t_contains_opaque(?matchstate(_P, _Slots), _Opaques) -> false;
+t_contains_opaque(?nil, _Opaques) -> false;
+t_contains_opaque(?number(_Set, _Tag), _Opaques) -> false;
+t_contains_opaque(?opaque(_)=T, Opaques) ->
+ not is_opaque_type(T, Opaques)
+ orelse t_contains_opaque(t_opaque_structure(T));
+t_contains_opaque(?product(Types), Opaques) ->
+ list_contains_opaque(Types, Opaques);
+t_contains_opaque(?tuple(?any, _, _), _Opaques) -> false;
+t_contains_opaque(?tuple(Types, _, _), Opaques) ->
+ list_contains_opaque(Types, Opaques);
+t_contains_opaque(?tuple_set(_Set) = T, Opaques) ->
+ list_contains_opaque(t_tuple_subtypes(T), Opaques);
+t_contains_opaque(?union(List), Opaques) ->
+ list_contains_opaque(List, Opaques);
+t_contains_opaque(?var(_Id), _Opaques) -> false.
+
+-spec list_contains_opaque([erl_type()], [erl_type()]) -> boolean().
+
+list_contains_opaque(List, Opaques) ->
+ lists:any(fun(E) -> t_contains_opaque(E, Opaques) end, List).
%% t_find_opaque_mismatch/2 of two types should only be used if their
%% t_inf is t_none() due to some opaque type violation.
@@ -506,9 +517,12 @@ t_find_opaque_mismatch(T1, T2) ->
t_find_opaque_mismatch(?any, _Type, _TopType) -> error;
t_find_opaque_mismatch(?none, _Type, _TopType) -> error;
-t_find_opaque_mismatch(?list(T1, _, _), ?list(T2, _, _), TopType) ->
- t_find_opaque_mismatch(T1, T2, TopType);
+t_find_opaque_mismatch(?list(T1, Tl1, _), ?list(T2, Tl2, _), TopType) ->
+ t_find_opaque_mismatch_ordlists([T1, Tl1], [T2, Tl2], TopType);
t_find_opaque_mismatch(_T1, ?opaque(_) = T2, TopType) -> {ok, TopType, T2};
+t_find_opaque_mismatch(?opaque(_) = T1, _T2, TopType) ->
+ %% The generated message is somewhat misleading:
+ {ok, TopType, T1};
t_find_opaque_mismatch(?product(T1), ?product(T2), TopType) ->
t_find_opaque_mismatch_ordlists(T1, T2, TopType);
t_find_opaque_mismatch(?tuple(T1, Arity, _), ?tuple(T2, Arity, _), TopType) ->
@@ -538,6 +552,166 @@ t_find_opaque_mismatch_list([H|T]) ->
error -> t_find_opaque_mismatch_list(T)
end.
+-spec t_find_unknown_opaque(erl_type(), erl_type(), opaques()) ->
+ [pos_integer()].
+
+%% The nice thing about using two types and t_inf() as compared to
+%% calling t_contains_opaque/2 is that the traversal stops when
+%% there is a mismatch which means that unknown opaque types "below"
+%% the mismatch are not found.
+%% XXX. Returns one element even if both oparands contain opaque types.
+%% XXX. Slow since t_inf() is called but the results are ignored.
+t_find_unknown_opaque(_T1, _T2, 'universe') -> [];
+t_find_unknown_opaque(T1, T2, Opaques) ->
+ try t_inf(T1, T2, {match, Opaques}) of
+ _ -> []
+ catch throw:N when is_integer(N) -> [N]
+ end.
+
+-spec t_decorate_with_opaque(erl_type(), erl_type(), [erl_type()]) -> erl_type().
+
+%% The first argument can contain opaque types. The second argument
+%% is assumed to be taken from the contract.
+
+t_decorate_with_opaque(T1, T2, Opaques) ->
+ case t_is_equal(T1, T2) orelse not t_contains_opaque(T2) of
+ true -> T1;
+ false ->
+ T = t_inf(T1, T2),
+ case t_contains_opaque(T) of
+ false -> T1;
+ true ->
+ R = decorate(T1, T, Opaques),
+ ?debug(case catch t_is_equal(t_unopaque(R), t_unopaque(T1)) of
+ true -> ok;
+ false ->
+ io:format("T1 = ~p,\n", [T1]),
+ io:format("T2 = ~p,\n", [T2]),
+ io:format("O = ~p,\n", [Opaques]),
+ io:format("erl_types:t_decorate_with_opaque(T1,T2,O).\n"),
+ throw({error, "Failed to handle opaque types"})
+ end),
+ R
+ end
+ end.
+
+decorate(?none=Type, _, _Opaques) -> Type;
+decorate(?function(Domain, Range), ?function(D, R), Opaques) ->
+ ?function(decorate(Domain, D, Opaques), decorate(Range, R, Opaques));
+decorate(?list(Types, Tail, Size), ?list(Ts, Tl, _Sz), Opaques) ->
+ ?list(decorate(Types, Ts, Opaques), decorate(Tail, Tl, Opaques), Size);
+decorate(?product(Types), ?product(Ts), Opaques) ->
+ ?product(list_decorate(Types, Ts, Opaques));
+decorate(?tuple(_, _, _)=T, ?tuple(?any, _, _), _Opaques) -> T;
+decorate(?tuple(?any, _, _)=T, ?tuple(_, _, _), _Opaques) -> T;
+decorate(?tuple(Types, Arity, Tag), ?tuple(Ts, Arity, _), Opaques) ->
+ ?tuple(list_decorate(Types, Ts, Opaques), Arity, Tag);
+decorate(?tuple_set(List), ?tuple(_, Arity, _) = T, Opaques) ->
+ decorate_tuple_sets(List, [{Arity, [T]}], Opaques);
+decorate(?tuple_set(List), ?tuple_set(L), Opaques) ->
+ decorate_tuple_sets(List, L, Opaques);
+decorate(?union(List), T, Opaques) when T =/= ?any ->
+ ?union(L) = force_union(T),
+ union_decorate(List, L, Opaques);
+decorate(?opaque(_)=T, _, _Opaques) -> T;
+decorate(T, ?union(L), Opaques) when T =/= ?any ->
+ ?union(List) = force_union(T),
+ union_decorate(List, L, Opaques);
+decorate(Type, ?opaque(_)=T, Opaques) ->
+ decorate_with_opaque(Type, T, Opaques);
+decorate(Type, _T, _Opaques) -> Type.
+
+%% Note: it is important that #opaque.struct is a subtype of the
+%% opaque type.
+decorate_with_opaque(Type, ?opaque(Set2), Opaques) ->
+ case decoration(set_to_list(Set2), Type, Opaques, [], false) of
+ {[], false} -> Type;
+ {List, All} when List =/= [] ->
+ NewType = ?opaque(ordsets:from_list(List)),
+ case All of
+ true -> NewType;
+ false -> t_sup(NewType, Type)
+ end
+ end.
+
+decoration([#opaque{struct = S} = Opaque|OpaqueTypes], Type, Opaques,
+ NewOpaqueTypes, All) ->
+ IsOpaque = is_opaque_type2(Opaque, Opaques),
+ I = t_inf(Type, S),
+ case not IsOpaque orelse t_is_none(I = t_inf(Type, S)) of
+ true -> decoration(OpaqueTypes, Type, Opaques, NewOpaqueTypes, All);
+ false ->
+ NewOpaque = Opaque#opaque{struct = decorate(I, S, Opaques)},
+ NewAll = All orelse t_is_equal(I, Type),
+ decoration(OpaqueTypes, Type, Opaques, [NewOpaque|NewOpaqueTypes], NewAll)
+ end;
+decoration([], _Type, _Opaques, NewOpaqueTypes, All) ->
+ {NewOpaqueTypes, All}.
+
+-spec list_decorate([erl_type()], [erl_type()], opaques()) -> [erl_type()].
+
+list_decorate(List, L, Opaques) ->
+ [decorate(Elem, E, Opaques) || {Elem, E} <- lists:zip(List, L)].
+
+union_decorate(U1, U2, Opaques) ->
+ Union = union_decorate(U1, U2, Opaques, 0, []),
+ [A,B,F,I,L,N,T,M,_,_R] = U1,
+ [_,_,_,_,_,_,_,_,Opaque,_] = U2,
+ List = [A,B,F,I,L,N,T,M],
+ DecList = [Dec ||
+ E <- List,
+ not t_is_none(Dec = decorate(E, Opaque, Opaques))],
+ t_sup([Union|DecList]).
+
+union_decorate([?none|Left1], [_|Left2], Opaques, N, Acc) ->
+ union_decorate(Left1, Left2, Opaques, N, [?none|Acc]);
+union_decorate([T1|Left1], [?none|Left2], Opaques, N, Acc) ->
+ union_decorate(Left1, Left2, Opaques, N+1, [T1|Acc]);
+union_decorate([T1|Left1], [T2|Left2], Opaques, N, Acc) ->
+ union_decorate(Left1, Left2, Opaques, N+1, [decorate(T1, T2, Opaques)|Acc]);
+union_decorate([], [], _Opaques, N, Acc) ->
+ if N =:= 0 -> ?none;
+ N =:= 1 ->
+ [Type] = [T || T <- Acc, T =/= ?none],
+ Type;
+ N >= 2 -> ?union(lists:reverse(Acc))
+ end.
+
+decorate_tuple_sets(List, L, Opaques) ->
+ decorate_tuple_sets(List, L, Opaques, []).
+
+decorate_tuple_sets([{Arity, Tuples}|List], [{Arity, Ts}|L], Opaques, Acc) ->
+ DecTs = decorate_tuples_in_sets(Tuples, Ts, Opaques),
+ decorate_tuple_sets(List, L, Opaques, [{Arity, DecTs}|Acc]);
+decorate_tuple_sets([ArTup|List], L, Opaques, Acc) ->
+ decorate_tuple_sets(List, L, Opaques, [ArTup|Acc]);
+decorate_tuple_sets([], _L, _Opaques, Acc) ->
+ ?tuple_set(lists:reverse(Acc)).
+
+decorate_tuples_in_sets([?tuple(Elements, _, ?any)], Ts, Opaques) ->
+ NewList = [list_decorate(Elements, Es, Opaques) || ?tuple(Es, _, _) <- Ts],
+ case t_sup([t_tuple(Es) || Es <- NewList]) of
+ ?tuple_set([{_Arity, Tuples}]) -> Tuples;
+ ?tuple(_, _, _)=Tuple -> [Tuple]
+ end;
+decorate_tuples_in_sets(Tuples, Ts, Opaques) ->
+ decorate_tuples_in_sets(Tuples, Ts, Opaques, []).
+
+decorate_tuples_in_sets([?tuple(Elements, Arity, Tag1) = T1|Tuples] = L1,
+ [?tuple(Es, Arity, Tag2)|Ts] = L2, Opaques, Acc) ->
+ if
+ Tag1 < Tag2 -> decorate_tuples_in_sets(Tuples, L2, Opaques, [T1|Acc]);
+ Tag1 > Tag2 -> decorate_tuples_in_sets(L1, Ts, Opaques, Acc);
+ Tag1 =:= Tag2 ->
+ NewElements = list_decorate(Elements, Es, Opaques),
+ NewAcc = [?tuple(NewElements, Arity, Tag1)|Acc],
+ decorate_tuples_in_sets(Tuples, Ts, Opaques, NewAcc)
+ end;
+decorate_tuples_in_sets([T1|Tuples], L2, Opaques, Acc) ->
+ decorate_tuples_in_sets(Tuples, L2, Opaques, [T1|Acc]);
+decorate_tuples_in_sets([], _L, _Opaques, Acc) ->
+ lists:reverse(Acc).
+
-spec t_opaque_from_records(dict()) -> [erl_type()].
t_opaque_from_records(RecDict) ->
@@ -559,44 +733,6 @@ t_opaque_from_records(RecDict) ->
end, OpaqueRecDict),
[OpaqueType || {_Key, OpaqueType} <- dict:to_list(OpaqueTypeDict)].
--spec t_opaque_match_atom(erl_type(), [erl_type()]) -> [erl_type()].
-
-t_opaque_match_atom(?atom(_) = Atom, Opaques) ->
- case t_atom_vals(Atom) of
- unknown -> [];
- _ -> [O || O <- Opaques, t_inf(Atom, O, opaque) =/= ?none,
- t_opaque_atom_vals(t_opaque_structure(O)) =/= unknown]
- end;
-t_opaque_match_atom(_, _) -> [].
-
--spec t_opaque_atom_vals(erl_type()) -> 'unknown' | [atom(),...].
-
-t_opaque_atom_vals(OpaqueStruct) ->
- case OpaqueStruct of
- ?atom(_) -> t_atom_vals(OpaqueStruct);
- ?union([Atom,_,_,_,_,_,_,_,_,_]) -> t_atom_vals(Atom);
- _ -> unknown
- end.
-
--spec t_opaque_match_record(erl_type(), [erl_type()]) -> [erl_type()].
-
-t_opaque_match_record(?tuple([?atom(_) = Tag|_Fields], _, _) = Rec, Opaques) ->
- [O || O <- Opaques, t_inf(Rec, O, opaque) =/= ?none,
- lists:member(Tag, t_opaque_tuple_tags(t_opaque_structure(O)))];
-t_opaque_match_record(_, _) -> [].
-
--spec t_opaque_tuple_tags(erl_type()) -> [erl_type()].
-
-t_opaque_tuple_tags(OpaqueStruct) ->
- case OpaqueStruct of
- ?tuple([?atom(_) = Tag|_Fields], _, _) -> [Tag];
- ?tuple_set(_) = TupleSet ->
- Tuples = t_tuple_subtypes(TupleSet),
- lists:flatten([t_opaque_tuple_tags(T) || T <- Tuples]);
- ?union([_,_,_,_,_,_,Tuples,_,_,_]) -> t_opaque_tuple_tags(Tuples);
- _ -> []
- end.
-
%% Decompose opaque instances of type arg2 to structured types, in arg1
%% XXX: Same as t_unopaque
-spec t_struct_from_opaque(erl_type(), [erl_type()]) -> erl_type().
@@ -605,9 +741,10 @@ t_struct_from_opaque(?function(Domain, Range), Opaques) ->
?function(t_struct_from_opaque(Domain, Opaques),
t_struct_from_opaque(Range, Opaques));
t_struct_from_opaque(?list(Types, Term, Size), Opaques) ->
- ?list(t_struct_from_opaque(Types, Opaques), Term, Size);
+ ?list(t_struct_from_opaque(Types, Opaques),
+ t_struct_from_opaque(Term, Opaques), Size);
t_struct_from_opaque(?opaque(_) = T, Opaques) ->
- case lists:member(T, Opaques) of
+ case is_opaque_type(T, Opaques) of
true -> t_opaque_structure(T);
false -> T
end;
@@ -627,24 +764,10 @@ t_struct_from_opaque(Type, _Opaques) -> Type.
list_struct_from_opaque(Types, Opaques) ->
[t_struct_from_opaque(Type, Opaques) || Type <- Types].
--spec t_unopaque_on_mismatch(erl_type(), erl_type(), [erl_type()]) -> erl_type().
-
-t_unopaque_on_mismatch(GenType, Type, Opaques) ->
- case t_inf(GenType, Type) of
- ?none ->
- Unopaqued = t_unopaque(Type, Opaques),
- %% XXX: Unions might be a problem, must investigate.
- case t_inf(GenType, Unopaqued) of
- ?none -> Type;
- _ -> Unopaqued
- end;
- _ -> Type
- end.
-
-spec module_builtin_opaques(module()) -> [erl_type()].
module_builtin_opaques(Module) ->
- [O || O <- all_opaque_builtins(), t_opaque_module(O) =:= Module].
+ [O || O <- all_opaque_builtins(), lists:member(Module, t_opaque_modules(O))].
%%-----------------------------------------------------------------------------
%% Remote types: these types are used for preprocessing;
@@ -657,8 +780,11 @@ t_remote(Mod, Name, Args) ->
-spec t_is_remote(erl_type()) -> boolean().
-t_is_remote(?remote(_)) -> true;
-t_is_remote(_) -> false.
+t_is_remote(Type) ->
+ do_opaque(Type, 'universe', fun is_remote/1).
+
+is_remote(?remote(_)) -> true;
+is_remote(_) -> false.
-spec t_solve_remote(erl_type(), set(), dict()) -> erl_type().
@@ -827,40 +953,75 @@ t_atoms(List) when is_list(List) ->
-spec t_atom_vals(erl_type()) -> 'unknown' | [atom(),...].
-t_atom_vals(?atom(?any)) -> unknown;
-t_atom_vals(?atom(Set)) -> set_to_list(Set);
-t_atom_vals(Other) ->
+t_atom_vals(Type) ->
+ t_atom_vals(Type, 'universe').
+
+-spec t_atom_vals(erl_type(), opaques()) -> 'unknown' | [atom(),...].
+
+t_atom_vals(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun atom_vals/1).
+
+atom_vals(?atom(?any)) -> unknown;
+atom_vals(?atom(Set)) -> set_to_list(Set);
+atom_vals(?opaque(_)) -> unknown;
+atom_vals(Other) ->
?atom(_) = Atm = t_inf(t_atom(), Other),
- t_atom_vals(Atm).
+ atom_vals(Atm).
-spec t_is_atom(erl_type()) -> boolean().
-t_is_atom(?atom(_)) -> true;
-t_is_atom(_) -> false.
+t_is_atom(Type) ->
+ t_is_atom(Type, 'universe').
+
+-spec t_is_atom(erl_type(), opaques()) -> boolean().
+
+t_is_atom(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_atom1/1).
+
+is_atom1(?atom(_)) -> true;
+is_atom1(_) -> false.
--spec t_is_atom(atom(), erl_type()) -> boolean().
+-spec t_is_any_atom(atom(), erl_type()) -> boolean().
-t_is_atom(Atom, ?atom(?any)) when is_atom(Atom) -> false;
-t_is_atom(Atom, ?atom(Set)) when is_atom(Atom) -> set_is_singleton(Atom, Set);
-t_is_atom(Atom, _) when is_atom(Atom) -> false.
+t_is_any_atom(Atom, SomeAtomsType) ->
+ t_is_any_atom(Atom, SomeAtomsType, 'universe').
+
+-spec t_is_any_atom(atom(), erl_type(), opaques()) -> boolean().
+
+t_is_any_atom(Atom, SomeAtomsType, Opaques) ->
+ do_opaque(SomeAtomsType, Opaques,
+ fun(AtomsType) -> is_any_atom(Atom, AtomsType) end).
+
+is_any_atom(Atom, ?atom(?any)) when is_atom(Atom) -> false;
+is_any_atom(Atom, ?atom(Set)) when is_atom(Atom) ->
+ set_is_singleton(Atom, Set);
+is_any_atom(Atom, _) when is_atom(Atom) -> false.
%%------------------------------------
+-spec t_is_boolean(erl_type()) -> boolean().
+
+t_is_boolean(Type) ->
+ t_is_boolean(Type, 'universe').
+
+-spec t_is_boolean(erl_type(), opaques()) -> boolean().
+
+t_is_boolean(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_boolean/1).
+
-spec t_boolean() -> erl_type().
t_boolean() ->
?atom(set_from_list([false, true])).
--spec t_is_boolean(erl_type()) -> boolean().
-
-t_is_boolean(?atom(?any)) -> false;
-t_is_boolean(?atom(Set)) ->
+is_boolean(?atom(?any)) -> false;
+is_boolean(?atom(Set)) ->
case set_size(Set) of
1 -> set_is_element(true, Set) orelse set_is_element(false, Set);
2 -> set_is_element(true, Set) andalso set_is_element(false, Set);
N when is_integer(N), N > 2 -> false
end;
-t_is_boolean(_) -> false.
+is_boolean(_) -> false.
%%-----------------------------------------------------------------------------
%% Binaries
@@ -873,9 +1034,17 @@ t_binary() ->
-spec t_is_binary(erl_type()) -> boolean().
-t_is_binary(?bitstr(U, B)) ->
+t_is_binary(Type) ->
+ t_is_binary(Type, 'universe').
+
+-spec t_is_binary(erl_type(), opaques()) -> boolean().
+
+t_is_binary(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_binary/1).
+
+is_binary(?bitstr(U, B)) ->
((U rem 8) =:= 0) andalso ((B rem 8) =:= 0);
-t_is_binary(_) -> false.
+is_binary(_) -> false.
%%-----------------------------------------------------------------------------
%% Bitstrings
@@ -922,19 +1091,27 @@ t_bitstr_concat_1([], Acc) ->
t_bitstr_concat(T1, T2) ->
T1p = t_inf(t_bitstr(), T1),
T2p = t_inf(t_bitstr(), T2),
- bitstr_concat(T1p, T2p).
+ bitstr_concat(t_unopaque(T1p), t_unopaque(T2p)).
-spec t_bitstr_match(erl_type(), erl_type()) -> erl_type().
t_bitstr_match(T1, T2) ->
T1p = t_inf(t_bitstr(), T1),
T2p = t_inf(t_bitstr(), T2),
- bitstr_match(T1p, T2p).
+ bitstr_match(t_unopaque(T1p), t_unopaque(T2p)).
-spec t_is_bitstr(erl_type()) -> boolean().
-t_is_bitstr(?bitstr(_, _)) -> true;
-t_is_bitstr(_) -> false.
+t_is_bitstr(Type) ->
+ t_is_bitstr(Type, 'universe').
+
+-spec t_is_bitstr(erl_type(), opaques()) -> boolean().
+
+t_is_bitstr(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_bitstr/1).
+
+is_bitstr(?bitstr(_, _)) -> true;
+is_bitstr(_) -> false.
%%-----------------------------------------------------------------------------
%% Matchstates
@@ -1045,27 +1222,59 @@ t_fun(Arity, Range) when is_integer(Arity), 0 =< Arity, Arity =< 255 ->
-spec t_fun_args(erl_type()) -> 'unknown' | [erl_type()].
-t_fun_args(?function(?any, _)) ->
+t_fun_args(Type) ->
+ t_fun_args(Type, 'universe').
+
+-spec t_fun_args(erl_type(), opaques()) -> 'unknown' | [erl_type()].
+
+t_fun_args(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun fun_args/1).
+
+fun_args(?function(?any, _)) ->
unknown;
-t_fun_args(?function(?product(Domain), _)) when is_list(Domain) ->
+fun_args(?function(?product(Domain), _)) when is_list(Domain) ->
Domain.
-spec t_fun_arity(erl_type()) -> 'unknown' | non_neg_integer().
-t_fun_arity(?function(?any, _)) ->
+t_fun_arity(Type) ->
+ t_fun_arity(Type, 'universe').
+
+-spec t_fun_arity(erl_type(), opaques()) -> 'unknown' | non_neg_integer().
+
+t_fun_arity(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun fun_arity/1).
+
+fun_arity(?function(?any, _)) ->
unknown;
-t_fun_arity(?function(?product(Domain), _)) ->
+fun_arity(?function(?product(Domain), _)) ->
length(Domain).
-spec t_fun_range(erl_type()) -> erl_type().
-t_fun_range(?function(_, Range)) ->
+t_fun_range(Type) ->
+ t_fun_range(Type, 'universe').
+
+-spec t_fun_range(erl_type(), opaques()) -> erl_type().
+
+t_fun_range(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun fun_range/1).
+
+fun_range(?function(_, Range)) ->
Range.
-spec t_is_fun(erl_type()) -> boolean().
-t_is_fun(?function(_, _)) -> true;
-t_is_fun(_) -> false.
+t_is_fun(Type) ->
+ t_is_fun(Type, 'universe').
+
+-spec t_is_fun(erl_type(), opaques()) -> boolean().
+
+t_is_fun(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_fun/1).
+
+is_fun(?function(_, _)) -> true;
+is_fun(_) -> false.
%%-----------------------------------------------------------------------------
%% Identifiers. Includes ports, pids and refs.
@@ -1092,9 +1301,17 @@ t_port() ->
-spec t_is_port(erl_type()) -> boolean().
-t_is_port(?identifier(?any)) -> false;
-t_is_port(?identifier(Set)) -> set_is_singleton(?port_qual, Set);
-t_is_port(_) -> false.
+t_is_port(Type) ->
+ t_is_port(Type, 'universe').
+
+-spec t_is_port(erl_type(), opaques()) -> boolean().
+
+t_is_port(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_port1/1).
+
+is_port1(?identifier(?any)) -> false;
+is_port1(?identifier(Set)) -> set_is_singleton(?port_qual, Set);
+is_port1(_) -> false.
%%------------------------------------
@@ -1105,9 +1322,17 @@ t_pid() ->
-spec t_is_pid(erl_type()) -> boolean().
-t_is_pid(?identifier(?any)) -> false;
-t_is_pid(?identifier(Set)) -> set_is_singleton(?pid_qual, Set);
-t_is_pid(_) -> false.
+t_is_pid(Type) ->
+ t_is_pid(Type, 'universe').
+
+-spec t_is_pid(erl_type(), opaques()) -> boolean().
+
+t_is_pid(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_pid1/1).
+
+is_pid1(?identifier(?any)) -> false;
+is_pid1(?identifier(Set)) -> set_is_singleton(?pid_qual, Set);
+is_pid1(_) -> false.
%%------------------------------------
@@ -1118,9 +1343,17 @@ t_reference() ->
-spec t_is_reference(erl_type()) -> boolean().
-t_is_reference(?identifier(?any)) -> false;
-t_is_reference(?identifier(Set)) -> set_is_singleton(?reference_qual, Set);
-t_is_reference(_) -> false.
+t_is_reference(Type) ->
+ t_is_reference(Type, 'universe').
+
+-spec t_is_reference(erl_type(), opaques()) -> boolean().
+
+t_is_reference(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_reference1/1).
+
+is_reference1(?identifier(?any)) -> false;
+is_reference1(?identifier(Set)) -> set_is_singleton(?reference_qual, Set);
+is_reference1(_) -> false.
%%-----------------------------------------------------------------------------
%% Numbers are divided into floats, integers, chars and bytes.
@@ -1138,21 +1371,39 @@ t_number(X) when is_integer(X) ->
-spec t_is_number(erl_type()) -> boolean().
-t_is_number(?number(_, _)) -> true;
-t_is_number(_) -> false.
+t_is_number(Type) ->
+ t_is_number(Type, 'universe').
+
+-spec t_is_number(erl_type(), opaques()) -> boolean().
+
+t_is_number(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_number/1).
+
+is_number(?number(_, _)) -> true;
+is_number(_) -> false.
%% Currently, the type system collapses all floats to ?float and does
%% not keep any information about their values. As a result, the list
%% that this function returns contains only integers.
+
-spec t_number_vals(erl_type()) -> 'unknown' | [integer(),...].
-t_number_vals(?int_set(?any)) -> unknown;
-t_number_vals(?int_set(Set)) -> set_to_list(Set);
-t_number_vals(?number(_, _)) -> unknown;
-t_number_vals(Other) ->
+t_number_vals(Type) ->
+ t_number_vals(Type, 'universe').
+
+-spec t_number_vals(erl_type(), opaques()) -> 'unknown' | [integer(),...].
+
+t_number_vals(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun number_vals/1).
+
+number_vals(?int_set(?any)) -> unknown;
+number_vals(?int_set(Set)) -> set_to_list(Set);
+number_vals(?number(_, _)) -> unknown;
+number_vals(?opaque(_)) -> unknown;
+number_vals(Other) ->
Inf = t_inf(Other, t_number()),
false = t_is_none(Inf), % sanity check
- t_number_vals(Inf).
+ number_vals(Inf).
%%------------------------------------
@@ -1163,8 +1414,16 @@ t_float() ->
-spec t_is_float(erl_type()) -> boolean().
-t_is_float(?float) -> true;
-t_is_float(_) -> false.
+t_is_float(Type) ->
+ t_is_float(Type, 'universe').
+
+-spec t_is_float(erl_type(), opaques()) -> boolean().
+
+t_is_float(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_float1/1).
+
+is_float1(?float) -> true;
+is_float1(_) -> false.
%%------------------------------------
@@ -1185,8 +1444,16 @@ t_integers(List) when is_list(List) ->
-spec t_is_integer(erl_type()) -> boolean().
-t_is_integer(?integer(_)) -> true;
-t_is_integer(_) -> false.
+t_is_integer(Type) ->
+ t_is_integer(Type, 'universe').
+
+-spec t_is_integer(erl_type(), opaques()) -> boolean().
+
+t_is_integer(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_integer1/1).
+
+is_integer1(?integer(_)) -> true;
+is_integer1(_) -> false.
%%------------------------------------
@@ -1250,7 +1517,7 @@ t_cons(Hd, ?nil) ->
t_cons(Hd, ?list(Contents, Termination, _)) ->
?nonempty_list(t_sup(Contents, Hd), Termination);
t_cons(Hd, Tail) ->
- case t_inf(Tail, t_maybe_improper_list()) of
+ case cons_tail(t_inf(Tail, t_maybe_improper_list())) of
?list(Contents, Termination, _Size) ->
%% Collapse the list part of the termination but keep the
%% non-list part intact.
@@ -1262,18 +1529,45 @@ t_cons(Hd, Tail) ->
?unit -> ?none
end.
+cons_tail(Type) ->
+ do_opaque(Type, 'universe', fun(T) -> T end).
+
-spec t_is_cons(erl_type()) -> boolean().
-t_is_cons(?nonempty_list(_, _)) -> true;
-t_is_cons(_) -> false.
+t_is_cons(Type) ->
+ t_is_cons(Type, 'universe').
+
+-spec t_is_cons(erl_type(), opaques()) -> boolean().
+
+t_is_cons(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_cons/1).
+
+is_cons(?nonempty_list(_, _)) -> true;
+is_cons(_) -> false.
-spec t_cons_hd(erl_type()) -> erl_type().
-t_cons_hd(?nonempty_list(Contents, _Termination)) -> Contents.
+t_cons_hd(Type) ->
+ t_cons_hd(Type, 'universe').
+
+-spec t_cons_hd(erl_type(), opaques()) -> erl_type().
+
+t_cons_hd(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun cons_hd/1).
+
+cons_hd(?nonempty_list(Contents, _Termination)) -> Contents.
-spec t_cons_tl(erl_type()) -> erl_type().
-t_cons_tl(?nonempty_list(_Contents, Termination) = T) ->
+t_cons_tl(Type) ->
+ t_cons_tl(Type, 'universe').
+
+-spec t_cons_tl(erl_type(), opaques()) -> erl_type().
+
+t_cons_tl(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun cons_tl/1).
+
+cons_tl(?nonempty_list(_Contents, Termination) = T) ->
t_sup(Termination, T).
-spec t_nil() -> erl_type().
@@ -1283,8 +1577,16 @@ t_nil() ->
-spec t_is_nil(erl_type()) -> boolean().
-t_is_nil(?nil) -> true;
-t_is_nil(_) -> false.
+t_is_nil(Type) ->
+ t_is_nil(Type, 'universe').
+
+-spec t_is_nil(erl_type(), opaques()) -> boolean().
+
+t_is_nil(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_nil/1).
+
+is_nil(?nil) -> true;
+is_nil(_) -> false.
-spec t_list() -> erl_type().
@@ -1300,8 +1602,16 @@ t_list(Contents) ->
-spec t_list_elements(erl_type()) -> erl_type().
-t_list_elements(?list(Contents, _, _)) -> Contents;
-t_list_elements(?nil) -> ?none.
+t_list_elements(Type) ->
+ t_list_elements(Type, 'universe').
+
+-spec t_list_elements(erl_type(), opaques()) -> erl_type().
+
+t_list_elements(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun list_elements/1).
+
+list_elements(?list(Contents, _, _)) -> Contents;
+list_elements(?nil) -> ?none.
-spec t_list_termination(erl_type()) -> erl_type().
@@ -1356,9 +1666,17 @@ t_maybe_improper_list(Content, Termination) ->
-spec t_is_maybe_improper_list(erl_type()) -> boolean().
-t_is_maybe_improper_list(?list(_, _, _)) -> true;
-t_is_maybe_improper_list(?nil) -> true;
-t_is_maybe_improper_list(_) -> false.
+t_is_maybe_improper_list(Type) ->
+ t_is_maybe_improper_list(Type, 'universe').
+
+-spec t_is_maybe_improper_list(erl_type(), opaques()) -> boolean().
+
+t_is_maybe_improper_list(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_maybe_improper_list/1).
+
+is_maybe_improper_list(?list(_, _, _)) -> true;
+is_maybe_improper_list(?nil) -> true;
+is_maybe_improper_list(_) -> false.
%% %% Should only be used if you know what you are doing. See t_cons/2
%% -spec t_improper_list(erl_type(), erl_type()) -> erl_type().
@@ -1405,32 +1723,77 @@ t_tuple(List) ->
-spec get_tuple_tags([erl_type()]) -> [erl_type(),...].
-get_tuple_tags([?atom(?any)|_]) -> [?any];
-get_tuple_tags([?atom(Set)|_]) ->
+get_tuple_tags([Tag|_]) ->
+ do_opaque(Tag, 'universe', fun tuple_tags/1);
+get_tuple_tags(_) -> [?any].
+
+tuple_tags(?atom(?any)) -> [?any];
+tuple_tags(?atom(Set)) ->
case set_size(Set) > ?TUPLE_TAG_LIMIT of
true -> [?any];
false -> [t_atom(A) || A <- set_to_list(Set)]
end;
-get_tuple_tags(_) -> [?any].
+tuple_tags(_) -> [?any].
%% to be used for a tuple with known types for its arguments (not ?any)
-spec t_tuple_args(erl_type()) -> [erl_type()].
-t_tuple_args(?tuple(Args, _, _)) when is_list(Args) -> Args.
+t_tuple_args(Type) ->
+ t_tuple_args(Type, 'universe').
+
+%% to be used for a tuple with known types for its arguments (not ?any)
+-spec t_tuple_args(erl_type(), opaques()) -> [erl_type()].
+
+t_tuple_args(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun tuple_args/1).
+
+tuple_args(?tuple(Args, _, _)) when is_list(Args) -> Args.
%% to be used for a tuple with a known size (not ?any)
-spec t_tuple_size(erl_type()) -> non_neg_integer().
-t_tuple_size(?tuple(_, Size, _)) when is_integer(Size) -> Size.
+t_tuple_size(Type) ->
+ t_tuple_size(Type, 'universe').
+
+%% to be used for a tuple with a known size (not ?any)
+-spec t_tuple_size(erl_type(), opaques()) -> non_neg_integer().
+
+t_tuple_size(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun tuple_size1/1).
+
+tuple_size1(?tuple(_, Size, _)) when is_integer(Size) -> Size.
-spec t_tuple_sizes(erl_type()) -> 'unknown' | [non_neg_integer(),...].
-t_tuple_sizes(?tuple(?any, ?any, ?any)) -> unknown;
-t_tuple_sizes(?tuple(_, Size, _)) when is_integer(Size) -> [Size];
-t_tuple_sizes(?tuple_set(List)) -> [Size || {Size, _} <- List].
+t_tuple_sizes(Type) ->
+ do_opaque(Type, 'universe', fun tuple_sizes/1).
+
+tuple_sizes(?tuple(?any, ?any, ?any)) -> unknown;
+tuple_sizes(?tuple(_, Size, _)) when is_integer(Size) -> [Size];
+tuple_sizes(?tuple_set(List)) -> [Size || {Size, _} <- List].
+
+-spec t_tuple_subtypes(erl_type(), opaques()) ->
+ 'unknown' | [erl_type(),...].
+
+t_tuple_subtypes(Type, Opaques) ->
+ Fun = fun(?tuple_set(List)) ->
+ t_tuple_subtypes_tuple_list(List, Opaques);
+ (?opaque(_)) -> unknown;
+ (T) -> t_tuple_subtypes(T)
+ end,
+ do_opaque(Type, Opaques, Fun).
+
+t_tuple_subtypes_tuple_list(List, Opaques) ->
+ lists:append([t_tuple_subtypes_list(Tuples, Opaques) ||
+ {_Size, Tuples} <- List]).
+
+t_tuple_subtypes_list(List, Opaques) ->
+ ListOfLists = [t_tuple_subtypes(E, Opaques) || E <- List, E =/= ?none],
+ lists:append([L || L <- ListOfLists, L =/= 'unknown']).
-spec t_tuple_subtypes(erl_type()) -> 'unknown' | [erl_type(),...].
+%% XXX. Not the same as t_tuple_subtypes(T, 'universe')...
t_tuple_subtypes(?tuple(?any, ?any, ?any)) -> unknown;
t_tuple_subtypes(?tuple(_, _, _) = T) -> [T];
t_tuple_subtypes(?tuple_set(List)) ->
@@ -1438,9 +1801,17 @@ t_tuple_subtypes(?tuple_set(List)) ->
-spec t_is_tuple(erl_type()) -> boolean().
-t_is_tuple(?tuple(_, _, _)) -> true;
-t_is_tuple(?tuple_set(_)) -> true;
-t_is_tuple(_) -> false.
+t_is_tuple(Type) ->
+ t_is_tuple(Type, 'universe').
+
+-spec t_is_tuple(erl_type(), opaques()) -> boolean().
+
+t_is_tuple(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun is_tuple1/1).
+
+is_tuple1(?tuple(_, _, _)) -> true;
+is_tuple1(?tuple_set(_)) -> true;
+is_tuple1(_) -> false.
%%-----------------------------------------------------------------------------
%% Non-primitive types, including some handy syntactic sugar types
@@ -1451,6 +1822,7 @@ t_is_tuple(_) -> false.
t_bitstrlist() ->
t_iolist(1, t_bitstr()).
+%% XXX. To be removed.
-spec t_constant() -> erl_type().
t_constant() ->
@@ -1555,7 +1927,8 @@ t_timeout() ->
t_array() ->
t_opaque(array, array, [],
t_tuple([t_atom('array'),
- t_non_neg_integer(), t_non_neg_integer(),
+ t_sup([t_atom('undefined'), t_non_neg_integer()]),
+ t_sup([t_atom('undefined'), t_non_neg_integer()]),
t_any(), t_any()])).
-spec t_dict() -> erl_type().
@@ -1566,7 +1939,8 @@ t_dict() ->
t_non_neg_integer(), t_non_neg_integer(),
t_non_neg_integer(), t_non_neg_integer(),
t_non_neg_integer(), t_non_neg_integer(),
- t_tuple(), t_tuple()])).
+ t_sup([t_atom('undefined'), t_tuple()]),
+ t_sup([t_atom('undefined'), t_tuple()])])).
-spec t_digraph() -> erl_type().
@@ -1601,7 +1975,9 @@ t_set() ->
t_opaque(sets, set, [],
t_tuple([t_atom('set'), t_non_neg_integer(), t_non_neg_integer(),
t_pos_integer(), t_non_neg_integer(), t_non_neg_integer(),
- t_non_neg_integer(), t_tuple(), t_tuple()])).
+ t_non_neg_integer(),
+ t_sup([t_atom('undefined'), t_tuple()]),
+ t_sup([t_atom('undefined'), t_tuple()])])).
-spec t_tid() -> erl_type().
@@ -1673,8 +2049,11 @@ t_has_var(?tuple(Elements, _, _)) ->
t_has_var_list(Elements);
t_has_var(?tuple_set(_) = T) ->
t_has_var_list(t_tuple_subtypes(T));
+%% t_has_var(?opaque(_)=T) ->
+%% %% "Polymorphic opaque types not supported yet"
+%% t_has_var(t_opaque_structure(T));
%% t_has_var(?union(_) = U) ->
-%% exit(lists:flatten(io_lib:format("Union happens in t_has_var/1 ~p\n",[U])));
+%% exit(flat_format("Union happens in t_has_var/1 ~p\n",[U]));
t_has_var(_) -> false.
-spec t_has_var_list([erl_type()]) -> boolean().
@@ -1705,6 +2084,9 @@ t_collect_vars(?tuple(Types, _, _), Acc) ->
t_collect_vars(?tuple_set(_) = TS, Acc) ->
lists:foldl(fun(T, TmpAcc) -> t_collect_vars(T, TmpAcc) end, Acc,
t_tuple_subtypes(TS));
+%% t_collect_vars(?opaque(_)=T, Acc) ->
+%% %% "Polymorphic opaque types not supported yet"
+%% t_collect_vars(t_opaque_structure(T), Acc);
t_collect_vars(_, Acc) ->
Acc.
@@ -1827,15 +2209,31 @@ t_is_bitwidth(_) -> false.
-spec number_min(erl_type()) -> rng_elem().
-number_min(?int_range(From, _)) -> From;
-number_min(?int_set(Set)) -> set_min(Set);
-number_min(?number(?any, _Tag)) -> neg_inf.
+number_min(Type) ->
+ number_min(Type, 'universe').
+
+-spec number_min(erl_type(), opaques()) -> rng_elem().
+
+number_min(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun number_min2/1).
+
+number_min2(?int_range(From, _)) -> From;
+number_min2(?int_set(Set)) -> set_min(Set);
+number_min2(?number(?any, _Tag)) -> neg_inf.
-spec number_max(erl_type()) -> rng_elem().
-number_max(?int_range(_, To)) -> To;
-number_max(?int_set(Set)) -> set_max(Set);
-number_max(?number(?any, _Tag)) -> pos_inf.
+number_max(Type) ->
+ number_max(Type, 'universe').
+
+-spec number_max(erl_type(), opaques()) -> rng_elem().
+
+number_max(Type, Opaques) ->
+ do_opaque(Type, Opaques, fun number_max2/1).
+
+number_max2(?int_range(_, To)) -> To;
+number_max2(?int_set(Set)) -> set_max(Set);
+number_max2(?number(?any, _Tag)) -> pos_inf.
%% -spec int_range(rgn_elem(), rng_elem()) -> erl_type().
%%
@@ -1917,7 +2315,7 @@ t_sup(?function(Domain1, Range1), ?function(Domain2, Range2)) ->
t_sup(?identifier(Set1), ?identifier(Set2)) ->
?identifier(set_union(Set1, Set2));
t_sup(?opaque(Set1), ?opaque(Set2)) ->
- ?opaque(set_union_no_limit(Set1, Set2));
+ sup_opaque(set_to_list(ordsets:union(Set1, Set2)));
%%Disallow unions with opaque types
%%t_sup(T1=?opaque(_,_,_), T2) ->
%% io:format("Debug: t_sup executed with args ~w and ~w~n",[T1, T2]), ?none;
@@ -2005,6 +2403,27 @@ t_sup(T1, T2) ->
?union(U2) = force_union(T2),
sup_union(U1, U2).
+sup_opaque([]) -> ?none;
+sup_opaque(List) ->
+ L = sup_opaq(List),
+ ?opaque(ordsets:from_list(L)).
+
+sup_opaq(L0) ->
+ L1 = [{{Mod,Name}, T} ||
+ #opaque{mod = Mod, name = Name}=T <- L0],
+ F = family(L1),
+ [supl(Ts) || {_, Ts} <- F].
+
+supl([O]) -> O;
+supl(Ts) -> supl(Ts, t_none()).
+
+supl([#opaque{struct = S}=O|L], S0) ->
+ S1 = t_sup(S, S0),
+ case L =:= [] of
+ true -> O#opaque{struct = S1};
+ false -> supl(L, S1)
+ end.
+
-spec t_sup_lists([erl_type()], [erl_type()]) -> [erl_type()].
t_sup_lists([T1|Left1], [T2|Left2]) ->
@@ -2132,19 +2551,26 @@ t_elements(?number(_, _) = T) ->
?int_set(Set) ->
[t_integer(I) || I <- Set]
end;
-t_elements(?opaque(_) = T) -> [T];
+t_elements(?opaque(_) = T) ->
+ do_elements(T);
t_elements(?tuple(_, _, _) = T) -> [T];
t_elements(?tuple_set(_) = TS) ->
case t_tuple_subtypes(TS) of
unknown -> [];
Elems -> Elems
end;
-t_elements(?union(List)) ->
- lists:append([t_elements(T) || T <- List]);
+t_elements(?union(_) = T) ->
+ do_elements(T);
t_elements(?var(_)) -> [?any]. %% yes, vars exist -- what else to do here?
%% t_elements(T) ->
%% io:format("T_ELEMENTS => ~p\n", [T]).
+do_elements(Type0) ->
+ case do_opaque(Type0, 'universe', fun(T) -> T end) of
+ ?union(List) -> lists:append([t_elements(T) || T <- List]);
+ Type -> t_elements(Type)
+ end.
+
%%-----------------------------------------------------------------------------
%% Infimum
%%
@@ -2162,74 +2588,77 @@ t_inf([]) -> ?none.
-spec t_inf(erl_type(), erl_type()) -> erl_type().
t_inf(T1, T2) ->
- t_inf(T1, T2, structured).
-
--type t_inf_mode() :: 'opaque' | 'structured'.
--spec t_inf(erl_type(), erl_type(), t_inf_mode()) -> erl_type().
-
-t_inf(?var(_), ?var(_), _Mode) -> ?any;
-t_inf(?var(_), T, _Mode) -> subst_all_vars_to_any(T);
-t_inf(T, ?var(_), _Mode) -> subst_all_vars_to_any(T);
-t_inf(?any, T, _Mode) -> subst_all_vars_to_any(T);
-t_inf(T, ?any, _Mode) -> subst_all_vars_to_any(T);
-t_inf(?none, _, _Mode) -> ?none;
-t_inf(_, ?none, _Mode) -> ?none;
-t_inf(?unit, _, _Mode) -> ?unit; % ?unit cases should appear below ?none
-t_inf(_, ?unit, _Mode) -> ?unit;
-t_inf(T, T, _Mode) -> subst_all_vars_to_any(T);
+ t_inf(T1, T2, 'universe').
+
+%% 'match' should be used from t_find_unknown_opaque() only
+-type t_inf_opaques() :: 'universe'
+ | [erl_type()] | {'match', [erl_type() | 'universe']}.
+
+-spec t_inf(erl_type(), erl_type(), t_inf_opaques()) -> erl_type().
+
+t_inf(?var(_), ?var(_), _Opaques) -> ?any;
+t_inf(?var(_), T, _Opaques) -> subst_all_vars_to_any(T);
+t_inf(T, ?var(_), _Opaques) -> subst_all_vars_to_any(T);
+t_inf(?any, T, _Opaques) -> subst_all_vars_to_any(T);
+t_inf(T, ?any, _Opaques) -> subst_all_vars_to_any(T);
+t_inf(?none, _, _Opaques) -> ?none;
+t_inf(_, ?none, _Opaques) -> ?none;
+t_inf(?unit, _, _Opaques) -> ?unit; % ?unit cases should appear below ?none
+t_inf(_, ?unit, _Opaques) -> ?unit;
+t_inf(T, T, _Opaques) -> subst_all_vars_to_any(T);
t_inf(?atom(Set1), ?atom(Set2), _) ->
case set_intersection(Set1, Set2) of
?none -> ?none;
NewSet -> ?atom(NewSet)
end;
-t_inf(?bitstr(U1, B1), ?bitstr(0, B2), _Mode) ->
+t_inf(?bitstr(U1, B1), ?bitstr(0, B2), _Opaques) ->
if B2 >= B1 andalso (B2-B1) rem U1 =:= 0 -> t_bitstr(0, B2);
true -> ?none
end;
-t_inf(?bitstr(0, B1), ?bitstr(U2, B2), _Mode) ->
+t_inf(?bitstr(0, B1), ?bitstr(U2, B2), _Opaques) ->
if B1 >= B2 andalso (B1-B2) rem U2 =:= 0 -> t_bitstr(0, B1);
true -> ?none
end;
-t_inf(?bitstr(U1, B1), ?bitstr(U1, B1), _Mode) ->
+t_inf(?bitstr(U1, B1), ?bitstr(U1, B1), _Opaques) ->
t_bitstr(U1, B1);
-t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Mode) when U2 > U1 ->
+t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Opaques) when U2 > U1 ->
inf_bitstr(U2, B2, U1, B1);
-t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Mode) ->
+t_inf(?bitstr(U1, B1), ?bitstr(U2, B2), _Opaques) ->
inf_bitstr(U1, B1, U2, B2);
-t_inf(?function(Domain1, Range1), ?function(Domain2, Range2), Mode) ->
- case t_inf(Domain1, Domain2, Mode) of
+t_inf(?function(Domain1, Range1), ?function(Domain2, Range2), Opaques) ->
+ case t_inf(Domain1, Domain2, Opaques) of
?none -> ?none;
- Domain -> ?function(Domain, t_inf(Range1, Range2, Mode))
+ Domain -> ?function(Domain, t_inf(Range1, Range2, Opaques))
end;
-t_inf(?identifier(Set1), ?identifier(Set2), _Mode) ->
+t_inf(?identifier(Set1), ?identifier(Set2), _Opaques) ->
case set_intersection(Set1, Set2) of
?none -> ?none;
Set -> ?identifier(Set)
end;
-t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Mode) ->
+t_inf(?matchstate(Pres1, Slots1), ?matchstate(Pres2, Slots2), _Opaques) ->
?matchstate(t_inf(Pres1, Pres2), t_inf(Slots1, Slots2));
-t_inf(?nil, ?nil, _Mode) -> ?nil;
-t_inf(?nil, ?nonempty_list(_, _), _Mode) ->
+t_inf(?nil, ?nil, _Opaques) -> ?nil;
+t_inf(?nil, ?nonempty_list(_, _), _Opaques) ->
?none;
-t_inf(?nonempty_list(_, _), ?nil, _Mode) ->
+t_inf(?nonempty_list(_, _), ?nil, _Opaques) ->
?none;
-t_inf(?nil, ?list(_Contents, Termination, _), Mode) ->
- t_inf(?nil, Termination, Mode);
-t_inf(?list(_Contents, Termination, _), ?nil, Mode) ->
- t_inf(?nil, Termination, Mode);
+t_inf(?nil, ?list(_Contents, Termination, _), Opaques) ->
+ t_inf(?nil, t_unopaque(Termination), Opaques);
+t_inf(?list(_Contents, Termination, _), ?nil, Opaques) ->
+ t_inf(?nil, t_unopaque(Termination), Opaques);
t_inf(?list(Contents1, Termination1, Size1),
- ?list(Contents2, Termination2, Size2), Mode) ->
- case t_inf(Termination1, Termination2, Mode) of
+ ?list(Contents2, Termination2, Size2), Opaques) ->
+ case t_inf(Termination1, Termination2, Opaques) of
?none -> ?none;
Termination ->
- case t_inf(Contents1, Contents2, Mode) of
- ?none ->
+ case t_inf(Contents1, Contents2, Opaques) of
+ ?none ->
%% If none of the lists are nonempty, then the infimum is nil.
case (Size1 =:= ?unknown_qual) andalso (Size2 =:= ?unknown_qual) of
true -> t_nil();
false -> ?none
end;
- Contents ->
+ Contents ->
Size =
case {Size1, Size2} of
{?unknown_qual, ?unknown_qual} -> ?unknown_qual;
@@ -2240,7 +2669,7 @@ t_inf(?list(Contents1, Termination1, Size1),
?list(Contents, Termination, Size)
end
end;
-t_inf(?number(_, _) = T1, ?number(_, _) = T2, _Mode) ->
+t_inf(?number(_, _) = T1, ?number(_, _) = T2, _Opaques) ->
case {T1, T2} of
{T, T} -> T;
{_, ?number(?any, ?unknown_qual)} -> T1;
@@ -2249,16 +2678,16 @@ t_inf(?number(_, _) = T1, ?number(_, _) = T2, _Mode) ->
{?integer(_), ?float} -> ?none;
{?integer(?any), ?integer(_)} -> T2;
{?integer(_), ?integer(?any)} -> T1;
- {?int_set(Set1), ?int_set(Set2)} ->
+ {?int_set(Set1), ?int_set(Set2)} ->
case set_intersection(Set1, Set2) of
?none -> ?none;
Set -> ?int_set(Set)
end;
- {?int_range(From1, To1), ?int_range(From2, To2)} ->
+ {?int_range(From1, To1), ?int_range(From2, To2)} ->
t_from_range(max(From1, From2), min(To1, To2));
{Range = ?int_range(_, _), ?int_set(Set)} ->
%% io:format("t_inf range, set args ~p ~p ~n", [T1, T2]),
- Ans2 =
+ Ans2 =
case set_filter(fun(X) -> in_range(X, Range) end, Set) of
?none -> ?none;
NewSet -> ?int_set(NewSet)
@@ -2271,193 +2700,253 @@ t_inf(?number(_, _) = T1, ?number(_, _) = T2, _Mode) ->
NewSet -> ?int_set(NewSet)
end
end;
-t_inf(?product(Types1), ?product(Types2), Mode) ->
+t_inf(?product(Types1), ?product(Types2), Opaques) ->
L1 = length(Types1),
L2 = length(Types2),
- if L1 =:= L2 -> ?product(t_inf_lists(Types1, Types2, Mode));
+ if L1 =:= L2 -> ?product(t_inf_lists(Types1, Types2, Opaques));
true -> ?none
end;
-t_inf(?product(_), _, _Mode) ->
+t_inf(?product(_), _, _Opaques) ->
?none;
-t_inf(_, ?product(_), _Mode) ->
+t_inf(_, ?product(_), _Opaques) ->
?none;
-t_inf(?tuple(?any, ?any, ?any), ?tuple(_, _, _) = T, _Mode) ->
+t_inf(?tuple(?any, ?any, ?any), ?tuple(_, _, _) = T, _Opaques) ->
subst_all_vars_to_any(T);
-t_inf(?tuple(_, _, _) = T, ?tuple(?any, ?any, ?any), _Mode) ->
+t_inf(?tuple(_, _, _) = T, ?tuple(?any, ?any, ?any), _Opaques) ->
subst_all_vars_to_any(T);
-t_inf(?tuple(?any, ?any, ?any), ?tuple_set(_) = T, _Mode) ->
+t_inf(?tuple(?any, ?any, ?any), ?tuple_set(_) = T, _Opaques) ->
subst_all_vars_to_any(T);
-t_inf(?tuple_set(_) = T, ?tuple(?any, ?any, ?any), _Mode) ->
+t_inf(?tuple_set(_) = T, ?tuple(?any, ?any, ?any), _Opaques) ->
subst_all_vars_to_any(T);
-t_inf(?tuple(Elements1, Arity, _Tag1), ?tuple(Elements2, Arity, _Tag2), Mode) ->
- case t_inf_lists_strict(Elements1, Elements2, Mode) of
+t_inf(?tuple(Elements1, Arity, _Tag1), ?tuple(Elements2, Arity, _Tag2), Opaques) ->
+ case t_inf_lists_strict(Elements1, Elements2, Opaques) of
bottom -> ?none;
NewElements -> t_tuple(NewElements)
end;
-t_inf(?tuple_set(List1), ?tuple_set(List2), Mode) ->
- inf_tuple_sets(List1, List2, Mode);
-t_inf(?tuple_set(List), ?tuple(_, Arity, _) = T, Mode) ->
- inf_tuple_sets(List, [{Arity, [T]}], Mode);
-t_inf(?tuple(_, Arity, _) = T, ?tuple_set(List), Mode) ->
- inf_tuple_sets(List, [{Arity, [T]}], Mode);
+t_inf(?tuple_set(List1), ?tuple_set(List2), Opaques) ->
+ inf_tuple_sets(List1, List2, Opaques);
+t_inf(?tuple_set(List), ?tuple(_, Arity, _) = T, Opaques) ->
+ inf_tuple_sets(List, [{Arity, [T]}], Opaques);
+t_inf(?tuple(_, Arity, _) = T, ?tuple_set(List), Opaques) ->
+ inf_tuple_sets(List, [{Arity, [T]}], Opaques);
%% be careful: here and in the next clause T can be ?opaque
-t_inf(?union(U1), T, Mode) ->
+t_inf(?union(U1), T, Opaques) ->
?union(U2) = force_union(T),
- inf_union(U1, U2, Mode);
-t_inf(T, ?union(U2), Mode) ->
+ inf_union(U1, U2, Opaques);
+t_inf(T, ?union(U2), Opaques) ->
?union(U1) = force_union(T),
- inf_union(U1, U2, Mode);
+ inf_union(U1, U2, Opaques);
+t_inf(?opaque(Set1), ?opaque(Set2), Opaques) ->
+ inf_opaque(Set1, Set2, Opaques);
+t_inf(?opaque(_) = T1, T2, Opaques) ->
+ inf_opaque1(T2, T1, 1, Opaques);
+t_inf(T1, ?opaque(_) = T2, Opaques) ->
+ inf_opaque1(T1, T2, 2, Opaques);
%% and as a result, the cases for ?opaque should appear *after* ?union
-t_inf(?opaque(Set1) = T1, ?opaque(Set2) = T2, Mode) ->
- case set_intersection(Set1, Set2) of
- ?none ->
- case Mode =:= opaque of
- true ->
- Struct1 = t_opaque_structure(T1),
- case t_inf(Struct1, T2) of
- ?none ->
- Struct2 = t_opaque_structure(T2),
- case t_inf(Struct2, T1) of
- ?none -> ?none;
- _ -> T2
- end;
- _ -> T1
- end;
- false -> ?none
- end;
- NewSet -> ?opaque(NewSet)
- end;
-t_inf(?opaque(_) = T1, T2, opaque) ->
- case t_inf(t_opaque_structure(T1), T2, structured) of
- ?none -> ?none;
- _Type -> T1
- end;
-t_inf(T1, ?opaque(_) = T2, opaque) ->
- case t_inf(T1, t_opaque_structure(T2), structured) of
- ?none -> ?none;
- _Type -> T2
- end;
t_inf(#c{}, #c{}, _) ->
?none.
+inf_opaque1(T1, ?opaque(Set2)=T2, Pos, Opaques) ->
+ case Opaques =:= 'universe' orelse inf_is_opaque_type(T2, Pos, Opaques) of
+ false -> ?none;
+ true ->
+ List2 = set_to_list(Set2),
+ case inf_collect(T1, List2, Opaques, []) of
+ [] -> ?none;
+ OpL -> ?opaque(ordsets:from_list(OpL))
+ end
+ end.
+
+inf_is_opaque_type(T, Pos, {match, Opaques}) ->
+ is_opaque_type(T, Opaques) orelse throw(Pos);
+inf_is_opaque_type(T, _Pos, Opaques) ->
+ is_opaque_type(T, Opaques).
+
+inf_collect(T1, [T2|List2], Opaques, OpL) ->
+ #opaque{struct = S2} = T2,
+ case t_inf(T1, S2, Opaques) of
+ ?none -> inf_collect(T1, List2, Opaques, OpL);
+ Inf ->
+ Op = T2#opaque{struct = Inf},
+ inf_collect(T1, List2, Opaques, [Op|OpL])
+ end;
+inf_collect(_T1, [], _Opaques, OpL) ->
+ OpL.
+
+combine(S, T1, T2) ->
+ #opaque{mod = Mod1, name = Name1} = T1,
+ #opaque{mod = Mod2, name = Name2} = T2,
+ case {Mod1, Name1} =:= {Mod2, Name2} of
+ true -> [comb(Mod1, Name1, S, T1)];
+ false -> [comb(Mod1, Name1, S, T1), comb(Mod2, Name2, S, T2)]
+ end.
+
+comb(Mod, Name, S, T) ->
+ case is_same_name(Mod, Name, S) of
+ true -> S;
+ false -> T#opaque{struct = S}
+ end.
+
+is_same_name(Mod, Name, ?opaque([#opaque{mod = Mod, name = Name}])) -> true;
+is_same_name(_Mod, _Name, _Opaque) -> false.
+
+%% Combining two lists this way can be very time consuming...
+inf_opaque(Set1, Set2, Opaques) ->
+ List1 = inf_look_up(Set1, 1, Opaques),
+ List2 = inf_look_up(Set2, 2, Opaques),
+ List0 = [combine(Inf, T1, T2) ||
+ {Is1, ModName1, T1} <- List1,
+ {Is2, ModName2, T2} <- List2,
+ not t_is_none(Inf = inf_opaque_types(Is1, ModName1, T1,
+ Is2, ModName2, T2,
+ Opaques))],
+ List = lists:sort(lists:append(List0)),
+ sup_opaque(List).
+
+%% Optimization: do just one lookup.
+inf_look_up(Set, Pos, Opaques) ->
+ [{Opaques =:= 'universe' orelse inf_is_opaque_type2(T, Pos, Opaques),
+ {M, N}, T} ||
+ #opaque{mod = M, name = N} = T <- set_to_list(Set)].
+
+inf_is_opaque_type2(T, Pos, {match, Opaques}) ->
+ is_opaque_type2(T, Opaques) orelse throw(Pos);
+inf_is_opaque_type2(T, _Pos, Opaques) ->
+ is_opaque_type2(T, Opaques).
+
+inf_opaque_types(IsOpaque1, ModName1, T1, IsOpaque2, ModName2, T2, Opaques) ->
+ #opaque{struct = S1}=T1,
+ #opaque{struct = S2}=T2,
+ case Opaques =:= 'universe' orelse ModName1 =:= ModName2 of
+ true -> t_inf(S1, S2, Opaques);
+ false ->
+ case {IsOpaque1, IsOpaque2} of
+ {true, true} -> t_inf(S1, S2, Opaques);
+ {true, false} -> t_inf(S1, ?opaque(set_singleton(T2)), Opaques);
+ {false, true} -> t_inf(?opaque(set_singleton(T1)), S2, Opaques);
+ {false, false} -> t_none()
+ end
+ end.
+
-spec t_inf_lists([erl_type()], [erl_type()]) -> [erl_type()].
t_inf_lists(L1, L2) ->
- t_inf_lists(L1, L2, structured).
+ t_inf_lists(L1, L2, 'universe').
--spec t_inf_lists([erl_type()], [erl_type()], t_inf_mode()) -> [erl_type()].
+-spec t_inf_lists([erl_type()], [erl_type()], t_inf_opaques()) -> [erl_type()].
-t_inf_lists(L1, L2, Mode) ->
- t_inf_lists(L1, L2, [], Mode).
+t_inf_lists(L1, L2, Opaques) ->
+ t_inf_lists(L1, L2, [], Opaques).
--spec t_inf_lists([erl_type()], [erl_type()], [erl_type()], t_inf_mode()) -> [erl_type()].
+-spec t_inf_lists([erl_type()], [erl_type()], [erl_type()], [erl_type()]) -> [erl_type()].
-t_inf_lists([T1|Left1], [T2|Left2], Acc, Mode) ->
- t_inf_lists(Left1, Left2, [t_inf(T1, T2, Mode)|Acc], Mode);
-t_inf_lists([], [], Acc, _Mode) ->
+t_inf_lists([T1|Left1], [T2|Left2], Acc, Opaques) ->
+ t_inf_lists(Left1, Left2, [t_inf(T1, T2, Opaques)|Acc], Opaques);
+t_inf_lists([], [], Acc, _Opaques) ->
lists:reverse(Acc).
%% Infimum of lists with strictness.
%% If any element is the ?none type, the value 'bottom' is returned.
--spec t_inf_lists_strict([erl_type()], [erl_type()], t_inf_mode()) -> 'bottom' | [erl_type()].
+-spec t_inf_lists_strict([erl_type()], [erl_type()], [erl_type()]) -> 'bottom' | [erl_type()].
-t_inf_lists_strict(L1, L2, Mode) ->
- t_inf_lists_strict(L1, L2, [], Mode).
+t_inf_lists_strict(L1, L2, Opaques) ->
+ t_inf_lists_strict(L1, L2, [], Opaques).
--spec t_inf_lists_strict([erl_type()], [erl_type()], [erl_type()], t_inf_mode()) -> 'bottom' | [erl_type()].
+-spec t_inf_lists_strict([erl_type()], [erl_type()], [erl_type()], [erl_type()]) -> 'bottom' | [erl_type()].
-t_inf_lists_strict([T1|Left1], [T2|Left2], Acc, Mode) ->
- case t_inf(T1, T2, Mode) of
+t_inf_lists_strict([T1|Left1], [T2|Left2], Acc, Opaques) ->
+ case t_inf(T1, T2, Opaques) of
?none -> bottom;
- T -> t_inf_lists_strict(Left1, Left2, [T|Acc], Mode)
+ T -> t_inf_lists_strict(Left1, Left2, [T|Acc], Opaques)
end;
-t_inf_lists_strict([], [], Acc, _Mode) ->
+t_inf_lists_strict([], [], Acc, _Opaques) ->
lists:reverse(Acc).
--spec t_inf_lists_masked([erl_type()], [erl_type()], [t_inf_mode()]) -> [erl_type()].
-
-t_inf_lists_masked(List1, List2, Mask) ->
- List = lists:zip3(List1, List2, Mask),
- [t_inf(T1, T2, Mode) || {T1, T2, Mode} <- List].
-
-inf_tuple_sets(L1, L2, Mode) ->
- case inf_tuple_sets(L1, L2, [], Mode) of
+inf_tuple_sets(L1, L2, Opaques) ->
+ case inf_tuple_sets(L1, L2, [], Opaques) of
[] -> ?none;
[{_Arity, [?tuple(_, _, _) = OneTuple]}] -> OneTuple;
List -> ?tuple_set(List)
end.
-inf_tuple_sets([{Arity, Tuples1}|Ts1], [{Arity, Tuples2}|Ts2], Acc, Mode) ->
- case inf_tuples_in_sets(Tuples1, Tuples2, Mode) of
- [] -> inf_tuple_sets(Ts1, Ts2, Acc, Mode);
+inf_tuple_sets([{Arity, Tuples1}|Ts1], [{Arity, Tuples2}|Ts2], Acc, Opaques) ->
+ case inf_tuples_in_sets(Tuples1, Tuples2, Opaques) of
+ [] -> inf_tuple_sets(Ts1, Ts2, Acc, Opaques);
[?tuple_set([{Arity, NewTuples}])] ->
- inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Mode);
- NewTuples -> inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Mode)
+ inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Opaques);
+ NewTuples -> inf_tuple_sets(Ts1, Ts2, [{Arity, NewTuples}|Acc], Opaques)
end;
-inf_tuple_sets([{Arity1, _}|Ts1] = L1, [{Arity2, _}|Ts2] = L2, Acc, Mode) ->
- if Arity1 < Arity2 -> inf_tuple_sets(Ts1, L2, Acc, Mode);
- Arity1 > Arity2 -> inf_tuple_sets(L1, Ts2, Acc, Mode)
+inf_tuple_sets([{Arity1, _}|Ts1] = L1, [{Arity2, _}|Ts2] = L2, Acc, Opaques) ->
+ if Arity1 < Arity2 -> inf_tuple_sets(Ts1, L2, Acc, Opaques);
+ Arity1 > Arity2 -> inf_tuple_sets(L1, Ts2, Acc, Opaques)
end;
-inf_tuple_sets([], _, Acc, _Mode) -> lists:reverse(Acc);
-inf_tuple_sets(_, [], Acc, _Mode) -> lists:reverse(Acc).
-
-inf_tuples_in_sets([?tuple(Elements1, _, ?any)], L2, Mode) ->
- NewList = [t_inf_lists_strict(Elements1, Elements2, Mode)
+inf_tuple_sets([], _, Acc, _Opaques) -> lists:reverse(Acc);
+inf_tuple_sets(_, [], Acc, _Opaques) -> lists:reverse(Acc).
+
+inf_tuples_in_sets([?tuple(Elements1, _, ?any)], L2, Opaques) ->
+ NewList = [t_inf_lists_strict(Elements1, Elements2, Opaques)
|| ?tuple(Elements2, _, _) <- L2],
[t_tuple(Es) || Es <- NewList, Es =/= bottom];
-inf_tuples_in_sets(L1, [?tuple(Elements2, _, ?any)], Mode) ->
- NewList = [t_inf_lists_strict(Elements1, Elements2, Mode)
+inf_tuples_in_sets(L1, [?tuple(Elements2, _, ?any)], Opaques) ->
+ NewList = [t_inf_lists_strict(Elements1, Elements2, Opaques)
|| ?tuple(Elements1, _, _) <- L1],
[t_tuple(Es) || Es <- NewList, Es =/= bottom];
-inf_tuples_in_sets(L1, L2, Mode) ->
- inf_tuples_in_sets(L1, L2, [], Mode).
+inf_tuples_in_sets(L1, L2, Opaques) ->
+ inf_tuples_in_sets2(L1, L2, [], Opaques).
-inf_tuples_in_sets([?tuple(Elements1, Arity, Tag)|Ts1],
- [?tuple(Elements2, Arity, Tag)|Ts2], Acc, Mode) ->
- case t_inf_lists_strict(Elements1, Elements2, Mode) of
- bottom -> inf_tuples_in_sets(Ts1, Ts2, Acc, Mode);
+inf_tuples_in_sets2([?tuple(Elements1, Arity, Tag)|Ts1],
+ [?tuple(Elements2, Arity, Tag)|Ts2], Acc, Opaques) ->
+ case t_inf_lists_strict(Elements1, Elements2, Opaques) of
+ bottom -> inf_tuples_in_sets2(Ts1, Ts2, Acc, Opaques);
NewElements ->
- inf_tuples_in_sets(Ts1, Ts2, [?tuple(NewElements, Arity, Tag)|Acc], Mode)
+ inf_tuples_in_sets2(Ts1, Ts2, [?tuple(NewElements, Arity, Tag)|Acc],
+ Opaques)
+ end;
+inf_tuples_in_sets2([?tuple(_, _, Tag1)|Ts1] = L1,
+ [?tuple(_, _, Tag2)|Ts2] = L2, Acc, Opaques) ->
+ if Tag1 < Tag2 -> inf_tuples_in_sets2(Ts1, L2, Acc, Opaques);
+ Tag1 > Tag2 -> inf_tuples_in_sets2(L1, Ts2, Acc, Opaques)
end;
-inf_tuples_in_sets([?tuple(_, _, Tag1)|Ts1] = L1,
- [?tuple(_, _, Tag2)|Ts2] = L2, Acc, Mode) ->
- if Tag1 < Tag2 -> inf_tuples_in_sets(Ts1, L2, Acc, Mode);
- Tag1 > Tag2 -> inf_tuples_in_sets(L1, Ts2, Acc, Mode)
+inf_tuples_in_sets2([], _, Acc, _Opaques) -> lists:reverse(Acc);
+inf_tuples_in_sets2(_, [], Acc, _Opaques) -> lists:reverse(Acc).
+
+inf_union(U1, U2, Opaques) ->
+ OpaqueFun =
+ fun(Union1, Union2, InfFun) ->
+ [_,_,_,_,_,_,_,_,Opaque,_] = Union1,
+ [A,B,F,I,L,N,T,M,_,_R] = Union2,
+ List = [A,B,F,I,L,N,T,M],
+ inf_union_collect(List, Opaque, InfFun, [], [])
+ end,
+ O1 = OpaqueFun(U1, U2, fun(E, Opaque) -> t_inf(Opaque, E, Opaques) end),
+ O2 = OpaqueFun(U2, U1, fun(E, Opaque) -> t_inf(E, Opaque, Opaques) end),
+ Union = inf_union(U1, U2, 0, [], Opaques),
+ t_sup([O1, O2, Union]).
+
+inf_union_collect([], _Opaque, _InfFun, InfList, ThrowList) ->
+ case t_sup(InfList) of
+ ?none when ThrowList =/= [] -> throw(hd(lists:flatten(ThrowList)));
+ Sup -> Sup
end;
-inf_tuples_in_sets([], _, Acc, _Mode) -> lists:reverse(Acc);
-inf_tuples_in_sets(_, [], Acc, _Mode) -> lists:reverse(Acc).
-
-inf_union(U1, U2, opaque) ->
-%%---------------------------------------------------------------------
-%% Under Testing
-%%----------------------------------------------------------------------
-%% OpaqueFun =
-%% fun(Union1, Union2) ->
-%% [_,_,_,_,_,_,_,_,Opaque,_] = Union1,
-%% [A,B,F,I,L,N,T,M,_,_R] = Union2,
-%% List = [A,B,F,I,L,N,T,M],
-%% case [T || T <- List, t_inf(T, Opaque, opaque) =/= ?none] of
-%% [] -> ?none;
-%% _ -> Opaque
-%% end
-%% end,
-%% O1 = OpaqueFun(U1, U2),
-%% O2 = OpaqueFun(U2, U1),
-%% Union = inf_union(U1, U2, 0, [], opaque),
-%% t_sup([O1, O2, Union]);
- inf_union(U1, U2, 0, [], opaque);
-inf_union(U1, U2, OtherMode) ->
- inf_union(U1, U2, 0, [], OtherMode).
-
-inf_union([?none|Left1], [?none|Left2], N, Acc, Mode) ->
- inf_union(Left1, Left2, N, [?none|Acc], Mode);
-inf_union([T1|Left1], [T2|Left2], N, Acc, Mode) ->
- case t_inf(T1, T2, Mode) of
- ?none -> inf_union(Left1, Left2, N, [?none|Acc], Mode);
- T -> inf_union(Left1, Left2, N+1, [T|Acc], Mode)
+inf_union_collect([?none|L], Opaque, InfFun, InfList, ThrowList) ->
+ inf_union_collect(L, Opaque, InfFun, [?none|InfList], ThrowList);
+inf_union_collect([E|L], Opaque, InfFun, InfList, ThrowList) ->
+ try InfFun(E, Opaque)of
+ Inf ->
+ inf_union_collect(L, Opaque, InfFun, [Inf|InfList], ThrowList)
+ catch throw:N when is_integer(N) ->
+ inf_union_collect(L, Opaque, InfFun, InfList, [N|ThrowList])
+ end.
+
+inf_union([?none|Left1], [?none|Left2], N, Acc, Opaques) ->
+ inf_union(Left1, Left2, N, [?none|Acc], Opaques);
+inf_union([T1|Left1], [T2|Left2], N, Acc, Opaques) ->
+ case t_inf(T1, T2, Opaques) of
+ ?none -> inf_union(Left1, Left2, N, [?none|Acc], Opaques);
+ T -> inf_union(Left1, Left2, N+1, [T|Acc], Opaques)
end;
-inf_union([], [], N, Acc, _Mode) ->
+inf_union([], [], N, Acc, _Opaques) ->
if N =:= 0 -> ?none;
N =:= 1 ->
[Type] = [T || T <- Acc, T =/= ?none],
@@ -2536,6 +3025,11 @@ t_subst_dict(?tuple(Elements, _Arity, _Tag), Dict) ->
t_tuple([t_subst_dict(E, Dict) || E <- Elements]);
t_subst_dict(?tuple_set(_) = TS, Dict) ->
t_sup([t_subst_dict(T, Dict) || T <- t_tuple_subtypes(TS)]);
+%% t_subst_dict(?opaque(Es), Dict) ->
+%% %% "Polymorphic opaque types not supported yet"
+%% List = [Opaque#opaque{struct = t_subst_dict(S, Dict)} ||
+%% Opaque = #opaque{struct = S} <- set_to_list(Es)],
+%% ?opaque(ordsets:from_list(List));
t_subst_dict(T, _Dict) ->
T.
@@ -2578,6 +3072,11 @@ t_subst_aux(?tuple(Elements, _Arity, _Tag), VarMap) ->
t_tuple([t_subst_aux(E, VarMap) || E <- Elements]);
t_subst_aux(?tuple_set(_) = TS, VarMap) ->
t_sup([t_subst_aux(T, VarMap) || T <- t_tuple_subtypes(TS)]);
+%% t_subst_aux(?opaque(Es), VarMap) ->
+%% %% "Polymorphic opaque types not supported yet"
+%% List = [Opaque#opaque{struct = t_subst_aux(S, VarMap)} ||
+%% Opaque = #opaque{struct = S} <- set_to_list(Es)],
+%% ?opaque(ordsets:from_list(List));
t_subst_aux(T, _VarMap) ->
T.
@@ -2590,112 +3089,147 @@ t_subst_aux(T, _VarMap) ->
-spec t_unify(erl_type(), erl_type()) -> t_unify_ret().
t_unify(T1, T2) ->
- t_unify(T1, T2, []).
-
--spec t_unify(erl_type(), erl_type(), [erl_type()]) -> t_unify_ret().
-
-t_unify(T1, T2, Opaques) ->
- {T, VarMap} = t_unify(T1, T2, [], Opaques),
+ {T, VarMap} = t_unify(T1, T2, []),
{t_subst_kv(T, VarMap), lists:keysort(1, VarMap)}.
-t_unify(?var(Id) = T, ?var(Id), VarMap, _Opaques) ->
+t_unify(?var(Id) = T, ?var(Id), VarMap) ->
{T, VarMap};
-t_unify(?var(Id1) = T, ?var(Id2), VarMap, Opaques) ->
+t_unify(?var(Id1) = T, ?var(Id2), VarMap) ->
case lists:keyfind(Id1, 1, VarMap) of
false ->
case lists:keyfind(Id2, 1, VarMap) of
false -> {T, [{Id2, T} | VarMap]};
- {Id2, Type} -> t_unify(T, Type, VarMap, Opaques)
+ {Id2, Type} -> t_unify(T, Type, VarMap)
end;
{Id1, Type1} ->
case lists:keyfind(Id2, 1, VarMap) of
false -> {Type1, [{Id2, T} | VarMap]};
- {Id2, Type2} -> t_unify(Type1, Type2, VarMap, Opaques)
+ {Id2, Type2} -> t_unify(Type1, Type2, VarMap)
end
end;
-t_unify(?var(Id), Type, VarMap, Opaques) ->
+t_unify(?var(Id), Type, VarMap) ->
case lists:keyfind(Id, 1, VarMap) of
false -> {Type, [{Id, Type} | VarMap]};
- {Id, VarType} -> t_unify(VarType, Type, VarMap, Opaques)
+ {Id, VarType} -> t_unify(VarType, Type, VarMap)
end;
-t_unify(Type, ?var(Id), VarMap, Opaques) ->
+t_unify(Type, ?var(Id), VarMap) ->
case lists:keyfind(Id, 1, VarMap) of
false -> {Type, [{Id, Type} | VarMap]};
- {Id, VarType} -> t_unify(VarType, Type, VarMap, Opaques)
+ {Id, VarType} -> t_unify(VarType, Type, VarMap)
end;
-t_unify(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap, Opaques) ->
- {Domain, VarMap1} = t_unify(Domain1, Domain2, VarMap, Opaques),
- {Range, VarMap2} = t_unify(Range1, Range2, VarMap1, Opaques),
+t_unify(?function(Domain1, Range1), ?function(Domain2, Range2), VarMap) ->
+ {Domain, VarMap1} = t_unify(Domain1, Domain2, VarMap),
+ {Range, VarMap2} = t_unify(Range1, Range2, VarMap1),
{?function(Domain, Range), VarMap2};
t_unify(?list(Contents1, Termination1, Size),
- ?list(Contents2, Termination2, Size), VarMap, Opaques) ->
- {Contents, VarMap1} = t_unify(Contents1, Contents2, VarMap, Opaques),
- {Termination, VarMap2} = t_unify(Termination1, Termination2, VarMap1, Opaques),
+ ?list(Contents2, Termination2, Size), VarMap) ->
+ {Contents, VarMap1} = t_unify(Contents1, Contents2, VarMap),
+ {Termination, VarMap2} = t_unify(Termination1, Termination2, VarMap1),
{?list(Contents, Termination, Size), VarMap2};
-t_unify(?product(Types1), ?product(Types2), VarMap, Opaques) ->
- {Types, VarMap1} = unify_lists(Types1, Types2, VarMap, Opaques),
+t_unify(?product(Types1), ?product(Types2), VarMap) ->
+ {Types, VarMap1} = unify_lists(Types1, Types2, VarMap),
{?product(Types), VarMap1};
-t_unify(?tuple(?any, ?any, ?any) = T, ?tuple(?any, ?any, ?any), VarMap, _Opaques) ->
+t_unify(?tuple(?any, ?any, ?any) = T, ?tuple(?any, ?any, ?any), VarMap) ->
{T, VarMap};
t_unify(?tuple(Elements1, Arity, _),
- ?tuple(Elements2, Arity, _), VarMap, Opaques) when Arity =/= ?any ->
- {NewElements, VarMap1} = unify_lists(Elements1, Elements2, VarMap, Opaques),
+ ?tuple(Elements2, Arity, _), VarMap) when Arity =/= ?any ->
+ {NewElements, VarMap1} = unify_lists(Elements1, Elements2, VarMap),
{t_tuple(NewElements), VarMap1};
t_unify(?tuple_set([{Arity, _}]) = T1,
- ?tuple(_, Arity, _) = T2, VarMap, Opaques) when Arity =/= ?any ->
- unify_tuple_set_and_tuple(T1, T2, VarMap, Opaques);
+ ?tuple(_, Arity, _) = T2, VarMap) when Arity =/= ?any ->
+ unify_tuple_set_and_tuple1(T1, T2, VarMap);
t_unify(?tuple(_, Arity, _) = T1,
- ?tuple_set([{Arity, _}]) = T2, VarMap, Opaques) when Arity =/= ?any ->
- unify_tuple_set_and_tuple(T2, T1, VarMap, Opaques);
-t_unify(?tuple_set(List1), ?tuple_set(List2), VarMap, Opaques) ->
- {Tuples, NewVarMap} =
- unify_lists(lists:append([T || {_Arity, T} <- List1]),
- lists:append([T || {_Arity, T} <- List2]), VarMap, Opaques),
- {t_sup(Tuples), NewVarMap};
-t_unify(?opaque(Elements) = T, ?opaque(Elements), VarMap, _Opaques) ->
- {T, VarMap};
-t_unify(?opaque(_) = T1, ?opaque(_) = T2, _VarMap, _Opaques) ->
- throw({mismatch, T1, T2});
-t_unify(Type, ?opaque(_) = OpType, VarMap, Opaques) ->
- t_unify_with_opaque(Type, OpType, VarMap, Opaques);
-t_unify(?opaque(_) = OpType, Type, VarMap, Opaques) ->
- t_unify_with_opaque(Type, OpType, VarMap, Opaques);
-t_unify(T, T, VarMap, _Opaques) ->
+ ?tuple_set([{Arity, _}]) = T2, VarMap) when Arity =/= ?any ->
+ unify_tuple_set_and_tuple2(T1, T2, VarMap);
+t_unify(?tuple_set(List1) = T1, ?tuple_set(List2) = T2, VarMap) ->
+ try
+ unify_lists(lists:append([T || {_Arity, T} <- List1]),
+ lists:append([T || {_Arity, T} <- List2]), VarMap)
+ of
+ {Tuples, NewVarMap} -> {t_sup(Tuples), NewVarMap}
+ catch _:_ -> throw({mismatch, T1, T2})
+ end;
+t_unify(?opaque(_) = T1, ?opaque(_) = T2, VarMap) ->
+ t_unify(t_opaque_structure(T1), t_opaque_structure(T2), VarMap);
+t_unify(T1, ?opaque(_) = T2, VarMap) ->
+ t_unify(T1, t_opaque_structure(T2), VarMap);
+t_unify(?opaque(_) = T1, T2, VarMap) ->
+ t_unify(t_opaque_structure(T1), T2, VarMap);
+t_unify(T, T, VarMap) ->
{T, VarMap};
-t_unify(T1, T2, _, _) ->
+t_unify(?union(_)=T1, ?union(_)=T2, VarMap) ->
+ {Type1, Type2} = unify_union2(T1, T2),
+ t_unify(Type1, Type2, VarMap);
+t_unify(?union(_)=T1, T2, VarMap) ->
+ t_unify(unify_union1(T1, T1, T2), T2, VarMap);
+t_unify(T1, ?union(_)=T2, VarMap) ->
+ t_unify(T1, unify_union1(T2, T1, T2), VarMap);
+t_unify(T1, T2, _) ->
throw({mismatch, T1, T2}).
-t_unify_with_opaque(Type, OpType, VarMap, Opaques) ->
- case lists:member(OpType, Opaques) of
+unify_union2(?union(List1)=T1, ?union(List2)=T2) ->
+ case {unify_union(List1), unify_union(List2)} of
+ {{yes, Type1}, {yes, Type2}} -> {Type1, Type2};
+ {{yes, Type1}, no} -> {Type1, T2};
+ {no, {yes, Type2}} -> {T1, Type2};
+ {no, no} -> throw({mismatch, T1, T2})
+ end.
+
+unify_union1(?union(List), T1, T2) ->
+ case unify_union(List) of
+ {yes, Type} -> Type;
+ no -> throw({mismatch, T1, T2})
+ end.
+
+unify_union(List) ->
+ [A,B,F,I,L,N,T,M,O,R] = List,
+ if O =:= ?none -> no;
true ->
- Struct = t_opaque_structure(OpType),
- try t_unify(Type, Struct, VarMap, Opaques) of
- {_T, VarMap1} -> {OpType, VarMap1}
- catch
- throw:{mismatch, _T1, _T2} ->
- case t_inf(OpType, Type, opaque) of
- ?none -> throw({mismatch, Type, OpType});
- _ -> {OpType, VarMap}
- end
- end;
- false ->
- throw({mismatch, Type, OpType})
+ S = t_opaque_structure(O),
+ {yes, t_sup([A,B,F,I,L,N,T,M,S,R])}
end.
-unify_tuple_set_and_tuple(?tuple_set([{Arity, List}]),
- ?tuple(Elements2, Arity, _), VarMap, Opaques) ->
+-spec is_opaque_type(erl_type(), [erl_type()]) -> boolean().
+
+%% An opaque type is a union of types. Returns true iff any of the type
+%% names (Module and Name) of the first argument (the opaque type to
+%% check) occurs in any of the opaque types of the second argument.
+is_opaque_type(?opaque(Elements), Opaques) ->
+ lists:any(fun(Opaque) -> is_opaque_type2(Opaque, Opaques) end, Elements).
+
+is_opaque_type2(#opaque{mod = Mod1, name = Name1}, Opaques) ->
+ F1 = fun(?opaque(Es)) ->
+ F2 = fun(#opaque{mod = Mod, name = Name}) ->
+ Mod1 =:= Mod andalso Name1 =:= Name
+ end,
+ lists:any(F2, Es)
+ end,
+ lists:any(F1, Opaques).
+
+%% Two functions since t_unify is not symmetric.
+unify_tuple_set_and_tuple1(?tuple_set([{Arity, List}]),
+ ?tuple(Elements2, Arity, _), VarMap) ->
+ %% Can only work if the single tuple has variables at correct places.
+ %% Collapse the tuple set.
+ {NewElements, VarMap1} =
+ unify_lists(sup_tuple_elements(List), Elements2, VarMap),
+ {t_tuple(NewElements), VarMap1}.
+
+unify_tuple_set_and_tuple2(?tuple(Elements2, Arity, _),
+ ?tuple_set([{Arity, List}]), VarMap) ->
%% Can only work if the single tuple has variables at correct places.
%% Collapse the tuple set.
- {NewElements, VarMap1} = unify_lists(sup_tuple_elements(List), Elements2, VarMap, Opaques),
+ {NewElements, VarMap1} =
+ unify_lists(Elements2, sup_tuple_elements(List), VarMap),
{t_tuple(NewElements), VarMap1}.
-unify_lists(L1, L2, VarMap, Opaques) ->
- unify_lists(L1, L2, VarMap, [], Opaques).
+unify_lists(L1, L2, VarMap) ->
+ unify_lists(L1, L2, VarMap, []).
-unify_lists([T1|Left1], [T2|Left2], VarMap, Acc, Opaques) ->
- {NewT, NewVarMap} = t_unify(T1, T2, VarMap, Opaques),
- unify_lists(Left1, Left2, NewVarMap, [NewT|Acc], Opaques);
-unify_lists([], [], VarMap, Acc, _Opaques) ->
+unify_lists([T1|Left1], [T2|Left2], VarMap, Acc) ->
+ {NewT, NewVarMap} = t_unify(T1, T2, VarMap),
+ unify_lists(Left1, Left2, NewVarMap, [NewT|Acc]);
+unify_lists([], [], VarMap, Acc) ->
{lists:reverse(Acc), VarMap}.
%%t_assign_variables_to_subtype(T1, T2) ->
@@ -2837,11 +3371,12 @@ t_subtract(?identifier(Set1), ?identifier(Set2)) ->
?none -> ?none;
Set -> ?identifier(Set)
end;
-t_subtract(?opaque(Set1), ?opaque(Set2)) ->
- case set_subtract(Set1, Set2) of
- ?none -> ?none;
- Set -> ?opaque(Set)
- end;
+t_subtract(?opaque(_)=T1, ?opaque(_)=T2) ->
+ opaque_subtract(T1, t_opaque_structure(T2));
+t_subtract(?opaque(_)=T1, T2) ->
+ opaque_subtract(T1, T2);
+t_subtract(T1, ?opaque(_)=T2) ->
+ t_subtract(T1, t_opaque_structure(T2));
t_subtract(?matchstate(Pres1, Slots1), ?matchstate(Pres2, _Slots2)) ->
Pres = t_subtract(Pres1, Pres2),
case t_is_none(Pres) of
@@ -2976,6 +3511,17 @@ t_subtract(T1, T2) ->
?union(U2) = force_union(T2),
subtract_union(U1, U2).
+-spec opaque_subtract(erl_type(), erl_type()) -> erl_type().
+
+opaque_subtract(?opaque(Set1), T2) ->
+ List = [T1#opaque{struct = Sub} ||
+ #opaque{struct = S1}=T1 <- set_to_list(Set1),
+ not t_is_none(Sub = t_subtract(S1, T2))],
+ case List of
+ [] -> ?none;
+ _ -> ?opaque(ordsets:from_list(List))
+ end.
+
-spec t_subtract_lists([erl_type()], [erl_type()]) -> [erl_type()].
t_subtract_lists(L1, L2) ->
@@ -2991,7 +3537,18 @@ t_subtract_lists([], [], Acc) ->
-spec subtract_union([erl_type(),...], [erl_type(),...]) -> erl_type().
subtract_union(U1, U2) ->
- subtract_union(U1, U2, 0, []).
+ [A1,B1,F1,I1,L1,N1,T1,M1,O1,R1] = U1,
+ [A2,B2,F2,I2,L2,N2,T2,M2,O2,R2] = U2,
+ List1 = [A1,B1,F1,I1,L1,N1,T1,M1,?none,R1],
+ List2 = [A2,B2,F2,I2,L2,N2,T2,M2,?none,R2],
+ Sub1 = subtract_union(List1, List2, 0, []),
+ O = if O1 =:= ?none -> O1;
+ true -> t_subtract(O1, ?union(U2))
+ end,
+ Sub2 = if O2 =:= ?none -> Sub1;
+ true -> t_subtract(Sub1, t_opaque_structure(O2))
+ end,
+ t_sup(O, Sub2).
-spec subtract_union([erl_type()], [erl_type()], non_neg_integer(), [erl_type()]) -> erl_type().
@@ -3052,10 +3609,24 @@ t_is_equal(_, _) -> false.
t_is_subtype(T1, T2) ->
Inf = t_inf(T1, T2),
- t_is_equal(T1, Inf).
+ subtype_is_equal(T1, Inf).
+
+%% The subtype relation has to behave correctly irrespective of opaque
+%% types.
+subtype_is_equal(T, T) -> true;
+subtype_is_equal(T1, T2) ->
+ t_is_equal(case t_contains_opaque(T1) of
+ true -> t_unopaque(T1);
+ false -> T1
+ end,
+ case t_contains_opaque(T2) of
+ true -> t_unopaque(T2);
+ false -> T2
+ end).
-spec t_is_instance(erl_type(), erl_type()) -> boolean().
+%% XXX. To be removed.
t_is_instance(ConcreteType, Type) ->
t_is_subtype(ConcreteType, t_unopaque(Type)).
@@ -3067,12 +3638,12 @@ t_unopaque(T) ->
-spec t_unopaque(erl_type(), 'universe' | [erl_type()]) -> erl_type().
t_unopaque(?opaque(_) = T, Opaques) ->
- case Opaques =:= universe orelse lists:member(T, Opaques) of
+ case Opaques =:= 'universe' orelse is_opaque_type(T, Opaques) of
true -> t_unopaque(t_opaque_structure(T), Opaques);
false -> T % XXX: needs revision for parametric opaque data types
end;
t_unopaque(?list(ElemT, Termination, Sz), Opaques) ->
- ?list(t_unopaque(ElemT, Opaques), Termination, Sz);
+ ?list(t_unopaque(ElemT, Opaques), t_unopaque(Termination, Opaques), Sz);
t_unopaque(?tuple(?any, _, _) = T, _) -> T;
t_unopaque(?tuple(ArgTs, Sz, Tag), Opaques) when is_list(ArgTs) ->
NewArgTs = [t_unopaque(A, Opaques) || A <- ArgTs],
@@ -3081,14 +3652,19 @@ t_unopaque(?tuple_set(Set), Opaques) ->
NewSet = [{Sz, [t_unopaque(T, Opaques) || T <- Tuples]}
|| {Sz, Tuples} <- Set],
?tuple_set(NewSet);
+t_unopaque(?product(Types), Opaques) ->
+ ?product([t_unopaque(T, Opaques) || T <- Types]);
+t_unopaque(?function(Domain, Range), Opaques) ->
+ ?function(t_unopaque(Domain, Opaques), t_unopaque(Range, Opaques));
t_unopaque(?union([A,B,F,I,L,N,T,M,O,R]), Opaques) ->
UL = t_unopaque(L, Opaques),
UT = t_unopaque(T, Opaques),
- UO = case O of
- ?none -> [];
- ?opaque(Os) -> [t_unopaque(S, Opaques) || #opaque{struct = S} <- Os]
- end,
- t_sup([?union([A,B,F,I,UL,N,UT,M,?none,R])|UO]);
+ UF = t_unopaque(F, Opaques),
+ {OF,UO} = case t_unopaque(O, Opaques) of
+ ?opaque(_) = O1 -> {O1, []};
+ Type -> {?none, [Type]}
+ end,
+ t_sup([?union([A,B,UF,I,UL,N,UT,M,OF,R])|UO]);
t_unopaque(T, _) ->
T.
@@ -3134,6 +3710,12 @@ t_limit_k(?product(Elements), K) ->
?product([t_limit_k(X, K - 1) || X <- Elements]);
t_limit_k(?union(Elements), K) ->
?union([t_limit_k(X, K) || X <- Elements]);
+t_limit_k(?opaque(Es), K) ->
+ List = [begin
+ NewS = t_limit_k(S, K),
+ Opaque#opaque{struct = NewS}
+ end || #opaque{struct = S} = Opaque <- set_to_list(Es)],
+ ?opaque(ordsets:from_list(List));
t_limit_k(T, _K) -> T.
%%============================================================================
@@ -3167,7 +3749,7 @@ t_abstract_records(?union(Types), RecDict) ->
t_abstract_records(?tuple(?any, ?any, ?any) = T, _RecDict) ->
T;
t_abstract_records(?tuple(Elements, Arity, ?atom(_) = Tag), RecDict) ->
- [TagAtom] = t_atom_vals(Tag),
+ [TagAtom] = atom_vals(Tag),
case lookup_record(TagAtom, Arity - 1, RecDict) of
error -> t_tuple([t_abstract_records(E, RecDict) || E <- Elements]);
{ok, Fields} -> t_tuple([Tag|[T || {_Name, T} <- Fields]])
@@ -3176,6 +3758,8 @@ t_abstract_records(?tuple(Elements, _Arity, _Tag), RecDict) ->
t_tuple([t_abstract_records(E, RecDict) || E <- Elements]);
t_abstract_records(?tuple_set(_) = Tuples, RecDict) ->
t_sup([t_abstract_records(T, RecDict) || T <- t_tuple_subtypes(Tuples)]);
+t_abstract_records(?opaque(_)=Type, RecDict) ->
+ t_abstract_records(t_opaque_structure(Type), RecDict);
t_abstract_records(T, _RecDict) ->
T.
@@ -3198,6 +3782,14 @@ t_map(Fun, ?tuple(Elements, _Arity, _Tag)) ->
Fun(t_tuple([t_map(Fun, E) || E <- Elements]));
t_map(Fun, ?tuple_set(_) = Tuples) ->
Fun(t_sup([t_map(Fun, T) || T <- t_tuple_subtypes(Tuples)]));
+t_map(Fun, ?opaque(Set)) ->
+ L = [Opaque#opaque{struct = NewS} ||
+ #opaque{struct = S} = Opaque <- set_to_list(Set),
+ not t_is_none(NewS = t_map(Fun, S))],
+ Fun(case L of
+ [] -> ?none;
+ _ -> ?opaque(ordsets:from_list(L))
+ end);
t_map(Fun, T) ->
Fun(T).
@@ -3239,11 +3831,11 @@ t_to_string(?bitstr(8, 0), _RecDict) ->
t_to_string(?bitstr(1, 0), _RecDict) ->
"bitstring()";
t_to_string(?bitstr(0, B), _RecDict) ->
- lists:flatten(io_lib:format("<<_:~w>>", [B]));
+ flat_format("<<_:~w>>", [B]);
t_to_string(?bitstr(U, 0), _RecDict) ->
- lists:flatten(io_lib:format("<<_:_*~w>>", [U]));
+ flat_format("<<_:_*~w>>", [U]);
t_to_string(?bitstr(U, B), _RecDict) ->
- lists:flatten(io_lib:format("<<_:~w,_:_*~w>>", [B, U]));
+ flat_format("<<_:~w,_:_*~w>>", [B, U]);
t_to_string(?function(?any, ?any), _RecDict) ->
"fun()";
t_to_string(?function(?any, Range), RecDict) ->
@@ -3255,18 +3847,16 @@ t_to_string(?identifier(Set), _RecDict) ->
case Set of
?any -> "identifier()";
_ ->
- string:join([io_lib:format("~w()", [T]) || T <- set_to_list(Set)], " | ")
+ string:join([flat_format("~w()", [T]) || T <- set_to_list(Set)], " | ")
end;
-t_to_string(?opaque(Set), _RecDict) ->
- string:join([case is_opaque_builtin(Mod, Name) of
- true -> io_lib:format("~w()", [Name]);
- false -> io_lib:format("~w:~w()", [Mod, Name])
- end
- || #opaque{mod = Mod, name = Name} <- set_to_list(Set)],
+t_to_string(?opaque(Set), RecDict) ->
+ string:join([opaque_type(Mod, Name, S, RecDict) ||
+ #opaque{mod = Mod, name = Name, struct = S}
+ <- set_to_list(Set)],
" | ");
t_to_string(?matchstate(Pres, Slots), RecDict) ->
- io_lib:format("ms(~s,~s)", [t_to_string(Pres, RecDict),
- t_to_string(Slots,RecDict)]);
+ flat_format("ms(~s,~s)", [t_to_string(Pres, RecDict),
+ t_to_string(Slots,RecDict)]);
t_to_string(?nil, _RecDict) ->
"[]";
t_to_string(?nonempty_list(Contents, Termination), RecDict) ->
@@ -3282,7 +3872,9 @@ t_to_string(?nonempty_list(Contents, Termination), RecDict) ->
case Contents =:= ?any of
true -> ok;
false ->
- erlang:error({illegal_list, ?nonempty_list(Contents, Termination)})
+ %% XXX. See comment below.
+ %% erlang:error({illegal_list, ?nonempty_list(Contents, Termination)})
+ ok
end,
"nonempty_maybe_improper_list()";
_ ->
@@ -3305,11 +3897,14 @@ t_to_string(?list(Contents, Termination, ?unknown_qual), RecDict) ->
end;
?any ->
%% Just a safety check.
+ %% XXX. Types such as "maybe_improper_list(integer(), any())"
+ %% are OK, but cannot be printed!?
case Contents =:= ?any of
true -> ok;
false ->
- L = ?list(Contents, Termination, ?unknown_qual),
- erlang:error({illegal_list, L})
+ ok
+ %% L = ?list(Contents, Termination, ?unknown_qual),
+ %% erlang:error({illegal_list, L})
end,
"maybe_improper_list()";
_ ->
@@ -3330,7 +3925,7 @@ t_to_string(?integer_pos, _RecDict) -> "pos_integer()";
t_to_string(?integer_non_neg, _RecDict) -> "non_neg_integer()";
t_to_string(?integer_neg, _RecDict) -> "neg_integer()";
t_to_string(?int_range(From, To), _RecDict) ->
- lists:flatten(io_lib:format("~w..~w", [From, To]));
+ flat_format("~w..~w", [From, To]);
t_to_string(?integer(?any), _RecDict) -> "integer()";
t_to_string(?float, _RecDict) -> "float()";
t_to_string(?number(?any, ?unknown_qual), _RecDict) -> "number()";
@@ -3338,10 +3933,10 @@ t_to_string(?product(List), RecDict) ->
"<" ++ comma_sequence(List, RecDict) ++ ">";
t_to_string(?remote(Set), RecDict) ->
string:join([case Args =:= [] of
- true -> io_lib:format("~w:~w()", [Mod, Name]);
+ true -> flat_format("~w:~w()", [Mod, Name]);
false ->
ArgString = comma_sequence(Args, RecDict),
- io_lib:format("~w:~w(~s)", [Mod, Name, ArgString])
+ flat_format("~w:~w(~s)", [Mod, Name, ArgString])
end
|| #remote{mod = Mod, name = Name, args = Args} <-
set_to_list(Set)],
@@ -3350,7 +3945,7 @@ t_to_string(?tuple(?any, ?any, ?any), _RecDict) -> "tuple()";
t_to_string(?tuple(Elements, _Arity, ?any), RecDict) ->
"{" ++ comma_sequence(Elements, RecDict) ++ "}";
t_to_string(?tuple(Elements, Arity, Tag), RecDict) ->
- [TagAtom] = t_atom_vals(Tag),
+ [TagAtom] = atom_vals(Tag),
case lookup_record(TagAtom, Arity-1, RecDict) of
error -> "{" ++ comma_sequence(Elements, RecDict) ++ "}";
{ok, FieldNames} ->
@@ -3361,9 +3956,9 @@ t_to_string(?tuple_set(_) = T, RecDict) ->
t_to_string(?union(Types), RecDict) ->
union_sequence([T || T <- Types, T =/= ?none], RecDict);
t_to_string(?var(Id), _RecDict) when is_atom(Id) ->
- io_lib:format("~s", [atom_to_list(Id)]);
+ flat_format("~s", [atom_to_list(Id)]);
t_to_string(?var(Id), _RecDict) when is_integer(Id) ->
- io_lib:format("var(~w)", [Id]).
+ flat_format("var(~w)", [Id]).
record_to_string(Tag, [_|Fields], FieldNames, RecDict) ->
FieldStrings = record_fields_to_string(Fields, FieldNames, RecDict, []),
@@ -3371,7 +3966,7 @@ record_to_string(Tag, [_|Fields], FieldNames, RecDict) ->
record_fields_to_string([F|Fs], [{FName, _DefType}|FDefs], RecDict, Acc) ->
NewAcc =
- case t_is_any(F) orelse t_is_atom('undefined', F) of
+ case t_is_equal(F, t_any()) orelse t_is_any_atom('undefined', F) of
true -> Acc;
false ->
StrFV = atom_to_string(FName) ++ "::" ++ t_to_string(F, RecDict),
@@ -3389,13 +3984,14 @@ record_fields_to_string([], [], _RecDict, Acc) ->
-spec record_field_diffs_to_string(erl_type(), dict()) -> string().
record_field_diffs_to_string(?tuple([_|Fs], Arity, Tag), RecDict) ->
- [TagAtom] = t_atom_vals(Tag),
+ [TagAtom] = atom_vals(Tag),
{ok, FieldNames} = lookup_record(TagAtom, Arity-1, RecDict),
%% io:format("RecCElems = ~p\nRecTypes = ~p\n", [Fs, FieldNames]),
FieldDiffs = field_diffs(Fs, FieldNames, RecDict, []),
string:join(FieldDiffs, " and ").
field_diffs([F|Fs], [{FName, DefType}|FDefs], RecDict, Acc) ->
+ %% Don't care about opaqueness for now.
NewAcc =
case not t_is_none(t_inf(F, DefType)) of
true -> Acc;
@@ -3418,6 +4014,24 @@ union_sequence(Types, RecDict) ->
List = [t_to_string(T, RecDict) || T <- Types],
string:join(List, " | ").
+-ifdef(DEBUG).
+opaque_type(Mod, Name, S, RecDict) ->
+ opaque_name(Mod, Name, t_to_string(S, RecDict)).
+-else.
+opaque_type(Mod, Name, _S, _RecDict) ->
+ opaque_name(Mod, Name, "").
+-endif.
+
+opaque_name(Mod, Name, Extra) ->
+ S = mod_name(Mod, Name),
+ flat_format("~s(~s)", [S, Extra]).
+
+mod_name(Mod, Name) ->
+ case is_opaque_builtin(Mod, Name) of
+ true -> flat_format("~w", [Name]);
+ false -> flat_format("~w:~w", [Mod, Name])
+ end.
+
%%=============================================================================
%%
%% Build a type from parse forms.
@@ -3437,246 +4051,197 @@ t_from_form(Form, RecDict) ->
-spec t_from_form(parse_form(), dict(), dict()) -> erl_type().
t_from_form(Form, RecDict, VarDict) ->
- {T, _R} = t_from_form(Form, [], false, RecDict, VarDict),
+ {T, _R} = t_from_form(Form, [], RecDict, VarDict),
T.
-type type_names() :: [{'type' | 'opaque' | 'record', atom()}].
--spec t_from_form(parse_form(), type_names(), boolean(), dict(), dict()) ->
+-spec t_from_form(parse_form(), type_names(), dict(), dict()) ->
{erl_type(), type_names()}.
-t_from_form({var, _L, '_'}, _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+t_from_form({var, _L, '_'}, _TypeNames, _RecDict, _VarDict) ->
{t_any(), []};
-t_from_form({var, _L, Name}, _TypeNames, _InOpaque, _RecDict, VarDict) ->
+t_from_form({var, _L, Name}, _TypeNames, _RecDict, VarDict) ->
case dict:find(Name, VarDict) of
error -> {t_var(Name), []};
{ok, Val} -> {Val, []}
end;
-t_from_form({ann_type, _L, [_Var, Type]}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict);
-t_from_form({paren_type, _L, [Type]}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict);
+t_from_form({ann_type, _L, [_Var, Type]}, TypeNames, RecDict, VarDict) ->
+ t_from_form(Type, TypeNames, RecDict, VarDict);
+t_from_form({paren_type, _L, [Type]}, TypeNames, RecDict, VarDict) ->
+ t_from_form(Type, TypeNames, RecDict, VarDict);
t_from_form({remote_type, _L, [{atom, _, Module}, {atom, _, Type}, Args]},
- TypeNames, InOpaque, RecDict, VarDict) ->
- {L, R} = list_from_form(Args, TypeNames, InOpaque, RecDict, VarDict),
+ TypeNames, RecDict, VarDict) ->
+ {L, R} = list_from_form(Args, TypeNames, RecDict, VarDict),
{t_remote(Module, Type, L), R};
-t_from_form({atom, _L, Atom}, _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+t_from_form({atom, _L, Atom}, _TypeNames, _RecDict, _VarDict) ->
{t_atom(Atom), []};
-t_from_form({integer, _L, Int}, _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+t_from_form({integer, _L, Int}, _TypeNames, _RecDict, _VarDict) ->
{t_integer(Int), []};
-t_from_form({op, _L, _Op, _Arg} = Op, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({op, _L, _Op, _Arg} = Op, _TypeNames, _RecDict, _VarDict) ->
case erl_eval:partial_eval(Op) of
{integer, _, Val} ->
{t_integer(Val), []};
_ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Op])})
end;
-t_from_form({op, _L, _Op, _Arg1, _Arg2} = Op, _TypeNames, _InOpaque,
+t_from_form({op, _L, _Op, _Arg1, _Arg2} = Op, _TypeNames,
_RecDict, _VarDict) ->
case erl_eval:partial_eval(Op) of
{integer, _, Val} ->
{t_integer(Val), []};
_ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Op])})
end;
-t_from_form({type, _L, any, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, any, []}, _TypeNames, _RecDict, _VarDict) ->
{t_any(), []};
-t_from_form({type, _L, arity, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, arity, []}, _TypeNames, _RecDict, _VarDict) ->
{t_arity(), []};
-t_from_form({type, _L, array, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, array, []}, _TypeNames, _RecDict, _VarDict) ->
{t_array(), []};
-t_from_form({type, _L, atom, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, atom, []}, _TypeNames, _RecDict, _VarDict) ->
{t_atom(), []};
-t_from_form({type, _L, binary, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, binary, []}, _TypeNames, _RecDict, _VarDict) ->
{t_binary(), []};
t_from_form({type, _L, binary, [Base, Unit]} = Type,
- _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+ _TypeNames, _RecDict, _VarDict) ->
case {erl_eval:partial_eval(Base), erl_eval:partial_eval(Unit)} of
{{integer, _, B}, {integer, _, U}} when B >= 0, U >= 0 ->
{t_bitstr(U, B), []};
_ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Type])})
end;
-t_from_form({type, _L, bitstring, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, bitstring, []}, _TypeNames, _RecDict, _VarDict) ->
{t_bitstr(), []};
-t_from_form({type, _L, bool, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, bool, []}, _TypeNames, _RecDict, _VarDict) ->
{t_boolean(), []}; % XXX: Temporarily
-t_from_form({type, _L, boolean, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, boolean, []}, _TypeNames, _RecDict, _VarDict) ->
{t_boolean(), []};
-t_from_form({type, _L, byte, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, byte, []}, _TypeNames, _RecDict, _VarDict) ->
{t_byte(), []};
-t_from_form({type, _L, char, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, char, []}, _TypeNames, _RecDict, _VarDict) ->
{t_char(), []};
-t_from_form({type, _L, dict, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, dict, []}, _TypeNames, _RecDict, _VarDict) ->
{t_dict(), []};
-t_from_form({type, _L, digraph, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, digraph, []}, _TypeNames, _RecDict, _VarDict) ->
{t_digraph(), []};
-t_from_form({type, _L, float, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, float, []}, _TypeNames, _RecDict, _VarDict) ->
{t_float(), []};
-t_from_form({type, _L, function, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, function, []}, _TypeNames, _RecDict, _VarDict) ->
{t_fun(), []};
-t_from_form({type, _L, 'fun', []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, 'fun', []}, _TypeNames, _RecDict, _VarDict) ->
{t_fun(), []};
t_from_form({type, _L, 'fun', [{type, _, any}, Range]}, TypeNames,
- InOpaque, RecDict, VarDict) ->
- {T, R} = t_from_form(Range, TypeNames, InOpaque, RecDict, VarDict),
+ RecDict, VarDict) ->
+ {T, R} = t_from_form(Range, TypeNames, RecDict, VarDict),
{t_fun(T), R};
t_from_form({type, _L, 'fun', [{type, _, product, Domain}, Range]},
- TypeNames, InOpaque, RecDict, VarDict) ->
- {L, R1} = list_from_form(Domain, TypeNames, InOpaque, RecDict, VarDict),
- {T, R2} = t_from_form(Range, TypeNames, InOpaque, RecDict, VarDict),
+ TypeNames, RecDict, VarDict) ->
+ {L, R1} = list_from_form(Domain, TypeNames, RecDict, VarDict),
+ {T, R2} = t_from_form(Range, TypeNames, RecDict, VarDict),
{t_fun(L, T), R1 ++ R2};
-t_from_form({type, _L, gb_set, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, gb_set, []}, _TypeNames, _RecDict, _VarDict) ->
{t_gb_set(), []};
-t_from_form({type, _L, gb_tree, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, gb_tree, []}, _TypeNames, _RecDict, _VarDict) ->
{t_gb_tree(), []};
-t_from_form({type, _L, identifier, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, identifier, []}, _TypeNames, _RecDict, _VarDict) ->
{t_identifier(), []};
-t_from_form({type, _L, integer, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, integer, []}, _TypeNames, _RecDict, _VarDict) ->
{t_integer(), []};
-t_from_form({type, _L, iodata, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, iodata, []}, _TypeNames, _RecDict, _VarDict) ->
{t_iodata(), []};
-t_from_form({type, _L, iolist, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, iolist, []}, _TypeNames, _RecDict, _VarDict) ->
{t_iolist(), []};
-t_from_form({type, _L, list, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, list, []}, _TypeNames, _RecDict, _VarDict) ->
{t_list(), []};
-t_from_form({type, _L, list, [Type]}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- {T, R} = t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict),
+t_from_form({type, _L, list, [Type]}, TypeNames, RecDict, VarDict) ->
+ {T, R} = t_from_form(Type, TypeNames, RecDict, VarDict),
{t_list(T), R};
-t_from_form({type, _L, mfa, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, mfa, []}, _TypeNames, _RecDict, _VarDict) ->
{t_mfa(), []};
-t_from_form({type, _L, module, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, module, []}, _TypeNames, _RecDict, _VarDict) ->
{t_module(), []};
-t_from_form({type, _L, nil, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, nil, []}, _TypeNames, _RecDict, _VarDict) ->
{t_nil(), []};
-t_from_form({type, _L, neg_integer, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, neg_integer, []}, _TypeNames, _RecDict, _VarDict) ->
{t_neg_integer(), []};
-t_from_form({type, _L, non_neg_integer, []}, _TypeNames, _InOpaque, _RecDict,
+t_from_form({type, _L, non_neg_integer, []}, _TypeNames, _RecDict,
_VarDict) ->
{t_non_neg_integer(), []};
-t_from_form({type, _L, no_return, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, no_return, []}, _TypeNames, _RecDict, _VarDict) ->
{t_unit(), []};
-t_from_form({type, _L, node, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, node, []}, _TypeNames, _RecDict, _VarDict) ->
{t_node(), []};
-t_from_form({type, _L, none, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, none, []}, _TypeNames, _RecDict, _VarDict) ->
{t_none(), []};
-t_from_form({type, _L, nonempty_list, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, nonempty_list, []}, _TypeNames, _RecDict, _VarDict) ->
{t_nonempty_list(), []};
-t_from_form({type, _L, nonempty_list, [Type]}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- {T, R} = t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict),
+t_from_form({type, _L, nonempty_list, [Type]}, TypeNames, RecDict, VarDict) ->
+ {T, R} = t_from_form(Type, TypeNames, RecDict, VarDict),
{t_nonempty_list(T), R};
t_from_form({type, _L, nonempty_improper_list, [Cont, Term]}, TypeNames,
- InOpaque, RecDict, VarDict) ->
- {T1, R1} = t_from_form(Cont, TypeNames, InOpaque, RecDict, VarDict),
- {T2, R2} = t_from_form(Term, TypeNames, InOpaque, RecDict, VarDict),
+ RecDict, VarDict) ->
+ {T1, R1} = t_from_form(Cont, TypeNames, RecDict, VarDict),
+ {T2, R2} = t_from_form(Term, TypeNames, RecDict, VarDict),
{t_cons(T1, T2), R1 ++ R2};
t_from_form({type, _L, nonempty_maybe_improper_list, []}, _TypeNames,
- _InOpaque, _RecDict, _VarDict) ->
+ _RecDict, _VarDict) ->
{t_cons(?any, ?any), []};
t_from_form({type, _L, nonempty_maybe_improper_list, [Cont, Term]},
- TypeNames, InOpaque, RecDict, VarDict) ->
- {T1, R1} = t_from_form(Cont, TypeNames, InOpaque, RecDict, VarDict),
- {T2, R2} = t_from_form(Term, TypeNames, InOpaque, RecDict, VarDict),
+ TypeNames, RecDict, VarDict) ->
+ {T1, R1} = t_from_form(Cont, TypeNames, RecDict, VarDict),
+ {T2, R2} = t_from_form(Term, TypeNames, RecDict, VarDict),
{t_cons(T1, T2), R1 ++ R2};
-t_from_form({type, _L, nonempty_string, []}, _TypeNames, _InOpaque, _RecDict,
+t_from_form({type, _L, nonempty_string, []}, _TypeNames, _RecDict,
_VarDict) ->
{t_nonempty_string(), []};
-t_from_form({type, _L, number, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, number, []}, _TypeNames, _RecDict, _VarDict) ->
{t_number(), []};
-t_from_form({type, _L, pid, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, pid, []}, _TypeNames, _RecDict, _VarDict) ->
{t_pid(), []};
-t_from_form({type, _L, port, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, port, []}, _TypeNames, _RecDict, _VarDict) ->
{t_port(), []};
-t_from_form({type, _L, pos_integer, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, pos_integer, []}, _TypeNames, _RecDict, _VarDict) ->
{t_pos_integer(), []};
-t_from_form({type, _L, maybe_improper_list, []}, _TypeNames, _InOpaque,
+t_from_form({type, _L, maybe_improper_list, []}, _TypeNames,
_RecDict, _VarDict) ->
{t_maybe_improper_list(), []};
t_from_form({type, _L, maybe_improper_list, [Content, Termination]},
- TypeNames, InOpaque, RecDict, VarDict) ->
- {T1, R1} = t_from_form(Content, TypeNames, InOpaque, RecDict, VarDict),
- {T2, R2} = t_from_form(Termination, TypeNames, InOpaque, RecDict, VarDict),
+ TypeNames, RecDict, VarDict) ->
+ {T1, R1} = t_from_form(Content, TypeNames, RecDict, VarDict),
+ {T2, R2} = t_from_form(Termination, TypeNames, RecDict, VarDict),
{t_maybe_improper_list(T1, T2), R1 ++ R2};
-t_from_form({type, _L, product, Elements}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- {L, R} = list_from_form(Elements, TypeNames, InOpaque, RecDict, VarDict),
+t_from_form({type, _L, product, Elements}, TypeNames, RecDict, VarDict) ->
+ {L, R} = list_from_form(Elements, TypeNames, RecDict, VarDict),
{t_product(L), R};
-t_from_form({type, _L, queue, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, queue, []}, _TypeNames, _RecDict, _VarDict) ->
{t_queue(), []};
t_from_form({type, _L, range, [From, To]} = Type,
- _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+ _TypeNames, _RecDict, _VarDict) ->
case {erl_eval:partial_eval(From), erl_eval:partial_eval(To)} of
{{integer, _, FromVal}, {integer, _, ToVal}} ->
{t_from_range(FromVal, ToVal), []};
_ -> throw({error, io_lib:format("Unable to evaluate type ~w\n", [Type])})
end;
-t_from_form({type, _L, record, [Name|Fields]}, TypeNames, InOpaque, RecDict,
- VarDict) ->
- record_from_form(Name, Fields, TypeNames, InOpaque, RecDict, VarDict);
-t_from_form({type, _L, reference, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, record, [Name|Fields]}, TypeNames, RecDict, VarDict) ->
+ record_from_form(Name, Fields, TypeNames, RecDict, VarDict);
+t_from_form({type, _L, reference, []}, _TypeNames, _RecDict, _VarDict) ->
{t_reference(), []};
-t_from_form({type, _L, set, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, set, []}, _TypeNames, _RecDict, _VarDict) ->
{t_set(), []};
-t_from_form({type, _L, string, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, string, []}, _TypeNames, _RecDict, _VarDict) ->
{t_string(), []};
-t_from_form({type, _L, term, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, term, []}, _TypeNames, _RecDict, _VarDict) ->
{t_any(), []};
-t_from_form({type, _L, tid, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, tid, []}, _TypeNames, _RecDict, _VarDict) ->
{t_tid(), []};
-t_from_form({type, _L, timeout, []}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, timeout, []}, _TypeNames, _RecDict, _VarDict) ->
{t_timeout(), []};
-t_from_form({type, _L, tuple, any}, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+t_from_form({type, _L, tuple, any}, _TypeNames, _RecDict, _VarDict) ->
{t_tuple(), []};
-t_from_form({type, _L, tuple, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
- {L, R} = list_from_form(Args, TypeNames, InOpaque, RecDict, VarDict),
+t_from_form({type, _L, tuple, Args}, TypeNames, RecDict, VarDict) ->
+ {L, R} = list_from_form(Args, TypeNames, RecDict, VarDict),
{t_tuple(L), R};
-t_from_form({type, _L, union, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
- {L, R} = list_from_form(Args, TypeNames, InOpaque, RecDict, VarDict),
+t_from_form({type, _L, union, Args}, TypeNames, RecDict, VarDict) ->
+ {L, R} = list_from_form(Args, TypeNames, RecDict, VarDict),
{t_sup(L), R};
-t_from_form({type, _L, Name, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
+t_from_form({type, _L, Name, Args}, TypeNames, RecDict, VarDict) ->
ArgsLen = length(Args),
case lookup_type(Name, ArgsLen, RecDict) of
{type, {_Module, Type, ArgNames}} ->
@@ -3685,13 +4250,12 @@ t_from_form({type, _L, Name, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
List = lists:zipwith(
fun(ArgName, ArgType) ->
{Ttemp, _R} = t_from_form(ArgType, TypeNames,
- InOpaque, RecDict,
- VarDict),
+ RecDict, VarDict),
{ArgName, Ttemp}
end,
ArgNames, Args),
TmpVarDict = dict:from_list(List),
- {T, R} = t_from_form(Type, [{type, Name}|TypeNames], InOpaque,
+ {T, R} = t_from_form(Type, [{type, Name}|TypeNames],
RecDict, TmpVarDict),
case lists:member({type, Name}, R) of
true -> {t_limit(T, ?REC_TYPE_LIMIT), R};
@@ -3706,13 +4270,12 @@ t_from_form({type, _L, Name, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
List = lists:zipwith(
fun(ArgName, ArgType) ->
{Ttemp, _R} = t_from_form(ArgType, TypeNames,
- InOpaque, RecDict,
- VarDict),
+ RecDict, VarDict),
{ArgName, Ttemp}
end,
ArgNames, Args),
TmpVarDict = dict:from_list(List),
- {T, R} = t_from_form(Type, [{opaque, Name}|TypeNames], true,
+ {T, R} = t_from_form(Type, [{opaque, Name}|TypeNames],
RecDict, TmpVarDict),
case lists:member({opaque, Name}, R) of
true -> {t_limit(T, ?REC_TYPE_LIMIT), R};
@@ -3720,27 +4283,21 @@ t_from_form({type, _L, Name, Args}, TypeNames, InOpaque, RecDict, VarDict) ->
end;
false -> {t_any(), [{opaque, Name}]}
end,
- Tret =
- case InOpaque of
- true -> Rep;
- false ->
- t_from_form({opaque, -1, Name, {Module, Args, Rep}},
- RecDict, VarDict)
- end,
+ Tret = t_from_form({opaque, -1, Name, {Module, Args, Rep}},
+ RecDict, VarDict),
{Tret, Rret};
error ->
Msg = io_lib:format("Unable to find type ~w/~w\n", [Name, ArgsLen]),
throw({error, Msg})
end;
-t_from_form({opaque, _L, Name, {Mod, Args, Rep}}, _TypeNames, _InOpaque,
+t_from_form({opaque, _L, Name, {Mod, Args, Rep}}, _TypeNames,
_RecDict, _VarDict) ->
case Args of
[] -> {t_opaque(Mod, Name, Args, Rep), []};
_ -> throw({error, "Polymorphic opaque types not supported yet"})
end.
-record_from_form({atom, _, Name}, ModFields, TypeNames, InOpaque, RecDict,
- VarDict) ->
+record_from_form({atom, _, Name}, ModFields, TypeNames, RecDict, VarDict) ->
case can_unfold_more({record, Name}, TypeNames) of
true ->
case lookup_record(Name, RecDict) of
@@ -3751,11 +4308,11 @@ record_from_form({atom, _, Name}, ModFields, TypeNames, InOpaque, RecDict,
{DeclFields1, R1} =
case lists:all(fun(Elem) -> Elem end, AreTyped) of
true -> {DeclFields, []};
- false -> fields_from_form(DeclFields, TypeNames1, InOpaque,
+ false -> fields_from_form(DeclFields, TypeNames1,
RecDict, dict:new())
end,
{GetModRec, R2} = get_mod_record(ModFields, DeclFields1,
- TypeNames1, InOpaque,
+ TypeNames1,
RecDict, VarDict),
case GetModRec of
{error, FieldName} ->
@@ -3772,13 +4329,11 @@ record_from_form({atom, _, Name}, ModFields, TypeNames, InOpaque, RecDict,
false -> {t_any(), []}
end.
-get_mod_record([], DeclFields, _TypeNames, _InOpaque, _RecDict,
- _VarDict) ->
+get_mod_record([], DeclFields, _TypeNames, _RecDict, _VarDict) ->
{{ok, DeclFields}, []};
-get_mod_record(ModFields, DeclFields, TypeNames, InOpaque, RecDict,
- VarDict) ->
+get_mod_record(ModFields, DeclFields, TypeNames, RecDict, VarDict) ->
DeclFieldsDict = orddict:from_list(DeclFields),
- {ModFieldsDict, R} = build_field_dict(ModFields, TypeNames, InOpaque,
+ {ModFieldsDict, R} = build_field_dict(ModFields, TypeNames,
RecDict, VarDict),
case get_mod_record(DeclFieldsDict, ModFieldsDict, []) of
{error, _FieldName} = Error -> {Error, R};
@@ -3788,17 +4343,16 @@ get_mod_record(ModFields, DeclFields, TypeNames, InOpaque, RecDict,
R}
end.
-build_field_dict(FieldTypes, TypeNames, InOpaque, RecDict, VarDict) ->
- build_field_dict(FieldTypes, TypeNames, InOpaque, RecDict, VarDict, []).
+build_field_dict(FieldTypes, TypeNames, RecDict, VarDict) ->
+ build_field_dict(FieldTypes, TypeNames, RecDict, VarDict, []).
build_field_dict([{type, _, field_type, [{atom, _, Name}, Type]}|Left],
- TypeNames, InOpaque, RecDict, VarDict, Acc) ->
- {T, R1} = t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict),
+ TypeNames, RecDict, VarDict, Acc) ->
+ {T, R1} = t_from_form(Type, TypeNames, RecDict, VarDict),
NewAcc = [{Name, T}|Acc],
- {D, R2} = build_field_dict(Left, TypeNames, InOpaque, RecDict, VarDict,
- NewAcc),
+ {D, R2} = build_field_dict(Left, TypeNames, RecDict, VarDict, NewAcc),
{D, R1 ++ R2};
-build_field_dict([], _TypeNames, _InOpaque, _RecDict, _VarDict, Acc) ->
+build_field_dict([], _TypeNames, _RecDict, _VarDict, Acc) ->
{orddict:from_list(Acc), []}.
get_mod_record([{FieldName, DeclType}|Left1],
@@ -3817,19 +4371,19 @@ get_mod_record(DeclFields, [], Acc) ->
get_mod_record(_, [{FieldName2, _ModType}|_], _Acc) ->
{error, FieldName2}.
-fields_from_form([], _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+fields_from_form([], _TypeNames, _RecDict, _VarDict) ->
{[], []};
-fields_from_form([{Name, Type}|Tail], TypeNames, InOpaque, RecDict,
+fields_from_form([{Name, Type}|Tail], TypeNames, RecDict,
VarDict) ->
- {T, R1} = t_from_form(Type, TypeNames, InOpaque, RecDict, VarDict),
- {F, R2} = fields_from_form(Tail, TypeNames, InOpaque, RecDict, VarDict),
+ {T, R1} = t_from_form(Type, TypeNames, RecDict, VarDict),
+ {F, R2} = fields_from_form(Tail, TypeNames, RecDict, VarDict),
{[{Name, T}|F], R1 ++ R2}.
-list_from_form([], _TypeNames, _InOpaque, _RecDict, _VarDict) ->
+list_from_form([], _TypeNames, _RecDict, _VarDict) ->
{[], []};
-list_from_form([H|Tail], TypeNames, InOpaque, RecDict, VarDict) ->
- {T, R1} = t_from_form(H, TypeNames, InOpaque, RecDict, VarDict),
- {L, R2} = list_from_form(Tail, TypeNames, InOpaque, RecDict, VarDict),
+list_from_form([H|Tail], TypeNames, RecDict, VarDict) ->
+ {T, R1} = t_from_form(H, TypeNames, RecDict, VarDict),
+ {L, R2} = list_from_form(Tail, TypeNames, RecDict, VarDict),
{[T|L], R1 ++ R2}.
-spec t_form_to_string(parse_form()) -> string().
@@ -3852,10 +4406,10 @@ t_form_to_string({op, _L, _Op, _Arg1, _Arg2} = Op) ->
t_form_to_string({ann_type, _L, [Var, Type]}) ->
t_form_to_string(Var) ++ "::" ++ t_form_to_string(Type);
t_form_to_string({paren_type, _L, [Type]}) ->
- io_lib:format("(~s)", [t_form_to_string(Type)]);
+ flat_format("(~s)", [t_form_to_string(Type)]);
t_form_to_string({remote_type, _L, [{atom, _, Mod}, {atom, _, Name}, Args]}) ->
ArgString = "(" ++ string:join(t_form_to_string_list(Args), ",") ++ ")",
- io_lib:format("~w:~w", [Mod, Name]) ++ ArgString;
+ flat_format("~w:~w", [Mod, Name]) ++ ArgString;
t_form_to_string({type, _L, arity, []}) -> "arity()";
t_form_to_string({type, _L, binary, []}) -> "binary()";
t_form_to_string({type, _L, binary, [Base, Unit]} = Type) ->
@@ -3866,9 +4420,9 @@ t_form_to_string({type, _L, binary, [Base, Unit]} = Type) ->
{0, 0} -> "<<>>";
{8, 0} -> "binary()";
{1, 0} -> "bitstring()";
- {0, B} -> lists:flatten(io_lib:format("<<_:~w>>", [B]));
- {U, 0} -> lists:flatten(io_lib:format("<<_:_*~w>>", [U]));
- {U, B} -> lists:flatten(io_lib:format("<<_:~w,_:_*~w>>", [B, U]))
+ {0, B} -> flat_format("<<_:~w>>", [B]);
+ {U, 0} -> flat_format("<<_:_*~w>>", [U]);
+ {U, B} -> flat_format("<<_:~w,_:_*~w>>", [B, U])
end;
_ -> io_lib:format("Badly formed bitstr type ~w", [Type])
end;
@@ -3894,16 +4448,16 @@ t_form_to_string({type, _L, product, Elements}) ->
t_form_to_string({type, _L, range, [From, To]} = Type) ->
case {erl_eval:partial_eval(From), erl_eval:partial_eval(To)} of
{{integer, _, FromVal}, {integer, _, ToVal}} ->
- io_lib:format("~w..~w", [FromVal, ToVal]);
- _ -> io_lib:format("Badly formed type ~w",[Type])
+ flat_format("~w..~w", [FromVal, ToVal]);
+ _ -> flat_format("Badly formed type ~w",[Type])
end;
t_form_to_string({type, _L, record, [{atom, _, Name}]}) ->
- io_lib:format("#~w{}", [Name]);
+ flat_format("#~w{}", [Name]);
t_form_to_string({type, _L, record, [{atom, _, Name}|Fields]}) ->
FieldString = string:join(t_form_to_string_list(Fields), ","),
- io_lib:format("#~w{~s}", [Name, FieldString]);
+ flat_format("#~w{~s}", [Name, FieldString]);
t_form_to_string({type, _L, field_type, [{atom, _, Name}, Type]}) ->
- io_lib:format("~w::~s", [Name, t_form_to_string(Type)]);
+ flat_format("~w::~s", [Name, t_form_to_string(Type)]);
t_form_to_string({type, _L, term, []}) -> "term()";
t_form_to_string({type, _L, timeout, []}) -> "timeout()";
t_form_to_string({type, _L, tuple, any}) -> "tuple()";
@@ -3916,8 +4470,8 @@ t_form_to_string({type, _L, Name, []} = T) ->
catch throw:{error, _} -> atom_to_string(Name) ++ "()"
end;
t_form_to_string({type, _L, Name, List}) ->
- io_lib:format("~w(~s)",
- [Name, string:join(t_form_to_string_list(List), ",")]).
+ flat_format("~w(~s)",
+ [Name, string:join(t_form_to_string_list(List), ",")]).
t_form_to_string_list(List) ->
t_form_to_string_list(List, []).
@@ -3930,7 +4484,7 @@ t_form_to_string_list([], Acc) ->
-spec atom_to_string(atom()) -> string().
atom_to_string(Atom) ->
- lists:flatten(io_lib:format("~w", [Atom])).
+ flat_format("~w", [Atom]).
%%=============================================================================
%%
@@ -4002,6 +4556,29 @@ can_unfold_more(TypeName, TypeNames) ->
Fun = fun(E, Acc) -> case E of TypeName -> Acc + 1; _ -> Acc end end,
lists:foldl(Fun, 0, TypeNames) < ?REC_TYPE_LIMIT.
+-spec do_opaque(erl_type(), opaques(), fun((_) -> T)) -> T.
+
+%% Probably a little faster than calling t_unopaque/2.
+%% Unions that are due to opaque types are unopaqued.
+do_opaque(?opaque(_) = Type, Opaques, Pred) ->
+ case Opaques =:= 'universe' orelse is_opaque_type(Type, Opaques) of
+ true -> do_opaque(t_opaque_structure(Type), Opaques, Pred);
+ false -> Pred(Type)
+ end;
+do_opaque(?union(List) = Type, Opaques, Pred) ->
+ [A,B,F,I,L,N,T,M,O,R] = List,
+ if O =:= ?none -> Pred(Type);
+ true ->
+ case Opaques =:= 'universe' orelse is_opaque_type(O, Opaques) of
+ true ->
+ S = t_opaque_structure(O),
+ do_opaque(t_sup([A,B,F,I,L,N,T,M,S,R]), Opaques, Pred);
+ false -> Pred(Type)
+ end
+ end;
+do_opaque(Type, _Opaques, Pred) ->
+ Pred(Type).
+
%% -----------------------------------
%% Set
%%
@@ -4068,7 +4645,7 @@ set_size(Set) ->
set_to_string(Set) ->
L = [case is_atom(X) of
true -> io_lib:write_string(atom_to_list(X), $'); % stupid emacs '
- false -> io_lib:format("~w", [X])
+ false -> flat_format("~w", [X])
end || X <- set_to_list(Set)],
string:join(L, " | ").
@@ -4077,6 +4654,9 @@ set_min([H|_]) -> H.
set_max(Set) ->
hd(lists:reverse(Set)).
+flat_format(F, S) ->
+ lists:flatten(io_lib:format(F, S)).
+
%%=============================================================================
%%
%% Utilities for the binary type
@@ -4131,6 +4711,11 @@ handle_base(Unit, Pos) when Pos >= 0 ->
handle_base(Unit, Neg) ->
(Unit+(Neg rem Unit)) rem Unit.
+family(L) ->
+ R = sofs:relation(L),
+ F = sofs:relation_to_family(R),
+ sofs:to_external(F).
+
%%=============================================================================
%% Consistency-testing function(s) below
%%=============================================================================
diff --git a/lib/hipe/icode/hipe_icode.erl b/lib/hipe/icode/hipe_icode.erl
index 6d4758bbf1..0e651a351c 100644
--- a/lib/hipe/icode/hipe_icode.erl
+++ b/lib/hipe/icode/hipe_icode.erl
@@ -1464,6 +1464,7 @@ successors(I) ->
case fail_label(I) of [] -> []; L when is_integer(L) -> [L] end;
#icode_enter{} -> [];
#icode_return{} -> [];
+ #icode_comment{} -> [];
%% the following are included here for handling linear code
#icode_move{} -> [];
#icode_begin_handler{} -> []
diff --git a/lib/hipe/tools/Makefile b/lib/hipe/tools/Makefile
index 3ce8ad5dd7..ed80eb075b 100644
--- a/lib/hipe/tools/Makefile
+++ b/lib/hipe/tools/Makefile
@@ -42,7 +42,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/hipe-$(VSN)
# ----------------------------------------------------
# Target Specs
# ----------------------------------------------------
-MODULES = hipe_tool hipe_profile hipe_jit
+MODULES = hipe_profile hipe_jit
# hipe_timer
HRL_FILES=
@@ -110,5 +110,4 @@ realclean: clean
# ----------------------------------------------------
$(EBIN)/hipe_ceach.beam: ../main/hipe.hrl
-$(EBIN)/hipe_tool.beam: ../main/hipe.hrl
diff --git a/lib/hipe/tools/hipe_tool.erl b/lib/hipe/tools/hipe_tool.erl
deleted file mode 100644
index efcf073efa..0000000000
--- a/lib/hipe/tools/hipe_tool.erl
+++ /dev/null
@@ -1,525 +0,0 @@
-%% -*- erlang-indent-level: 2 -*-
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Copyright (c) 2002 by Erik Johansson.
-%% ====================================================================
-%% Module : hipe_tool
-%% Purpose :
-%% Notes :
-%% History : * 2002-03-13 Erik Johansson ([email protected]): Created.
-%% ====================================================================
-%% Exports :
-%%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--module(hipe_tool).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,editor,3}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
--export([start/0]).
-
-%%---------------------------------------------------------------------
-
--include("../main/hipe.hrl").
-
-%%---------------------------------------------------------------------
-
--define(WINDOW_WIDTH, 920).
--define(WINDOW_HEIGHT, 460).
--define(DEFAULT_BG_COLOR, {217,217,217}).
--define(POLL_INTERVAL, 5000).
--define(FONT, {screen, 12}).
--define(HEADER_FONT, {screen, [bold], 12}).
--define(NORMAL_FG_COLOR, {0,0,0}).
-
-%%---------------------------------------------------------------------
-
--type fa() :: {atom(), arity()}. % {Fun,Arity}
--type fa_address() :: {atom(), arity(), non_neg_integer()}. % {F,A,Address}
-
-%%---------------------------------------------------------------------
-
--record(state, {win_created = false :: boolean(),
- mindex = 0 :: integer(),
- mod :: atom(),
- funs = [] :: [fa()],
- mods = [] :: [atom()],
- options = [o2] :: comp_options(),
- compiling = false :: 'false' | pid()
- }).
-
-%%---------------------------------------------------------------------
-
--spec start() -> pid().
-
-start() ->
- spawn(fun () -> init() end).
-
-init() ->
- process_flag(trap_exit, true),
- gs:start(),
- S = init_window(#state{}),
- loop(S).
-
--spec loop(#state{}) -> no_return().
-
-loop(State) ->
- receive
- {gs, code_listbox, click, Data, [Idx, Txt | _]} ->
- NewState = update_module_box(State,Idx,Data,Txt),
- loop(NewState);
- {gs, module_listbox, click, Data, [Idx, _Txt | _]} ->
- NewState = update_fun(State,Idx,Data),
- loop(NewState);
- {gs, compmod, click, _, _} ->
- loop(compile(State));
- {gs, prof, click, [], ["Turn off\nProfiling"]} ->
- hipe_profile:prof_module_off(State#state.mod),
- loop(update_module_box(State,State#state.mindex,State#state.mods,""));
- {gs, prof, click, [], _} ->
- hipe_profile:prof_module(State#state.mod),
- loop(update_module_box(State,State#state.mindex,State#state.mods,""));
- {gs, win, configure, _, _} ->
- gs:config(win, [{width, ?WINDOW_WIDTH}, {height, ?WINDOW_HEIGHT}]),
- loop(State);
-
- show_window when State#state.win_created =:= true ->
- gs:config(win, [raise]),
- loop(State);
- show_window when State#state.win_created =:= false ->
- loop((init_window(State))#state{win_created = true});
-
- {gs, _Id, click, close_menu, _Args} ->
- gs:destroy(win),
- loop(State#state{win_created = false});
- {gs, _Id, keypress, _Data, [c, _, 0, 1 | _]} ->
- gs:destroy(win),
- loop(State#state{win_created = false});
- {gs, _Id, keypress, _Data, ['C', _, 1, 1 | _]} ->
- gs:destroy(win),
- loop(State#state{win_created = false});
- {gs, _Id, keypress, _Data, _Args} ->
- loop(State);
- {gs, _, destroy, _, _} ->
- loop(State#state{win_created = false});
-
- {compilation_done, _Res, Sender} ->
- case State#state.compiling of
- Sender ->
- catch gs:config(compmod, [{enable, true}]),
- update_text(compiling, ""),
- loop(update_module_box(State,
- State#state.mindex,
- State#state.mods, ""));
- _ ->
- loop(State)
- end;
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
- _Other ->
- io:format("HiPE window received message ~p ~n", [_Other]),
- loop(State)
- after
- ?POLL_INTERVAL ->
- loop(update_code_listbox(State))
- end.
-
--spec init_window(#state{}) -> #state{}.
-
-init_window(State) ->
- create_window(State),
- gs:config(win, [{map,true}]),
- update_code_listbox(State#state{win_created = true}).
-
--spec create_window(#state{}) -> 'ok'.
-
-create_window(State) ->
- gs:window(win, gs:start(), [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[HiPE] Code list"},
- {configure, true},
- {destroy, true},
- {cursor, arrow},
- {keypress, true}
- ]),
- create_menu(),
- Xpos = 4,
- Ypos1 = 60,
- Width = (?WINDOW_WIDTH - (Xpos*4)) div 3,
- create_labels([{mods,Ypos1-20,"Loaded Modules"}], Xpos + 1 + 3),
- Xpos2 = Xpos*2+Width,
- create_labels([{mod,Ypos1-20,"Module:"++atom_to_list(State#state.mod)},
- {ver,Ypos1,""},
- {time,Ypos1+20,""},
- {native,Ypos1+40,""},
- {compiling,Ypos1+60,""}], Xpos2),
- create_labels([{function,Ypos1-20,"Function:"},
- {nativefun,Ypos1,""}], Xpos*3+Width*2),
- Ypos = 240,
- Height1 = ?WINDOW_HEIGHT - Ypos1 - Xpos,
- Height = ?WINDOW_HEIGHT - Ypos - Xpos,
- gs:listbox(code_listbox, win, [{x, Xpos},
- {y, Ypos1},
- {width, Width},
- {height, Height1},
- {bg, {255,255,255}},
- {vscroll, right},
- {hscroll, true},
- {click, true}]),
- gs:listbox(module_listbox, win, [{x, Xpos*2+Width},
- {y, Ypos},
- {width, Width},
- {height, Height},
- {bg, {255,255,255}},
- {vscroll, right},
- {hscroll, true},
- {click, true}]),
- gs:listbox(profile_listbox, win, [{x, Xpos*3+Width*2},
- {y, Ypos1+40},
- {width, Width},
- {height, Height-60},
- {bg, {255,255,255}},
- {vscroll, right},
- {hscroll, true},
- {click, true}]),
- gs:button(compmod,win,[{label,{text,"Compile\nModule"}},
- {justify,center},
- {x,Xpos*2+Width*1},
- {height,60},
- {y,Ypos-80}]),
- gs:button(prof,win,[{label,{text,"Profile\nModule"}},
- {justify,center},
- {x,Xpos*2+Width*1+100},
- {height,60},
- {y,Ypos-80}]),
- gs:button(clearprof,win,[{label, {text,"Clear\nProfile"}},
- {justify, center},
- {x, Xpos*2+Width*1+200},
- {height, 60},
- {y, Ypos-80}]),
- gs:editor(edoc,win,[{x, Xpos*3+Width*2}, {y, Ypos},
- {width, Width}, {height, Height},
- {insert, {'end',"Edit this text!"}},
- {vscroll, right},
- {hscroll, true},
- {wrap, none}]),
- ok.
-
--spec create_menu() -> 'ok'.
-
-create_menu() ->
- gs:menubar(menubar, win, [{bg, ?DEFAULT_BG_COLOR}]),
- create_sub_menus([{mbutt, fmenu, " File",
- [{" Close Ctrl-C ",close_menu}]},
- {mbuttc,cmenu, " Compile ",
- [{" Compile Module", comp_mod}]},
- {mbuttp,pmenu, " Profile ",
- [{" Profile Module", prof_mod}]},
- {mbutte,emenu, " Edoc", [separator]},
- {mbutta,amenu, " Analyze ", [separator]},
- {mbuttb,bmenu, " Benchmark ", [separator]},
- {mbuttj,jmenu, " Jit ", [separator]}]),
- ok.
-
-create_menuitems(Parent, [{Text,Data}|Rest]) ->
- gs:menuitem(Parent, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, Text}},
- {data, Data},
- {underline, 1}
- ]),
- create_menuitems(Parent, Rest);
-create_menuitems(Parent, [separator|Rest]) ->
- gs:menuitem(Parent, [{itemtype, separator}]),
- create_menuitems(Parent, Rest);
-create_menuitems(_, []) -> ok.
-
-create_sub_menus([{Parent, Name, Text, Items}|Rest]) ->
- BG = {bg, ?DEFAULT_BG_COLOR},
- FG = {fg, {178, 34, 34}}, % firebrick
- Label = {label, {text, Text}},
- gs:menubutton(Parent, menubar, [BG, FG, Label, {underline, 1}]),
- gs:menu(Name, Parent, [BG, FG]),
- create_menuitems(Name, Items),
- create_sub_menus(Rest);
-create_sub_menus([]) -> ok.
-
-create_labels([{Name,Y,Text}|Rest], Xpos) ->
- gs:label(Name, win, [{width, (?WINDOW_WIDTH - 16) div 3},
- {height, 20},
- {x, Xpos + 1 + 3},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NORMAL_FG_COLOR},
- {font, ?HEADER_FONT},
- {align, w},
- {label, {text, Text}}
- ]),
- create_labels(Rest,Xpos);
-create_labels([],_) -> ok.
-
--spec update_code_listbox(#state{}) -> #state{}.
-
-update_code_listbox(State) ->
- Mods = lists:sort(mods()),
- case State#state.win_created of
- false ->
- State;
- true ->
- case Mods =:= State#state.mods of
- true -> State;
- false ->
- update_text(mods,
- "Loaded Modules ("++
- integer_to_list(length(Mods))++")"),
- catch gs:config(code_listbox, [{data, Mods},
- {items, Mods},
- {selection, 0}]),
- update_module_box(State#state{mods = Mods}, 0, Mods, "")
- end
- end.
-
--spec update_fun(#state{}, integer(), [mfa()]) -> #state{}.
-
-update_fun(State, Idx, Data) ->
- case State#state.win_created of
- false ->
- State;
- true ->
- MFA = {M,F,A} = get_selection(Idx, Data, {?MODULE,start,0}),
- update_text(function, "Function: "++mfa_to_string(MFA)),
- case in_native(F, A, native_code(M)) of
- true -> update_text(nativefun, "Native");
- false -> update_text(nativefun, "Emulated")
- end,
- State
- end.
-
-get_selection(Idx, Data, Default) ->
- try lists:nth(Idx+1, Data) catch _:_ -> Default end.
-
--spec update_module_box(#state{}, integer(), [atom()], string()) -> #state{}.
-
-update_module_box(State, Idx, Data, _Txt) ->
- case State#state.win_created of
- false ->
- State;
- true ->
- Mod = get_selection(Idx, Data, hipe_tool),
- %% io:format("~w\n", [Mod:module_info()]),
- Info = Mod:module_info(),
- Funs = lists:usort(funs(Mod)),
- MFAs = mfas(Mod, Funs),
- ModText = atom_to_list(Mod),
- update_text(mod, "Module:"++ModText),
- update_text(compmod, "Compile\nModule\n"++ModText),
- Options = get_compile(Info),
- update_text(ver, get_version(Options)),
- update_text(time, get_time(Options)),
- NativeCode = native_code(Mod),
-
- Prof = is_profiled(Mod),
- if Prof -> update_text(prof, "Turn off\nProfiling");
- true -> update_text(prof, "Profile\n"++ModText)
- end,
-
- Mode = get_mode(Funs, NativeCode),
-
- update_text(native, Mode),
- Items = fun_names(Mod, Funs, NativeCode, Prof),
-
- Selection = {selection, 0},
- catch gs:config(module_listbox, [{data, MFAs},
- {items, Items},
- Selection]),
- ProfData = [mfa_to_string(element(1, X)) ++ " " ++
- integer_to_list(element(2,X))
- || X <- hipe_profile:res(), element(2, X) > 0],
- catch gs:config(profile_listbox, [{data, ProfData},
- {items, ProfData},
- Selection]),
- get_edoc(Mod),
- update_fun(State#state{mindex = Idx, mod = Mod, funs = Funs}, 0, MFAs)
- end.
-
-update_text(Lab, Text) ->
- catch gs:config(Lab, [{label, {text, Text}}]).
-
-%%---------------------------------------------------------------------
-%% @doc Returns a list of all loaded modules.
-%%---------------------------------------------------------------------
-
--spec mods() -> [atom()].
-
-mods() ->
- [Mod || {Mod,_File} <- code:all_loaded()].
-
--spec funs(module()) -> [fa()].
-
-funs(Mod) ->
- Mod:module_info(functions).
-
--spec native_code(module()) -> [fa_address()].
-
-native_code(Mod) ->
- Mod:module_info(native_addresses).
-
--spec mfas(atom(), [fa()]) -> [mfa()].
-
-mfas(Mod, Funs) ->
- [{Mod,F,A} || {F,A} <- Funs].
-
--spec fun_names(atom(), [fa()], [fa_address()], boolean()) -> [string()].
-
-fun_names(M, Funs, NativeCode, Prof) ->
- [atom_to_list(F) ++ "/" ++ integer_to_list(A)
- ++
- (case in_native(F, A, NativeCode) of
- true -> " [native] ";
- false -> ""
- end)
- ++
- if Prof ->
- (catch integer_to_list(hipe_bifs:call_count_get({M,F,A})));
- true -> ""
- end
- || {F,A} <- Funs].
-
--spec in_native(atom(), arity(), [fa_address()]) -> boolean().
-
-in_native(F, A, NativeCode) ->
- lists:any(fun({Fun,Arity,_}) ->
- (Fun =:= F andalso Arity =:= A)
- end,
- NativeCode).
-
--spec mfa_to_string(mfa()) -> [char(),...].
-
-mfa_to_string({M,F,A}) ->
- atom_to_list(M) ++ ":" ++ atom_to_list(F) ++ "/" ++ integer_to_list(A).
-
-get_mode(Funs, NativeCode) ->
- case NativeCode of
- [] -> "Emulated";
- InNative when is_list(InNative) ->
- if length(InNative) =:= length(Funs) ->
- "Native";
- true -> "Mixed"
- end
- end.
-
-get_time(Comp) ->
- case lists:keyfind(time, 1, Comp) of
- {_, {Y,Month,D,H,Min,S}} ->
- integer_to_list(Y) ++
- "-" ++ integer_to_list(Month) ++
- "-" ++ integer_to_list(D) ++ " " ++
- integer_to_list(H) ++ ":" ++ integer_to_list(Min) ++
- ":" ++ integer_to_list(S);
- false -> ""
- end.
-
-get_version(Comp) ->
- case lists:keyfind(version, 1, Comp) of
- {_, V} when is_list(V) -> V;
- false -> ""
- end.
-
-get_cwd(Options) ->
- case lists:keyfind(cwd, 1, Options) of
- {_, V} when is_atom(V) -> atom_to_list(V);
- {_, V} -> V;
- false -> ""
- end.
-
-get_options(Comp) ->
- case lists:keyfind(options, 1, Comp) of
- {_, V} when is_list(V) -> V;
- false -> ""
- end.
-
-get_compile(Info) ->
- case lists:keyfind(compile, 1, Info) of
- {_, O} when is_list(O) -> O;
- false -> []
- end.
-
--spec is_profiled(atom()) -> boolean().
-
-is_profiled(Mod) ->
- case hipe_bifs:call_count_get({Mod,module_info,0}) of
- false -> false;
- C when is_integer(C) -> true
- end.
-
--spec compile(#state{}) -> #state{}.
-
-compile(State) ->
- catch gs:config(compmod, [{enable, false}]),
- update_text(compiling, "Compiling..."),
- Parent = self(),
- P = spawn(fun() -> c(Parent, State#state.mod, State#state.options) end),
- State#state{compiling = P}.
-
--spec c(pid(), atom(), comp_options()) -> 'ok'.
-
-c(Parent, Mod, Options) ->
- Res = hipe:c(Mod, Options),
- Parent ! {compilation_done,Res,self()},
- ok.
-
-get_edoc(Mod) ->
- Info = Mod:module_info(),
- Comp = get_compile(Info),
- Options = get_options(Comp),
- Dir = get_cwd(Options),
- File =
- case Dir of
- "" -> atom_to_list(Mod) ++ ".erl";
- _ -> Dir ++"/" ++ atom_to_list(Mod) ++ ".erl"
- end,
- %% io:format("Get ~s\n", [File]),
- Text = try edoc(File, [{xml_export,xmerl_text}, no_output])
- catch _:_ -> "error"
- end,
- gs:config(edoc, {enable, true}),
- gs:config(edoc, clear),
- gs:config(edoc, {insert, {insert, Text}}),
- gs:config(edoc, {enable, false}),
- ok.
-
-edoc(Name, Opts) ->
- Doc = edoc:get_doc(Name, Opts),
- %% Comments = edoc:read_comments(Name, Opts),
- %% Text = edoc:forms(Forms, Comments, Name, Opts),
- edoc:layout(Doc, Opts),
- ok.
diff --git a/lib/inets/doc/src/notes.xml b/lib/inets/doc/src/notes.xml
index a6f2933f6a..f77214c589 100644
--- a/lib/inets/doc/src/notes.xml
+++ b/lib/inets/doc/src/notes.xml
@@ -32,7 +32,23 @@
<file>notes.xml</file>
</header>
- <section><title>Inets 5.9.7</title>
+ <section><title>Inets 5.9.8</title>
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Mend max_clients check that was broken and avoid too
+ extensive logging that could cause memory problems.</p>
+ <p>
+ Own Id: OTP-11557 Aux Id: seq12478 </p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>Inets 5.9.7</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/inets/src/http_lib/http_request.erl b/lib/inets/src/http_lib/http_request.erl
index aa9f9f6774..f295453bdd 100644
--- a/lib/inets/src/http_lib/http_request.erl
+++ b/lib/inets/src/http_lib/http_request.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -40,9 +40,6 @@ headers([Header | Tail], Headers) ->
headers(Tail, headers(http_util:to_lower(string:strip(Key)),
string:strip(Value), Headers));
{_, []} ->
- Report = io_lib:format("Ignored invalid HTTP-header: ~p~n",
- [Header]),
- error_logger:error_report(Report),
headers(Tail, Headers)
end.
diff --git a/lib/inets/src/http_server/Makefile b/lib/inets/src/http_server/Makefile
index 67555d5f1c..2660d04d16 100644
--- a/lib/inets/src/http_server/Makefile
+++ b/lib/inets/src/http_server/Makefile
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2005-2012. All Rights Reserved.
+# Copyright Ericsson AB 2005-2013. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -43,6 +43,7 @@ MODULES = \
httpd \
httpd_acceptor \
httpd_acceptor_sup \
+ httpd_connection_sup\
httpd_cgi \
httpd_conf \
httpd_example \
diff --git a/lib/inets/src/http_server/httpd.erl b/lib/inets/src/http_server/httpd.erl
index 93608dbf96..6052ae9022 100644
--- a/lib/inets/src/http_server/httpd.erl
+++ b/lib/inets/src/http_server/httpd.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2010. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -36,13 +36,6 @@
%% API
-export([parse_query/1, reload_config/2, info/1, info/2, info/3]).
-%% Internal debugging and status info stuff...
--export([
- get_status/1, get_status/2, get_status/3,
- get_admin_state/0, get_admin_state/1, get_admin_state/2,
- get_usage_state/0, get_usage_state/1, get_usage_state/2
- ]).
-
%%%========================================================================
%%% API
%%%========================================================================
@@ -296,136 +289,6 @@ make_name(Addr, Port) ->
httpd_util:make_name("httpd", Addr, Port).
-%%%--------------------------------------------------------------
-%%% Internal debug functions - Do we want these functions here!?
-%%%--------------------------------------------------------------------
-
-%%% =========================================================
-%%% Function: get_admin_state/0, get_admin_state/1, get_admin_state/2
-%%% get_admin_state()
-%%% get_admin_state(Port)
-%%% get_admin_state(Addr,Port)
-%%%
-%%% Returns: {ok,State} | {error,Reason}
-%%%
-%%% Description: This function is used to retrieve the administrative
-%%% state of the HTTP server.
-%%%
-%%% Types: Port -> integer()
-%%% Addr -> {A,B,C,D} | string() | undefined
-%%% State -> unblocked | shutting_down | blocked
-%%% Reason -> term()
-%%%
-get_admin_state() -> get_admin_state(undefined,8888).
-get_admin_state(Port) when is_integer(Port) -> get_admin_state(undefined,Port);
-
-get_admin_state(ConfigFile) when is_list(ConfigFile) ->
- case get_addr_and_port(ConfigFile) of
- {ok,Addr,Port} ->
- unblock(Addr,Port);
- Error ->
- Error
- end.
-
-get_admin_state(Addr,Port) when is_integer(Port) ->
- Name = make_name(Addr,Port),
- case whereis(Name) of
- Pid when is_pid(Pid) ->
- httpd_manager:get_admin_state(Pid);
- _ ->
- {error,not_started}
- end.
-
-
-
-%%% =========================================================
-%%% Function: get_usage_state/0, get_usage_state/1, get_usage_state/2
-%%% get_usage_state()
-%%% get_usage_state(Port)
-%%% get_usage_state(Addr,Port)
-%%%
-%%% Returns: {ok,State} | {error,Reason}
-%%%
-%%% Description: This function is used to retrieve the usage
-%%% state of the HTTP server.
-%%%
-%%% Types: Port -> integer()
-%%% Addr -> {A,B,C,D} | string() | undefined
-%%% State -> idle | active | busy
-%%% Reason -> term()
-%%%
-get_usage_state() -> get_usage_state(undefined,8888).
-get_usage_state(Port) when is_integer(Port) -> get_usage_state(undefined,Port);
-
-get_usage_state(ConfigFile) when is_list(ConfigFile) ->
- case get_addr_and_port(ConfigFile) of
- {ok,Addr,Port} ->
- unblock(Addr,Port);
- Error ->
- Error
- end.
-
-get_usage_state(Addr,Port) when is_integer(Port) ->
- Name = make_name(Addr,Port),
- case whereis(Name) of
- Pid when is_pid(Pid) ->
- httpd_manager:get_usage_state(Pid);
- _ ->
- {error,not_started}
- end.
-
-
-
-%%% =========================================================
-%% Function: get_status(ConfigFile) -> Status
-%% get_status(Port) -> Status
-%% get_status(Addr,Port) -> Status
-%% get_status(Port,Timeout) -> Status
-%% get_status(Addr,Port,Timeout) -> Status
-%%
-%% Arguments: ConfigFile -> string()
-%% Configuration file from which Port and
-%% BindAddress will be extracted.
-%% Addr -> {A,B,C,D} | string()
-%% Bind Address of the http server
-%% Port -> integer()
-%% Port number of the http server
-%% Timeout -> integer()
-%% Timeout time for the call
-%%
-%% Returns: Status -> list()
-%%
-%% Description: This function is used when the caller runs in the
-%% same node as the http server or if calling with a
-%% program such as erl_call (see erl_interface).
-%%
-
-get_status(ConfigFile) when is_list(ConfigFile) ->
- case get_addr_and_port(ConfigFile) of
- {ok,Addr,Port} ->
- get_status(Addr,Port);
- Error ->
- Error
- end;
-
-get_status(Port) when is_integer(Port) ->
- get_status(undefined,Port,5000).
-
-get_status(Port,Timeout) when is_integer(Port) andalso is_integer(Timeout) ->
- get_status(undefined,Port,Timeout);
-
-get_status(Addr,Port) ->
- get_status(Addr,Port,5000).
-
-get_status(Addr,Port,Timeout) when is_integer(Port) ->
- Name = make_name(Addr,Port),
- case whereis(Name) of
- Pid when is_pid(Pid) ->
- httpd_manager:get_status(Pid,Timeout);
- _ ->
- not_started
- end.
-
do_reload_config(ConfigList, Mode) ->
case (catch httpd_conf:validate_properties(ConfigList)) of
{ok, Config} ->
@@ -438,85 +301,6 @@ do_reload_config(ConfigList, Mode) ->
Error
end.
-
%%%--------------------------------------------------------------
%%% Deprecated
%%%--------------------------------------------------------------
-
-%% start() ->
-%% start("/var/tmp/server_root/conf/8888.conf").
-
-%% start(ConfigFile) ->
-%% {ok, Pid} = inets:start(httpd, ConfigFile, stand_alone),
-%% unlink(Pid),
-%% {ok, Pid}.
-
-%% start_link() ->
-%% start("/var/tmp/server_root/conf/8888.conf").
-
-%% start_link(ConfigFile) when is_list(ConfigFile) ->
-%% inets:start(httpd, ConfigFile, stand_alone).
-
-%% stop() ->
-%% stop(8888).
-
-%% stop(Port) when is_integer(Port) ->
-%% stop(undefined, Port);
-%% stop(Pid) when is_pid(Pid) ->
-%% old_stop(Pid);
-%% stop(ConfigFile) when is_list(ConfigFile) ->
-%% old_stop(ConfigFile).
-
-%% stop(Addr, Port) when is_integer(Port) ->
-%% old_stop(Addr, Port).
-
-%% start_child() ->
-%% start_child("/var/tmp/server_root/conf/8888.conf").
-
-%% start_child(ConfigFile) ->
-%% httpd_sup:start_child(ConfigFile).
-
-%% stop_child() ->
-%% stop_child(8888).
-
-%% stop_child(Port) ->
-%% stop_child(undefined, Port).
-
-%% stop_child(Addr, Port) when is_integer(Port) ->
-%% httpd_sup:stop_child(Addr, Port).
-
-%% restart() -> reload(undefined, 8888).
-
-%% restart(Port) when is_integer(Port) ->
-%% reload(undefined, Port).
-%% restart(Addr, Port) ->
-%% reload(Addr, Port).
-
-%% old_stop(Pid) when is_pid(Pid) ->
-%% do_stop(Pid);
-%% old_stop(ConfigFile) when is_list(ConfigFile) ->
-%% case get_addr_and_port(ConfigFile) of
-%% {ok, Addr, Port} ->
-%% old_stop(Addr, Port);
-
-%% Error ->
-%% Error
-%% end;
-%% old_stop(_StartArgs) ->
-%% ok.
-
-%% old_stop(Addr, Port) when is_integer(Port) ->
-%% Name = old_make_name(Addr, Port),
-%% case whereis(Name) of
-%% Pid when is_pid(Pid) ->
-%% do_stop(Pid),
-%% ok;
-%% _ ->
-%% not_started
-%% end.
-
-%% do_stop(Pid) ->
-%% exit(Pid, shutdown).
-
-%% old_make_name(Addr,Port) ->
-%% httpd_util:make_name("httpd_instance_sup",Addr,Port).
diff --git a/lib/inets/src/http_server/httpd_acceptor.erl b/lib/inets/src/http_server/httpd_acceptor.erl
index 1bffcc1f12..e812bc76f5 100644
--- a/lib/inets/src/http_server/httpd_acceptor.erl
+++ b/lib/inets/src/http_server/httpd_acceptor.erl
@@ -21,13 +21,13 @@
-include("httpd.hrl").
-include("httpd_internal.hrl").
--include("inets_internal.hrl").
+%%-include("inets_internal.hrl").
%% Internal application API
--export([start_link/6, start_link/7]).
+-export([start_link/7, start_link/8]).
%% Other exports (for spawn's etc.)
--export([acceptor_init/7, acceptor_init/8, acceptor_loop/6]).
+-export([acceptor_init/8, acceptor_init/9, acceptor_loop/8]).
%%
%% External API
@@ -36,51 +36,52 @@
%% start_link
start_link(Manager, SocketType, Addr, Port, IpFamily, ConfigDb, AcceptTimeout) ->
- ?hdrd("start link",
- [{manager, Manager},
- {socket_type, SocketType},
- {address, Addr},
- {port, Port},
- {timeout, AcceptTimeout}]),
+ %% ?hdrd("start link",
+ %% [{manager, Manager},
+ %% {socket_type, SocketType},
+ %% {address, Addr},
+ %% {port, Port},
+ %% {timeout, AcceptTimeout}]),
Args = [self(), Manager, SocketType, Addr, Port, IpFamily, ConfigDb, AcceptTimeout],
proc_lib:start_link(?MODULE, acceptor_init, Args).
-start_link(Manager, SocketType, ListenSocket, IpFamily, ConfigDb, AcceptTimeout) ->
- ?hdrd("start link",
- [{manager, Manager},
- {socket_type, SocketType},
- {listen_socket, ListenSocket},
- {timeout, AcceptTimeout}]),
- Args = [self(), Manager, SocketType, ListenSocket, IpFamily,
+start_link(Manager, SocketType, Addr, Port, ListenSocket, IpFamily, ConfigDb, AcceptTimeout) ->
+ %% ?hdrd("start link",
+ %% [{manager, Manager},
+ %% {socket_type, SocketType},
+ %% {listen_socket, ListenSocket},
+ %% {timeout, AcceptTimeout}]),
+ Args = [self(), Manager, SocketType, Addr, Port, ListenSocket, IpFamily,
ConfigDb, AcceptTimeout],
proc_lib:start_link(?MODULE, acceptor_init, Args).
-acceptor_init(Parent, Manager, SocketType, {ListenOwner, ListenSocket}, IpFamily,
+acceptor_init(Parent, Manager, SocketType, Addr, Port, {ListenOwner, ListenSocket}, IpFamily,
ConfigDb, AcceptTimeout) ->
- ?hdrd("acceptor init",
- [{parent, Parent},
- {manager, Manager},
- {socket_type, SocketType},
- {listen_owner, ListenOwner},
- {listen_socket, ListenSocket},
- {timeout, AcceptTimeout}]),
+ %% ?hdrd("acceptor init",
+ %% [{parent, Parent},
+ %% {manager, Manager},
+ %% {socket_type, SocketType},
+ %% {listen_owner, ListenOwner},
+ %% {listen_socket, ListenSocket},
+ %% {timeout, AcceptTimeout}]),
link(ListenOwner),
proc_lib:init_ack(Parent, {ok, self()}),
- acceptor_loop(Manager, SocketType, ListenSocket, IpFamily, ConfigDb, AcceptTimeout).
+ acceptor_loop(Manager, SocketType, Addr, Port,
+ ListenSocket, IpFamily, ConfigDb, AcceptTimeout).
acceptor_init(Parent, Manager, SocketType, Addr, Port, IpFamily,
ConfigDb, AcceptTimeout) ->
- ?hdrd("acceptor init",
- [{parent, Parent},
- {manager, Manager},
- {socket_type, SocketType},
- {address, Addr},
- {port, Port},
- {timeout, AcceptTimeout}]),
+ %% ?hdrd("acceptor init",
+ %% [{parent, Parent},
+ %% {manager, Manager},
+ %% {socket_type, SocketType},
+ %% {address, Addr},
+ %% {port, Port},
+ %% {timeout, AcceptTimeout}]),
case (catch do_init(SocketType, Addr, Port, IpFamily)) of
{ok, ListenSocket} ->
proc_lib:init_ack(Parent, {ok, self()}),
- acceptor_loop(Manager, SocketType,
+ acceptor_loop(Manager, SocketType, Addr, Port,
ListenSocket, IpFamily,ConfigDb, AcceptTimeout);
Error ->
proc_lib:init_ack(Parent, Error),
@@ -88,67 +89,68 @@ acceptor_init(Parent, Manager, SocketType, Addr, Port, IpFamily,
end.
do_init(SocketType, Addr, Port, IpFamily) ->
- ?hdrt("do init", []),
+ %% ?hdrt("do init", []),
do_socket_start(SocketType),
ListenSocket = do_socket_listen(SocketType, Addr, Port, IpFamily),
{ok, ListenSocket}.
do_socket_start(SocketType) ->
- ?hdrt("do socket start", []),
+ %% ?hdrt("do socket start", []),
case http_transport:start(SocketType) of
ok ->
ok;
{error, Reason} ->
- ?hdrv("failed starting transport", [{reason, Reason}]),
+ %% ?hdrv("failed starting transport", [{reason, Reason}]),
throw({error, {socket_start_failed, Reason}})
end.
do_socket_listen(SocketType, Addr, Port, IpFamily) ->
- ?hdrt("do socket listen", []),
+ %% ?hdrt("do socket listen", []),
case http_transport:listen(SocketType, Addr, Port, IpFamily) of
{ok, ListenSocket} ->
ListenSocket;
{error, Reason} ->
- ?hdrv("listen failed", [{reason, Reason},
- {socket_type, SocketType},
- {addr, Addr},
- {port, Port}]),
+ %% ?hdrv("listen failed", [{reason, Reason},
+ %% {socket_type, SocketType},
+ %% {addr, Addr},
+ %% {port, Port}]),
throw({error, {listen, Reason}})
end.
%% acceptor
-acceptor_loop(Manager, SocketType, ListenSocket, IpFamily, ConfigDb, AcceptTimeout) ->
- ?hdrd("awaiting accept",
- [{manager, Manager},
- {socket_type, SocketType},
- {listen_socket, ListenSocket},
- {timeout, AcceptTimeout}]),
+acceptor_loop(Manager, SocketType, Addr, Port, ListenSocket, IpFamily, ConfigDb, AcceptTimeout) ->
+ %% ?hdrd("awaiting accept",
+ %% [{manager, Manager},
+ %% {socket_type, SocketType},
+ %% {listen_socket, ListenSocket},
+ %% {timeout, AcceptTimeout}]),
case (catch http_transport:accept(SocketType, ListenSocket, 50000)) of
{ok, Socket} ->
- ?hdrv("accepted", [{socket, Socket}]),
- handle_connection(Manager, ConfigDb, AcceptTimeout,
+ %% ?hdrv("accepted", [{socket, Socket}]),
+ handle_connection(Addr, Port, Manager, ConfigDb, AcceptTimeout,
SocketType, Socket),
- ?MODULE:acceptor_loop(Manager, SocketType,
+ ?MODULE:acceptor_loop(Manager, SocketType, Addr, Port,
ListenSocket, IpFamily, ConfigDb,AcceptTimeout);
{error, Reason} ->
- ?hdri("accept failed", [{reason, Reason}]),
+ %% ?hdri("accept failed", [{reason, Reason}]),
handle_error(Reason, ConfigDb),
- ?MODULE:acceptor_loop(Manager, SocketType, ListenSocket,
+ ?MODULE:acceptor_loop(Manager, SocketType, Addr, Port, ListenSocket,
IpFamily, ConfigDb, AcceptTimeout);
{'EXIT', Reason} ->
- ?hdri("accept exited", [{reason, Reason}]),
+ %% ?hdri("accept exited", [{reason, Reason}]),
ReasonString =
lists:flatten(io_lib:format("Accept exit: ~p", [Reason])),
accept_failed(ConfigDb, ReasonString)
end.
-handle_connection(Manager, ConfigDb, AcceptTimeout, SocketType, Socket) ->
- {ok, Pid} = httpd_request_handler:start(Manager, ConfigDb, AcceptTimeout),
+handle_connection(Address, Port, Manager, ConfigDb, AcceptTimeout, SocketType, Socket) ->
+ Sup = httpd_connection_sup:connection_sup(Address, Port),
+ {ok, Pid} = httpd_connection_sup:start_child(Sup, [Manager, ConfigDb, AcceptTimeout]),
http_transport:controlling_process(SocketType, Socket, Pid),
httpd_request_handler:socket_ownership_transfered(Pid, SocketType, Socket).
diff --git a/lib/inets/src/http_server/httpd_acceptor_sup.erl b/lib/inets/src/http_server/httpd_acceptor_sup.erl
index df837b5a24..cc2b582b52 100644
--- a/lib/inets/src/http_server/httpd_acceptor_sup.erl
+++ b/lib/inets/src/http_server/httpd_acceptor_sup.erl
@@ -27,7 +27,8 @@
-behaviour(supervisor).
%% API
--export([start_link/2, start_acceptor/6, start_acceptor/7, stop_acceptor/2]).
+-export([start_link/1]).
+%%, start_acceptor/6, start_acceptor/7, stop_acceptor/2]).
%% Supervisor callback
-export([init/1]).
@@ -35,63 +36,48 @@
%%%=========================================================================
%%% API
%%%=========================================================================
-start_link(Addr, Port) ->
+start_link([Addr, Port| _] = Args) ->
SupName = make_name(Addr, Port),
- supervisor:start_link({local, SupName}, ?MODULE, []).
-
-%%----------------------------------------------------------------------
-%% Function: [start|stop]_acceptor/5
-%% Description: Starts/stops an [auth | security] worker (child) process
-%%----------------------------------------------------------------------
-start_acceptor(SocketType, Addr, Port, IpFamily, ConfigDb, AcceptTimeout) ->
- start_worker(httpd_acceptor, SocketType, Addr, Port, IpFamily,
- ConfigDb, AcceptTimeout, self(), []).
-start_acceptor(SocketType, Addr, Port, IpFamily, ConfigDb, AcceptTimeout, ListenSocket) ->
- start_worker(httpd_acceptor, SocketType, Addr, Port, IpFamily,
- ConfigDb, AcceptTimeout, ListenSocket, self(), []).
-
-
-stop_acceptor(Addr, Port) ->
- stop_worker(httpd_acceptor, Addr, Port).
+ supervisor:start_link({local, SupName}, ?MODULE, [Args]).
%%%=========================================================================
%%% Supervisor callback
%%%=========================================================================
-init(_) ->
- Flags = {one_for_one, 500, 100},
- Workers = [],
- {ok, {Flags, Workers}}.
+init([Args]) ->
+ RestartStrategy = one_for_one,
+ MaxR = 10,
+ MaxT = 3600,
+ Children = [child_spec(Args)],
+ {ok, {{RestartStrategy, MaxR, MaxT}, Children}}.
%%%=========================================================================
%%% Internal functions
%%%=========================================================================
+child_spec([Address, Port, ConfigList, AcceptTimeout, ListenInfo]) ->
+ Name = id(Address, Port),
+ Manager = httpd_util:make_name("httpd", Address, Port),
+ SockType = proplists:get_value(socket_type, ConfigList, ip_comm),
+ IpFamily = proplists:get_value(ipfamily, ConfigList, inet),
+ StartFunc = case ListenInfo of
+ undefined ->
+ {httpd_acceptor, start_link, [Manager, SockType, Address, Port, IpFamily,
+ httpd_util:make_name("httpd_conf", Address, Port),
+ AcceptTimeout]};
+ _ ->
+ {httpd_acceptor, start_link, [Manager, SockType, Address, Port, ListenInfo,
+ IpFamily,
+ httpd_util:make_name("httpd_conf", Address, Port),
+ AcceptTimeout]}
+ end,
+ Restart = transient,
+ Shutdown = brutal_kill,
+ Modules = [httpd_acceptor],
+ Type = worker,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
-make_name(Addr,Port) ->
- httpd_util:make_name("httpd_acc_sup", Addr, Port).
+id(Address, Port) ->
+ {httpd_acceptor_sup, Address, Port}.
-start_worker(M, SocketType, Addr, Port, IpFamily, ConfigDB, AcceptTimeout, Manager, Modules) ->
- SupName = make_name(Addr, Port),
- Args = [Manager, SocketType, Addr, Port, IpFamily, ConfigDB, AcceptTimeout],
- Spec = {{M, Addr, Port},
- {M, start_link, Args},
- permanent, timer:seconds(1), worker, [M] ++ Modules},
- supervisor:start_child(SupName, Spec).
-
-start_worker(M, SocketType, Addr, Port, IpFamily, ConfigDB, AcceptTimeout, ListenSocket,
- Manager, Modules) ->
- SupName = make_name(Addr, Port),
- Args = [Manager, SocketType, ListenSocket, IpFamily, ConfigDB, AcceptTimeout],
- Spec = {{M, Addr, Port},
- {M, start_link, Args},
- permanent, timer:seconds(1), worker, [M] ++ Modules},
- supervisor:start_child(SupName, Spec).
+make_name(Addr,Port) ->
+ httpd_util:make_name("httpd_acceptor_sup", Addr, Port).
-stop_worker(M, Addr, Port) ->
- SupName = make_name(Addr, Port),
- Name = {M, Addr, Port},
- case supervisor:terminate_child(SupName, Name) of
- ok ->
- supervisor:delete_child(SupName, Name);
- Error ->
- Error
- end.
diff --git a/lib/inets/src/http_server/httpd_connection_sup.erl b/lib/inets/src/http_server/httpd_connection_sup.erl
new file mode 100644
index 0000000000..48c2d8f076
--- /dev/null
+++ b/lib/inets/src/http_server/httpd_connection_sup.erl
@@ -0,0 +1,68 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+%%----------------------------------------------------------------------
+%% Purpose: Ssh connection supervisor.
+%%----------------------------------------------------------------------
+
+-module(httpd_connection_sup).
+
+-behaviour(supervisor).
+
+%% API
+-export([start_link/1]).
+-export([start_child/2, connection_sup/2]).
+
+%% Supervisor callback
+-export([init/1]).
+
+%%%=========================================================================
+%%% API
+%%%=========================================================================
+start_link(Args) ->
+ supervisor:start_link(?MODULE, [Args]).
+
+start_child(Sup, Args) ->
+ supervisor:start_child(Sup, Args).
+
+connection_sup(Addr, Port) ->
+ httpd_util:make_name("httpd_connection_sup", Addr, Port).
+
+%%%=========================================================================
+%%% Supervisor callback
+%%%=========================================================================
+init([[Addr, Port]]) ->
+ RegName = connection_sup(Addr, Port),
+ register(RegName, self()),
+ RestartStrategy = simple_one_for_one,
+ MaxR = 0,
+ MaxT = 3600,
+
+ Name = undefined, % As simple_one_for_one is used.
+ StartFunc = {httpd_request_handler, start_link, []},
+ Restart = temporary, % E.g. should not be restarted
+ Shutdown = 4000,
+ Modules = [httpd_request_handler],
+ Type = worker,
+
+ ChildSpec = {Name, StartFunc, Restart, Shutdown, Type, Modules},
+ {ok, {{RestartStrategy, MaxR, MaxT}, [ChildSpec]}}.
+
+
+
diff --git a/lib/inets/src/http_server/httpd_instance_sup.erl b/lib/inets/src/http_server/httpd_instance_sup.erl
index baa60d318c..b95be44b2a 100644
--- a/lib/inets/src/http_server/httpd_instance_sup.erl
+++ b/lib/inets/src/http_server/httpd_instance_sup.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -100,7 +100,9 @@ start_link(ConfigFile, AcceptTimeout, ListenInfo, Debug) ->
init([ConfigFile, ConfigList, AcceptTimeout, Debug, Address, Port]) ->
httpd_util:enable_debug(Debug),
Flags = {one_for_one, 0, 1},
- Children = [sup_spec(httpd_acceptor_sup, Address, Port),
+ Children = [httpd_connection_sup_spec(Address, Port),
+ httpd_acceptor_sup_spec(Address, Port, ConfigList, AcceptTimeout,
+ undefined),
sup_spec(httpd_misc_sup, Address, Port),
worker_spec(httpd_manager, Address, Port,
ConfigFile, ConfigList,AcceptTimeout)],
@@ -108,7 +110,9 @@ init([ConfigFile, ConfigList, AcceptTimeout, Debug, Address, Port]) ->
init([ConfigFile, ConfigList, AcceptTimeout, Debug, Address, Port, ListenInfo]) ->
httpd_util:enable_debug(Debug),
Flags = {one_for_one, 0, 1},
- Children = [sup_spec(httpd_acceptor_sup, Address, Port),
+ Children = [httpd_connection_sup_spec(Address, Port),
+ httpd_acceptor_sup_spec(Address, Port, ConfigList, AcceptTimeout,
+ ListenInfo),
sup_spec(httpd_misc_sup, Address, Port),
worker_spec(httpd_manager, Address, Port, ListenInfo,
ConfigFile, ConfigList, AcceptTimeout)],
@@ -118,6 +122,24 @@ init([ConfigFile, ConfigList, AcceptTimeout, Debug, Address, Port, ListenInfo])
%%%=========================================================================
%%% Internal functions
%%%=========================================================================
+httpd_connection_sup_spec(Address, Port) ->
+ Name = {httpd_connection_sup, Address, Port},
+ StartFunc = {httpd_connection_sup, start_link, [[Address, Port]]},
+ Restart = permanent,
+ Shutdown = 5000,
+ Modules = [httpd_connection_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
+httpd_acceptor_sup_spec(Address, Port, ConfigList, AcceptTimeout, ListenInfo) ->
+ Name = {httpd_acceptor_sup, Address, Port},
+ StartFunc = {httpd_acceptor_sup, start_link, [[Address, Port, ConfigList, AcceptTimeout, ListenInfo]]},
+ Restart = permanent,
+ Shutdown = infinity,
+ Modules = [httpd_acceptor_sup],
+ Type = supervisor,
+ {Name, StartFunc, Restart, Shutdown, Type, Modules}.
+
sup_spec(SupModule, Address, Port) ->
Name = {SupModule, Address, Port},
StartFunc = {SupModule, start_link, [Address, Port]},
@@ -167,5 +189,3 @@ file_2_config(ConfigFile) ->
Error ->
Error
end.
-
-
diff --git a/lib/inets/src/http_server/httpd_manager.erl b/lib/inets/src/http_server/httpd_manager.erl
index 00384fa108..e155498bb8 100644
--- a/lib/inets/src/http_server/httpd_manager.erl
+++ b/lib/inets/src/http_server/httpd_manager.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2000-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2000-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -25,11 +25,11 @@
-behaviour(gen_server).
%% Application internal API
--export([start/2, start_link/2, start_link/3, start_link/4, stop/1, reload/2]).
--export([new_connection/1, done_connection/1]).
--export([config_lookup/2, config_lookup/3,
- config_multi_lookup/2, config_multi_lookup/3,
- config_match/2, config_match/3]).
+-export([start/2, start_link/2, start_link/3, start_link/4,
+ stop/1, reload/2]).
+-export([new_connection/1]).
+-export([config_match/2, config_match/3]).
+-export([block/2, block/3, unblock/1]).
%% gen_server exports
-export([init/1,
@@ -37,34 +37,19 @@
terminate/2,
code_change/3]).
-
-%% Management exports
--export([block/2, block/3, unblock/1]).
--export([get_admin_state/1, get_usage_state/1]).
--export([is_busy/1,is_busy/2,is_busy_or_blocked/1,is_blocked/1]). %% ???????
--export([get_status/1, get_status/2]).
-
--export([c/1]).
-
-record(state,{socket_type = ip_comm,
config_file,
config_db = null,
- connections, %% Current request handlers
+ connection_sup,
admin_state = unblocked,
blocker_ref = undefined,
- blocking_tmr = undefined,
+ blocking_from = undefined,
+ shutdown_poller = undefined,
status = []}).
+%%%--------------------------------------------------------------------
+%%% Application internal API
+%%%--------------------------------------------------------------------
-
-%%TODO: Clean up this module!
-
-c(Port) ->
- Ref = httpd_util:make_name("httpd",undefined,Port),
- call(Ref, fake_close).
-
-%%
-%% External API
-%%
%% Deprecated
start(ConfigFile, ConfigList) ->
Port = proplists:get_value(port,ConfigList,80),
@@ -83,7 +68,8 @@ start_link(ConfigFile, ConfigList, AcceptTimeout) ->
Name = make_name(Addr, Port),
gen_server:start_link({local, Name},?MODULE,
- [ConfigFile, ConfigList, AcceptTimeout, Addr, Port],[]).
+ [ConfigFile, ConfigList,
+ AcceptTimeout, Addr, Port],[]).
start_link(ConfigFile, ConfigList, AcceptTimeout, ListenSocket) ->
Port = proplists:get_value(port, ConfigList, 80),
@@ -93,146 +79,33 @@ start_link(ConfigFile, ConfigList, AcceptTimeout, ListenSocket) ->
gen_server:start_link({local, Name},?MODULE,
[ConfigFile, ConfigList, AcceptTimeout, Addr,
Port, ListenSocket],[]).
-
stop(ServerRef) ->
call(ServerRef, stop).
reload(ServerRef, Conf) ->
call(ServerRef, {reload, Conf}).
-
-%%%----------------------------------------------------------------
-
-block(ServerRef, disturbing) ->
- call(ServerRef,block);
-
-block(ServerRef, non_disturbing) ->
- do_block(ServerRef, non_disturbing, infinity).
+block(ServerRef, Method) ->
+ block(ServerRef, Method, infinity).
block(ServerRef, Method, Timeout) ->
- do_block(ServerRef, Method, Timeout).
-
-
-%% The reason for not using call here, is that the manager cannot
-%% _wait_ for completion of the requests. It must be able to do
-%% do other things at the same time as the blocking goes on.
-do_block(ServerRef, Method, infinity) ->
- Ref = make_ref(),
- cast(ServerRef, {block, Method, infinity, self(), Ref}),
- receive
- {block_reply, Reply, Ref} ->
- Reply
- end;
-do_block(ServerRef,Method,Timeout) when Timeout > 0 ->
- Ref = make_ref(),
- cast(ServerRef,{block,Method,Timeout,self(),Ref}),
- receive
- {block_reply,Reply,Ref} ->
- Reply
- end.
-
-
-%%%----------------------------------------------------------------
-
-%% unblock
+ call(ServerRef, {block, self(), Method, Timeout}).
unblock(ServerRef) ->
- call(ServerRef,unblock).
-
-%% get admin/usage state
-
-get_admin_state(ServerRef) ->
- call(ServerRef,get_admin_state).
-
-get_usage_state(ServerRef) ->
- call(ServerRef,get_usage_state).
-
-
-%% get_status
-
-get_status(ServerRef) ->
- gen_server:call(ServerRef,get_status).
-
-get_status(ServerRef,Timeout) ->
- gen_server:call(ServerRef,get_status,Timeout).
-
-%%
-%% Internal API
-%%
-
-
-%% new_connection
+ call(ServerRef,{unblock, self()}).
new_connection(Manager) ->
- gen_server:call(Manager, {new_connection, self()}, infinity).
-
-%% done
-
-done_connection(Manager) ->
- gen_server:cast(Manager, {done_connection, self()}).
-
-
-%% is_busy(ServerRef) -> true | false
-%%
-%% Tests if the server is (in usage state) busy,
-%% i.e. has rached the heavy load limit.
-%%
-
-is_busy(ServerRef) ->
- gen_server:call(ServerRef,is_busy).
-
-is_busy(ServerRef,Timeout) ->
- gen_server:call(ServerRef,is_busy,Timeout).
-
-
-%% is_busy_or_blocked(ServerRef) -> busy | blocked | false
-%%
-%% Tests if the server is busy (usage state), i.e. has rached,
-%% the heavy load limit, or blocked (admin state) .
-%%
-
-is_busy_or_blocked(ServerRef) ->
- gen_server:call(ServerRef,is_busy_or_blocked).
-
-
-%% is_blocked(ServerRef) -> true | false
-%%
-%% Tests if the server is blocked (admin state) .
-%%
-
-is_blocked(ServerRef) ->
- gen_server:call(ServerRef,is_blocked).
-
-
-%%
-%% Module API. Theese functions are intended for use from modules only.
-%%
-
-config_lookup(Port, Query) ->
- config_lookup(undefined, Port, Query).
-config_lookup(Addr, Port, Query) ->
- Name = httpd_util:make_name("httpd",Addr,Port),
- gen_server:call(whereis(Name), {config_lookup, Query}).
-
-config_multi_lookup(Port, Query) ->
- config_multi_lookup(undefined,Port,Query).
-config_multi_lookup(Addr,Port, Query) ->
- Name = httpd_util:make_name("httpd",Addr,Port),
- gen_server:call(whereis(Name), {config_multi_lookup, Query}).
+ call(Manager, {new_connection, self()}).
config_match(Port, Pattern) ->
config_match(undefined,Port,Pattern).
config_match(Addr, Port, Pattern) ->
Name = httpd_util:make_name("httpd",Addr,Port),
- gen_server:call(whereis(Name), {config_match, Pattern}).
-
-
-%%
-%% Server call-back functions
-%%
-
-%% init
+ call(whereis(Name), {config_match, Pattern}).
+%%%--------------------------------------------------------------------
+%%% gen_server callbacks functions
+%%%--------------------------------------------------------------------
init([ConfigFile, ConfigList, AcceptTimeout, Addr, Port]) ->
process_flag(trap_exit, true),
case (catch do_init(ConfigFile, ConfigList, AcceptTimeout, Addr, Port)) of
@@ -263,47 +136,35 @@ init([ConfigFile, ConfigList, AcceptTimeout, Addr, Port, ListenInfo]) ->
{ok, State}
end.
-do_init(ConfigFile, ConfigList, AcceptTimeout, Addr, Port) ->
- IpFamily = proplists:get_value(ipfamily, ConfigList, inet6fb4),
+do_init(ConfigFile, ConfigList, _AcceptTimeout, Addr, Port) ->
+ Sup = httpd_util:make_name("httpd_connection_sup", Addr, Port),
NewConfigFile = proplists:get_value(file, ConfigList, ConfigFile),
ConfigDB = do_initial_store(ConfigList),
SocketType = httpd_conf:lookup_socket_type(ConfigDB),
- case httpd_acceptor_sup:start_acceptor(SocketType, Addr,
- Port, IpFamily, ConfigDB, AcceptTimeout) of
- {ok, _Pid} ->
- Status = [{max_conn, 0},
- {last_heavy_load, never},
- {last_connection, never}],
+ Status = [{max_conn, 0},
+ {last_heavy_load, never},
+ {last_connection, never}],
State = #state{socket_type = SocketType,
config_file = NewConfigFile,
config_db = ConfigDB,
- connections = [],
+ connection_sup = Sup,
status = Status},
- {ok, State};
- Else ->
- Else
- end.
+ {ok, State}.
-do_init(ConfigFile, ConfigList, AcceptTimeout, Addr, Port, ListenInfo) ->
- IpFamily = proplists:get_value(ipfamily, ConfigList, inet6fb4),
+do_init(ConfigFile, ConfigList, _AcceptTimeout, Addr, Port, _ListenInfo) ->
+ Sup = httpd_util:make_name("httpd_connection_sup", Addr, Port),
NewConfigFile = proplists:get_value(file, ConfigList, ConfigFile),
ConfigDB = do_initial_store(ConfigList),
SocketType = httpd_conf:lookup_socket_type(ConfigDB),
- case httpd_acceptor_sup:start_acceptor(SocketType, Addr,
- Port, IpFamily, ConfigDB,
- AcceptTimeout, ListenInfo) of
- {ok, _Pid} ->
- Status = [{max_conn,0}, {last_heavy_load,never},
- {last_connection,never}],
+ Status = [{max_conn,0}, {last_heavy_load,never},
+ {last_connection,never}],
State = #state{socket_type = SocketType,
config_file = NewConfigFile,
config_db = ConfigDB,
- connections = [],
+ connection_sup = Sup,
status = Status},
- {ok, State};
- Else ->
- Else
- end.
+ {ok, State}.
+
do_initial_store(ConfigList) ->
case httpd_conf:store(ConfigList) of
@@ -313,75 +174,14 @@ do_initial_store(ConfigList) ->
throw({error, Reason})
end.
-
-
-%% handle_call
-
handle_call(stop, _From, State) ->
{stop, normal, ok, State};
-handle_call({config_lookup, Query}, _From, State) ->
- Res = httpd_util:lookup(State#state.config_db, Query),
- {reply, Res, State};
-
-handle_call({config_multi_lookup, Query}, _From, State) ->
- Res = httpd_util:multi_lookup(State#state.config_db, Query),
- {reply, Res, State};
-
handle_call({config_match, Query}, _From, State) ->
Res = ets:match_object(State#state.config_db, Query),
{reply, Res, State};
-handle_call(get_status, _From, State) ->
- ManagerStatus = manager_status(self()),
- S1 = [{current_conn,length(State#state.connections)}|State#state.status]++
- [ManagerStatus],
- {reply,S1,State};
-
-handle_call(is_busy, _From, State) ->
- Reply = case get_ustate(State) of
- busy ->
- true;
- _ ->
- false
- end,
- {reply,Reply,State};
-
-handle_call(is_busy_or_blocked, _From, State) ->
- Reply =
- case get_astate(State) of
- unblocked ->
- case get_ustate(State) of
- busy ->
- busy;
- _ ->
- false
- end;
- _ ->
- blocked
- end,
- {reply,Reply,State};
-
-handle_call(is_blocked, _From, State) ->
- Reply =
- case get_astate(State) of
- unblocked ->
- false;
- _ ->
- true
- end,
- {reply,Reply,State};
-
-handle_call(get_admin_state, _From, State) ->
- Reply = get_astate(State),
- {reply,Reply,State};
-
-handle_call(get_usage_state, _From, State) ->
- Reply = get_ustate(State),
- {reply,Reply,State};
-
-handle_call({reload, Conf}, _From, State)
- when State#state.admin_state =:= blocked ->
+handle_call({reload, Conf}, _From, #state{admin_state = blocked} = State) ->
case handle_reload(Conf, State) of
{stop, Reply,S1} ->
{stop, Reply, S1};
@@ -392,13 +192,32 @@ handle_call({reload, Conf}, _From, State)
handle_call({reload, _}, _From, State) ->
{reply,{error,{invalid_admin_state,State#state.admin_state}},State};
-handle_call(block, _From, State) ->
- {Reply,S1} = handle_block(State),
- {reply,Reply,S1};
+handle_call({block , Blocker, Mode, Timeout}, From,
+ #state{admin_state = unblocked,
+ connection_sup = CSup} = State) ->
+ Monitor = erlang:monitor(process, Blocker),
+ case count_children(CSup) of
+ 0 ->
+ %% Already in idle usage state => go directly to blocked
+ {reply, ok, State#state{admin_state = blocked,
+ blocker_ref = {Blocker, Monitor},
+ blocking_from = From}};
+ _ ->
+ handle_block(Mode, Timeout,
+ State#state{blocker_ref = {Blocker, Monitor},
+ blocking_from = From})
+ end;
+handle_call({block , _, _, _}, _, State) ->
+ {reply, {error, blocked}, State};
+
+handle_call({unblock, Blocker}, _, #state{blocker_ref = {Blocker,_},
+ admin_state = blocked} = State) ->
+
+ {reply, ok,
+ State#state{admin_state = unblocked, blocker_ref = undefined}};
-handle_call(unblock, {From,_Tag}, State) ->
- {Reply,S1} = handle_unblock(State,From),
- {reply, Reply, S1};
+handle_call({unblock, _}, _, State) ->
+ {reply, {error, only_blocker_may_unblock}, State};
handle_call({new_connection, Pid}, _From, State) ->
{Status, NewState} = handle_new_connection(State, Pid),
@@ -415,21 +234,6 @@ handle_call(Request, From, State) ->
report_error(State,String),
{reply, ok, State}.
-
-%% handle_cast
-
-handle_cast({done_connection, Pid}, State) ->
- S1 = handle_done_connection(State, Pid),
- {noreply, S1};
-
-handle_cast({block, disturbing, Timeout, From, Ref}, State) ->
- S1 = handle_block(State, Timeout, From, Ref),
- {noreply,S1};
-
-handle_cast({block, non_disturbing, Timeout, From, Ref}, State) ->
- S1 = handle_nd_block(State, Timeout, From, Ref),
- {noreply,S1};
-
handle_cast(Message, State) ->
String =
lists:flatten(
@@ -440,32 +244,51 @@ handle_cast(Message, State) ->
report_error(State, String),
{noreply, State}.
-%% handle_info
-
-handle_info({block_timeout, Method}, State) ->
- S1 = handle_block_timeout(State,Method),
- {noreply, S1};
+handle_info(connections_terminated, #state{admin_state = shutting_down,
+ blocking_from = From} = State) ->
+ gen_server:reply(From, ok),
+ {noreply, State#state{admin_state = blocked, blocking_from = undefined,
+ blocker_ref = undefined}};
+handle_info(connections_terminated, State) ->
+ {noreply, State};
-handle_info({'DOWN', Ref, process, _Object, _Info}, State) ->
- S1 =
- case State#state.blocker_ref of
- Ref ->
- handle_blocker_exit(State);
- _ ->
- %% Not our blocker, so ignore
- State
- end,
- {noreply, S1};
+handle_info({block_timeout, non_disturbing},
+ #state{admin_state = shutting_down,
+ blocking_from = From,
+ blocker_ref = {_, Monitor}} = State) ->
+ erlang:demonitor(Monitor),
+ gen_server:reply(From, {error, timeout}),
+ {noreply, State#state{admin_state = unblocked, blocking_from = undefined,
+ blocker_ref = undefined}};
+handle_info({block_timeout, disturbing},
+ #state{admin_state = shutting_down,
+ blocking_from = From,
+ blocker_ref = {_, Monitor},
+ connection_sup = Sup} = State) ->
+ SupPid = whereis(Sup),
+ shutdown_connections(SupPid),
+ erlang:demonitor(Monitor),
+ gen_server:reply(From, ok),
+ {noreply, State#state{admin_state = blocked, blocker_ref = undefined,
+ blocking_from = undefined}};
+handle_info({block_timeout, _, _}, State) ->
+ {noreply, State};
+
+handle_info({'DOWN', _, process, Pid, _Info},
+ #state{admin_state = Admin,
+ blocker_ref = {Pid, _}} = State) when
+ Admin =/= unblocked ->
+ {noreply, State#state{admin_state = unblocked,
+ blocking_from = undefined,
+ blocker_ref = undefined}};
+handle_info({'DOWN', _, process, _, _}, State) ->
+ {noreply, State};
handle_info({'EXIT', _, normal}, State) ->
{noreply, State};
-handle_info({'EXIT', _, blocked}, S) ->
- {noreply, S};
-
-handle_info({'EXIT', Pid, Reason}, State) ->
- S1 = check_connections(State, Pid, Reason),
- {noreply, S1};
+handle_info({'EXIT', _, shutdown}, State) ->
+ {stop, shutdown, State};
handle_info(Info, State) ->
String =
@@ -477,217 +300,66 @@ handle_info(Info, State) ->
report_error(State, String),
{noreply, State}.
-
-%% terminate
-
terminate(_, #state{config_db = Db}) ->
httpd_conf:remove_all(Db),
ok.
-
-%% code_change({down,ToVsn}, State, Extra)
-%%
-
code_change({down,_ToVsn}, State, _Extra) ->
{ok,State};
-%% code_change(FromVsn, State, Extra)
-%%
code_change(_FromVsn, State, _Extra) ->
{ok,State}.
-
-
-%% -------------------------------------------------------------------------
-%% check_connection
-%%
-%%
-%%
-%%
-
-check_connections(#state{connections = []} = State, _Pid, _Reason) ->
- State;
-check_connections(#state{connections = Connections} = State, Pid, _Reason) ->
- State#state{connections = lists:delete(Pid, Connections)}.
-
-
-%% -------------------------------------------------------------------------
-%% handle_[new | done]_connection
-%%
-%%
-%%
-%%
-
-handle_new_connection(State, Handler) ->
+%%%--------------------------------------------------------------------
+%%% Internal functions
+%%%--------------------------------------------------------------------
+handle_new_connection(#state{admin_state = AdminState} = State, Handler) ->
UsageState = get_ustate(State),
- AdminState = get_astate(State),
handle_new_connection(UsageState, AdminState, State, Handler).
-handle_new_connection(busy, unblocked, State, _Handler) ->
- Status = update_heavy_load_status(State#state.status),
- {{reject, busy},
- State#state{status = Status}};
-
-handle_new_connection(_UsageState, unblocked, State, Handler) ->
- Connections = State#state.connections,
- Status = update_connection_status(State#state.status,
- length(Connections)+1),
- link(Handler),
- {{ok, accept},
- State#state{connections = [Handler|Connections], status = Status}};
-
-handle_new_connection(_UsageState, _AdminState, State, _Handler) ->
- {{reject, blocked},
- State}.
-
-handle_done_connection(#state{admin_state = shutting_down,
- connections = Connections} = State, Handler) ->
- unlink(Handler),
- case lists:delete(Handler, Connections) of
- [] -> % Ok, block complete
- demonitor_blocker(State#state.blocker_ref),
- {Tmr,From,Ref} = State#state.blocking_tmr,
- stop_block_tmr(Tmr),
- From ! {block_reply,ok,Ref},
- State#state{admin_state = blocked, connections = [],
- blocker_ref = undefined};
- Connections1 ->
- State#state{connections = Connections1}
- end;
-
-handle_done_connection(#state{connections = Connections} = State, Handler) ->
- State#state{connections = lists:delete(Handler, Connections)}.
-
-
-%% -------------------------------------------------------------------------
-%% handle_block
-%%
-%%
-%%
-%%
-handle_block(#state{admin_state = AdminState} = S) ->
- handle_block(S, AdminState).
-
-handle_block(S,unblocked) ->
- %% Kill all connections
- [kill_handler(Pid) || Pid <- S#state.connections],
- {ok,S#state{connections = [], admin_state = blocked}};
-handle_block(S,blocked) ->
- {ok,S};
-handle_block(S,shutting_down) ->
- {{error,shutting_down},S}.
-
-
-kill_handler(Pid) ->
- exit(Pid, blocked).
-
-handle_block(S,Timeout,From,Ref) when Timeout >= 0 ->
- do_block(S,Timeout,From,Ref);
-
-handle_block(S,Timeout,From,Ref) ->
- Reply = {error,{invalid_block_request,Timeout}},
- From ! {block_reply,Reply,Ref},
- S.
-
-do_block(S,Timeout,From,Ref) ->
- case S#state.connections of
- [] ->
- %% Already in idle usage state => go directly to blocked
- From ! {block_reply,ok,Ref},
- S#state{admin_state = blocked};
+handle_new_connection(_UsageState, unblocked,
+ #state{config_db = Db, connection_sup = CSup} =
+ State, _) ->
+ Max = httpd_util:lookup(Db, max_clients),
+ case count_children(CSup) of
+ Count when Count =< Max ->
+ {{ok, accept}, State};
_ ->
- %% Active or Busy usage state => go to shutting_down
- %% Make sure we get to know if blocker dies...
- MonitorRef = monitor_blocker(From),
- Tmr = {start_block_tmr(Timeout,disturbing),From,Ref},
- S#state{admin_state = shutting_down,
- blocker_ref = MonitorRef, blocking_tmr = Tmr}
- end.
-
-handle_nd_block(S,infinity,From,Ref) ->
- do_nd_block(S,infinity,From,Ref);
-
-handle_nd_block(S,Timeout,From,Ref) when Timeout >= 0 ->
- do_nd_block(S,Timeout,From,Ref);
-
-handle_nd_block(S,Timeout,From,Ref) ->
- Reply = {error,{invalid_block_request,Timeout}},
- From ! {block_reply,Reply,Ref},
- S.
-
-do_nd_block(S,Timeout,From,Ref) ->
- case S#state.connections of
- [] ->
- %% Already in idle usage state => go directly to blocked
- From ! {block_reply,ok,Ref},
- S#state{admin_state = blocked};
- _ ->
- %% Active or Busy usage state => go to shutting_down
- %% Make sure we get to know if blocker dies...
- MonitorRef = monitor_blocker(From),
- Tmr = {start_block_tmr(Timeout,non_disturbing),From,Ref},
- S#state{admin_state = shutting_down,
- blocker_ref = MonitorRef, blocking_tmr = Tmr}
- end.
+ {{reject, busy}, State}
+ end;
-handle_block_timeout(S,Method) ->
- %% Time to take this to the road...
- demonitor_blocker(S#state.blocker_ref),
- handle_block_timeout1(S,Method,S#state.blocking_tmr).
-
-handle_block_timeout1(S,non_disturbing,{_,From,Ref}) ->
- From ! {block_reply,{error,timeout},Ref},
- S#state{admin_state = unblocked,
- blocker_ref = undefined, blocking_tmr = undefined};
-
-handle_block_timeout1(S,disturbing,{_,From,Ref}) ->
- [exit(Pid,blocked) || Pid <- S#state.connections],
-
- From ! {block_reply,ok,Ref},
- S#state{admin_state = blocked, connections = [],
- blocker_ref = undefined, blocking_tmr = undefined};
-
-handle_block_timeout1(S,Method,{_,From,Ref}) ->
- From ! {block_reply,{error,{unknown_block_method,Method}},Ref},
- S#state{admin_state = blocked, connections = [],
- blocker_ref = undefined, blocking_tmr = undefined};
-
-handle_block_timeout1(S, _Method, _TmrInfo) ->
- S#state{admin_state = unblocked,
- blocker_ref = undefined, blocking_tmr = undefined}.
-
-handle_unblock(S, FromA) ->
- handle_unblock(S, FromA, S#state.admin_state).
-
-handle_unblock(S, _FromA, unblocked) ->
- {ok,S};
-handle_unblock(S, FromA, _AdminState) ->
- case S#state.blocking_tmr of
- {Tmr,FromB,Ref} ->
- %% Another process is trying to unblock
- %% Inform the blocker
- stop_block_tmr(Tmr),
- FromB ! {block_reply, {error,{unblocked,FromA}},Ref};
- _ ->
- ok
- end,
- {ok,S#state{admin_state = unblocked, blocking_tmr = undefined}}.
-
-%% The blocker died so we give up on the block.
-handle_blocker_exit(S) ->
- {Tmr,_From,_Ref} = S#state.blocking_tmr,
- stop_block_tmr(Tmr),
- S#state{admin_state = unblocked,
- blocker_ref = undefined, blocking_tmr = undefined}.
+handle_new_connection(_UsageState, _AdminState, State, _Handler) ->
+ {{reject, blocked}, State}.
+
+handle_block(disturbing, infinity,
+ #state{connection_sup = CSup,
+ blocking_from = From,
+ blocker_ref = {_, Monitor}} = State) ->
+ SupPid = whereis(CSup),
+ shutdown_connections(SupPid),
+ erlang:demonitor(Monitor),
+ gen_server:reply(From, ok),
+ {noreply, State#state{admin_state = blocked, blocker_ref = undefined,
+ blocking_from = undefined}};
+handle_block(disturbing, Timeout, #state{connection_sup = CSup} = State) ->
+ Manager = self(),
+ spawn_link(fun() -> wait_for_shutdown(CSup, Manager) end),
+ erlang:send_after(Timeout, self(), {block_timeout, disturbing}),
+ {noreply, State#state{admin_state = shutting_down}};
+
+handle_block(non_disturbing, infinity,
+ #state{connection_sup = CSup} = State) ->
+ Manager = self(),
+ spawn_link(fun() -> wait_for_shutdown(CSup, Manager) end),
+ {noreply, State#state{admin_state = shutting_down}};
+
+handle_block(non_disturbing, Timeout,
+ #state{connection_sup = CSup} = State) ->
+ Manager = self(),
+ spawn_link(fun() -> wait_for_shutdown(CSup, Manager) end),
+ erlang:send_after(Timeout, self(), {block_timeout, non_disturbing}),
+ {noreply, State#state{admin_state = shutting_down}}.
-
-
-%% -------------------------------------------------------------------------
-%% handle_reload
-%%
-%%
-%%
-%%
handle_reload(undefined, #state{config_file = undefined} = State) ->
{continue, {error, undefined_config_file}, State};
handle_reload(undefined, #state{config_file = ConfigFile} = State) ->
@@ -763,7 +435,7 @@ check_constant_values(Db, Config) ->
%% Otherwise -> active
%%
get_ustate(State) ->
- get_ustate(length(State#state.connections),State).
+ get_ustate(count_children(State#state.connection_sup),State).
get_ustate(0,_State) ->
idle;
@@ -776,76 +448,6 @@ get_ustate(ConnectionCnt,State) ->
active
end.
-
-get_astate(S) -> S#state.admin_state.
-
-
-%% Timer handling functions
-start_block_tmr(infinity,_) ->
- undefined;
-start_block_tmr(T,M) ->
- erlang:send_after(T,self(),{block_timeout,M}).
-
-stop_block_tmr(undefined) ->
- ok;
-stop_block_tmr(Ref) ->
- erlang:cancel_timer(Ref).
-
-
-%% Monitor blocker functions
-monitor_blocker(Pid) when is_pid(Pid) ->
- case (catch erlang:monitor(process,Pid)) of
- {'EXIT', _Reason} ->
- undefined;
- MonitorRef ->
- MonitorRef
- end;
-monitor_blocker(_) ->
- undefined.
-
-demonitor_blocker(undefined) ->
- ok;
-demonitor_blocker(Ref) ->
- (catch erlang:demonitor(Ref)).
-
-
-%% Some status utility functions
-
-update_heavy_load_status(Status) ->
- update_status_with_time(Status,last_heavy_load).
-
-update_connection_status(Status,ConnCount) ->
- S1 = case lists:keysearch(max_conn,1,Status) of
- {value, {max_conn, C1}} when ConnCount > C1 ->
- lists:keyreplace(max_conn,1,Status,{max_conn,ConnCount});
- {value, {max_conn, _C2}} ->
- Status;
- false ->
- [{max_conn, ConnCount} | Status]
- end,
- update_status_with_time(S1,last_connection).
-
-update_status_with_time(Status,Key) ->
- lists:keyreplace(Key,1,Status,{Key,universal_time()}).
-
-universal_time() -> calendar:universal_time().
-
-manager_status(P) ->
- Items = [status, message_queue_len, reductions,
- heap_size, stack_size],
- {manager_status, process_status(P,Items,[])}.
-
-
-process_status(P,[],L) ->
- [{pid,P}|lists:reverse(L)];
-process_status(P,[H|T],L) ->
- case (catch process_info(P,H)) of
- {H, Value} ->
- process_status(P,T,[{H,Value}|L]);
- _ ->
- process_status(P,T,[{H,undefined}|L])
- end.
-
make_name(Addr,Port) ->
httpd_util:make_name("httpd",Addr,Port).
@@ -856,10 +458,31 @@ report_error(State,String) ->
mod_log:report_error(Cdb,String),
mod_disk_log:report_error(Cdb,String).
-%%
-call(ServerRef,Request) ->
- gen_server:call(ServerRef,Request).
+call(ServerRef, Request) ->
+ try gen_server:call(ServerRef, Request, infinity)
+ catch
+ exit:_ ->
+ {error, closed}
+ end.
+
+count_children(Sup) ->
+ Children = supervisor:count_children(whereis(Sup)),
+ proplists:get_value(workers, Children).
-cast(ServerRef,Message) ->
- gen_server:cast(ServerRef,Message).
+shutdown_connections(Sup) ->
+ Children = [Child || {_,Child,_,_} <- supervisor:which_children(Sup)],
+ lists:foreach(fun(Pid) -> exit(Pid, kill) end,
+ Children).
+
+wait_for_shutdown(CSup, Manager) ->
+ case count_children(CSup) of
+ 0 ->
+ Manager ! connections_terminated;
+ _ ->
+ receive
+ after 500 ->
+ ok
+ end,
+ wait_for_shutdown(CSup, Manager)
+ end.
diff --git a/lib/inets/src/http_server/httpd_request_handler.erl b/lib/inets/src/http_server/httpd_request_handler.erl
index ea7a17e40d..bd37066ff6 100644
--- a/lib/inets/src/http_server/httpd_request_handler.erl
+++ b/lib/inets/src/http_server/httpd_request_handler.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -25,7 +25,7 @@
-behaviour(gen_server).
%% Application internal API
--export([start/2, start/3, socket_ownership_transfered/3]).
+-export([start_link/2, start_link/3, socket_ownership_transfered/3]).
%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
@@ -57,10 +57,10 @@
%% Description: Starts a httpd-request handler process. Intended to be
%% called by the httpd acceptor process.
%%--------------------------------------------------------------------
-start(Manager, ConfigDB) ->
- start(Manager, ConfigDB, 15000).
-start(Manager, ConfigDB, AcceptTimeout) ->
- proc_lib:start(?MODULE, init, [[Manager, ConfigDB,AcceptTimeout]]).
+start_link(Manager, ConfigDB) ->
+ start_link(Manager, ConfigDB, 15000).
+start_link(Manager, ConfigDB, AcceptTimeout) ->
+ proc_lib:start_link(?MODULE, init, [[Manager, ConfigDB,AcceptTimeout]]).
%%--------------------------------------------------------------------
@@ -87,34 +87,27 @@ socket_ownership_transfered(Pid, SocketType, Socket) ->
%% gen_server provides is needed.
%%--------------------------------------------------------------------
init([Manager, ConfigDB, AcceptTimeout]) ->
- ?hdrd("initiate",
- [{manager, Manager}, {cdb, ConfigDB}, {timeout, AcceptTimeout}]),
+ process_flag(trap_exit, true),
%% Make sure this process terminates if the httpd manager process
%% should die!
- link(Manager),
+ %%link(Manager),
%% At this point the function httpd_request_handler:start/2 will return.
proc_lib:init_ack({ok, self()}),
{SocketType, Socket} = await_socket_ownership_transfer(AcceptTimeout),
- ?hdrd("socket ownership transfered",
- [{socket_type, SocketType}, {socket, Socket}]),
-
+
TimeOut = httpd_util:lookup(ConfigDB, keep_alive_timeout, 150000),
Then = erlang:now(),
- ?hdrd("negotiate", []),
case http_transport:negotiate(SocketType, Socket, TimeOut) of
- {error, Error} ->
- ?hdrd("negotiation failed", [{error, Error}]),
+ {error, _Error} ->
exit(shutdown); %% Can be 'normal'.
ok ->
- ?hdrt("negotiation successfull", []),
NewTimeout = TimeOut - timer:now_diff(now(),Then) div 1000,
continue_init(Manager, ConfigDB, SocketType, Socket, NewTimeout)
end.
continue_init(Manager, ConfigDB, SocketType, Socket, TimeOut) ->
- ?hdrt("continue init", [{timeout, TimeOut}]),
Resolve = http_transport:resolve(),
Peername = httpd_socket:peername(SocketType, Socket),
@@ -139,14 +132,10 @@ continue_init(Manager, ConfigDB, SocketType, Socket, TimeOut) ->
max_keep_alive_request = NrOfRequest,
mfa = MFA},
- ?hdrt("activate request timeout", []),
-
- ?hdrt("set socket options (binary, packet & active)", []),
http_transport:setopts(SocketType, Socket,
[binary, {packet, 0}, {active, once}]),
NewState = data_receive_counter(activate_request_timeout(State), httpd_util:lookup(ConfigDB, minimum_bytes_per_second, false)),
- ?hdrt("init done", []),
- gen_server:enter_loop(?MODULE, [], NewState).
+ gen_server:enter_loop(?MODULE, [], NewState).
%%====================================================================
@@ -195,18 +184,13 @@ handle_cast(Msg, #state{mod = ModData} = State) ->
%% Description: Handling all non call/cast messages
%%--------------------------------------------------------------------
handle_info({Proto, Socket, Data},
- #state{mfa = {Module, Function, Args} = MFA,
+ #state{mfa = {Module, Function, Args},
mod = #mod{socket_type = SockType,
socket = Socket} = ModData} = State)
when (((Proto =:= tcp) orelse
(Proto =:= ssl) orelse
(Proto =:= dummy)) andalso is_binary(Data)) ->
- ?hdrd("received data",
- [{data, Data}, {proto, Proto},
- {socket, Socket}, {socket_type, SockType}, {mfa, MFA}]),
-
-%% case (catch Module:Function([Data | Args])) of
PROCESSED = (catch Module:Function([Data | Args])),
NewDataSize = case State#state.byte_limit of
undefined ->
@@ -214,10 +198,8 @@ handle_info({Proto, Socket, Data},
_ ->
State#state.data + byte_size(Data)
end,
- ?hdrt("data processed", [{processing_result, PROCESSED}]),
case PROCESSED of
{ok, Result} ->
- ?hdrd("data processed", [{result, Result}]),
NewState = case NewDataSize of
undefined ->
cancel_request_timeout(State);
@@ -227,7 +209,6 @@ handle_info({Proto, Socket, Data},
handle_http_msg(Result, NewState);
{error, {uri_too_long, MaxSize}, Version} ->
- ?hdrv("uri too long", [{max_size, MaxSize}, {version, Version}]),
NewModData = ModData#mod{http_version = Version},
httpd_response:send_status(NewModData, 414, "URI too long"),
Reason = io_lib:format("Uri too long, max size is ~p~n",
@@ -236,8 +217,6 @@ handle_info({Proto, Socket, Data},
{stop, normal, State#state{response_sent = true,
mod = NewModData}};
{error, {header_too_long, MaxSize}, Version} ->
- ?hdrv("header too long",
- [{max_size, MaxSize}, {version, Version}]),
NewModData = ModData#mod{http_version = Version},
httpd_response:send_status(NewModData, 413, "Header too long"),
Reason = io_lib:format("Header too long, max size is ~p~n",
@@ -246,7 +225,6 @@ handle_info({Proto, Socket, Data},
{stop, normal, State#state{response_sent = true,
mod = NewModData}};
NewMFA ->
- ?hdrd("data processed - reactivate socket", [{new_mfa, NewMFA}]),
http_transport:setopts(SockType, Socket, [{active, once}]),
case NewDataSize of
undefined ->
@@ -293,6 +271,10 @@ handle_info(check_data, #state{data = Data, byte_limit = Byte_Limit} = State) ->
_ ->
{stop, normal, State#state{response_sent = true}}
end;
+
+handle_info({'EXIT', _, Reason}, State) ->
+ {stop, Reason, State};
+
%% Default case
handle_info(Info, #state{mod = ModData} = State) ->
Error = lists:flatten(
@@ -324,10 +306,8 @@ terminate(Reason, #state{response_sent = false, mod = ModData} = State) ->
terminate(_Reason, State) ->
do_terminate(State).
-do_terminate(#state{mod = ModData, manager = Manager} = State) ->
- catch httpd_manager:done_connection(Manager),
+do_terminate(#state{mod = ModData} = State) ->
cancel_request_timeout(State),
- %% receive after 5000 -> ok end,
httpd_socket:close(ModData#mod.socket_type, ModData#mod.socket).
@@ -355,30 +335,24 @@ await_socket_ownership_transfer(AcceptTimeout) ->
handle_http_msg({_, _, Version, {_, _}, _},
#state{status = busy, mod = ModData} = State) ->
- ?hdrt("handle http msg when manager busy", [{mod, ModData}]),
handle_manager_busy(State#state{mod =
ModData#mod{http_version = Version}}),
{stop, normal, State};
handle_http_msg({_, _, Version, {_, _}, _},
#state{status = blocked, mod = ModData} = State) ->
- ?hdrt("handle http msg when manager blocket", [{mod, ModData}]),
handle_manager_blocked(State#state{mod =
ModData#mod{http_version = Version}}),
{stop, normal, State};
handle_http_msg({Method, Uri, Version, {RecordHeaders, Headers}, Body},
#state{status = accept, mod = ModData} = State) ->
- ?hdrt("handle http msg when manager accepting",
- [{method, Method}, {mod, ModData}]),
case httpd_request:validate(Method, Uri, Version) of
ok ->
- ?hdrt("request validated", []),
{ok, NewModData} =
httpd_request:update_mod_data(ModData, Method, Uri,
Version, Headers),
- ?hdrt("new mod data", [{mod, NewModData}]),
case is_host_specified_if_required(NewModData#mod.absolute_uri,
RecordHeaders, Version) of
true ->
@@ -392,23 +366,18 @@ handle_http_msg({Method, Uri, Version, {RecordHeaders, Headers}, Body},
{stop, normal, State#state{response_sent = true}}
end;
{error, {not_supported, What}} ->
- ?hdrd("validation failed: not supported", [{what, What}]),
httpd_response:send_status(ModData#mod{http_version = Version},
501, {Method, Uri, Version}),
Reason = io_lib:format("Not supported: ~p~n", [What]),
error_log(Reason, ModData),
{stop, normal, State#state{response_sent = true}};
{error, {bad_request, {forbidden, URI}}} ->
- ?hdrd("validation failed: bad request - forbidden",
- [{uri, URI}]),
httpd_response:send_status(ModData#mod{http_version = Version},
403, URI),
Reason = io_lib:format("Forbidden URI: ~p~n", [URI]),
error_log(Reason, ModData),
{stop, normal, State#state{response_sent = true}};
{error, {bad_request, {malformed_syntax, URI}}} ->
- ?hdrd("validation failed: bad request - malformed syntax",
- [{uri, URI}]),
httpd_response:send_status(ModData#mod{http_version = Version},
400, URI),
Reason = io_lib:format("Malformed syntax in URI: ~p~n", [URI]),
@@ -417,12 +386,9 @@ handle_http_msg({Method, Uri, Version, {RecordHeaders, Headers}, Body},
end;
handle_http_msg({ChunkedHeaders, Body},
State = #state{headers = Headers}) ->
- ?hdrt("handle http msg",
- [{chunked_headers, ChunkedHeaders}, {body, Body}]),
NewHeaders = http_chunk:handle_headers(Headers, ChunkedHeaders),
handle_response(State#state{headers = NewHeaders, body = Body});
handle_http_msg(Body, State) ->
- ?hdrt("handle http msg", [{body, Body}]),
handle_response(State#state{body = Body}).
handle_manager_busy(#state{mod = #mod{config_db = ConfigDB}} = State) ->
@@ -445,7 +411,6 @@ is_host_specified_if_required(_, _, _) ->
true.
handle_body(#state{mod = #mod{config_db = ConfigDB}} = State) ->
- ?hdrt("handle body", []),
MaxHeaderSize = max_header_size(ConfigDB),
MaxBodySize = max_body_size(ConfigDB),
@@ -459,34 +424,22 @@ handle_body(#state{mod = #mod{config_db = ConfigDB}} = State) ->
handle_body(#state{headers = Headers, body = Body, mod = ModData} = State,
MaxHeaderSize, MaxBodySize) ->
- ?hdrt("handle body", [{headers, Headers}, {body, Body}]),
case Headers#http_request_h.'transfer-encoding' of
"chunked" ->
- ?hdrt("chunked - attempt decode", []),
case http_chunk:decode(Body, MaxBodySize, MaxHeaderSize) of
{Module, Function, Args} ->
- ?hdrt("chunk decoded",
- [{module, Module},
- {function, Function},
- {args, Args}]),
http_transport:setopts(ModData#mod.socket_type,
ModData#mod.socket,
[{active, once}]),
{noreply, State#state{mfa =
{Module, Function, Args}}};
{ok, {ChunkedHeaders, NewBody}} ->
- ?hdrt("chunk decoded",
- [{chunked_headers, ChunkedHeaders},
- {new_body, NewBody}]),
NewHeaders =
http_chunk:handle_headers(Headers, ChunkedHeaders),
- ?hdrt("chunked - headers handled",
- [{new_headers, NewHeaders}]),
handle_response(State#state{headers = NewHeaders,
body = NewBody})
end;
Encoding when is_list(Encoding) ->
- ?hdrt("not chunked - encoding", [{encoding, Encoding}]),
httpd_response:send_status(ModData, 501,
"Unknown Transfer-Encoding"),
Reason = io_lib:format("Unknown Transfer-Encoding: ~p~n",
@@ -494,17 +447,12 @@ handle_body(#state{headers = Headers, body = Body, mod = ModData} = State,
error_log(Reason, ModData),
{stop, normal, State#state{response_sent = true}};
_ ->
- ?hdrt("not chunked", []),
Length =
list_to_integer(Headers#http_request_h.'content-length'),
case ((Length =< MaxBodySize) or (MaxBodySize == nolimit)) of
true ->
case httpd_request:whole_body(Body, Length) of
{Module, Function, Args} ->
- ?hdrt("whole body",
- [{module, Module},
- {function, Function},
- {args, Args}]),
http_transport:setopts(ModData#mod.socket_type,
ModData#mod.socket,
[{active, once}]),
@@ -512,15 +460,11 @@ handle_body(#state{headers = Headers, body = Body, mod = ModData} = State,
{Module, Function, Args}}};
{ok, NewBody} ->
- ?hdrt("whole body",
- [{new_body, NewBody}]),
handle_response(
State#state{headers = Headers,
body = NewBody})
end;
false ->
- ?hdrd("body too long",
- [{length, Length}, {max_body_size, MaxBodySize}]),
httpd_response:send_status(ModData, 413, "Body too long"),
error_log("Body too long", ModData),
{stop, normal, State#state{response_sent = true}}
@@ -582,8 +526,6 @@ handle_response(#state{body = Body,
mod = ModData,
headers = Headers,
max_keep_alive_request = Max} = State) when Max > 0 ->
- ?hdrt("handle response",
- [{body, Body}, {mod, ModData}, {headers, Headers}, {max, Max}]),
{NewBody, Data} = httpd_request:body_data(Headers, Body),
ok = httpd_response:generate_and_send_response(
ModData#mod{entity_body = NewBody}),
@@ -592,8 +534,6 @@ handle_response(#state{body = Body,
handle_response(#state{body = Body,
headers = Headers,
mod = ModData} = State) ->
- ?hdrt("handle response",
- [{body, Body}, {mod, ModData}, {headers, Headers}]),
{NewBody, _} = httpd_request:body_data(Headers, Body),
ok = httpd_response:generate_and_send_response(
ModData#mod{entity_body = NewBody}),
@@ -601,7 +541,6 @@ handle_response(#state{body = Body,
handle_next_request(#state{mod = #mod{connection = true} = ModData,
max_keep_alive_request = Max} = State, Data) ->
- ?hdrt("handle next request", [{max, Max}]),
NewModData = #mod{socket_type = ModData#mod.socket_type,
socket = ModData#mod.socket,
@@ -630,11 +569,9 @@ handle_next_request(#state{mod = #mod{connection = true} = ModData,
end;
handle_next_request(State, _) ->
- ?hdrt("handle next request - stop", []),
{stop, normal, State}.
activate_request_timeout(#state{timeout = Time} = State) ->
- ?hdrt("activate request timeout", [{time, Time}]),
Ref = erlang:send_after(Time, self(), timeout),
State#state{timer = Ref}.
data_receive_counter(State, Byte_limit) ->
diff --git a/lib/inets/src/inets_app/inets.app.src b/lib/inets/src/inets_app/inets.app.src
index 4aea2ef3d7..a6dd364c2d 100644
--- a/lib/inets/src/inets_app/inets.app.src
+++ b/lib/inets/src/inets_app/inets.app.src
@@ -1,7 +1,7 @@
%% This is an -*- erlang -*- file.
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2011. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -59,6 +59,7 @@
httpd_acceptor,
httpd_acceptor_sup,
httpd_cgi,
+ httpd_connection_sup,
httpd_conf,
httpd_esi,
httpd_example,
diff --git a/lib/inets/test/Makefile b/lib/inets/test/Makefile
index f18db273ec..c156b34406 100644
--- a/lib/inets/test/Makefile
+++ b/lib/inets/test/Makefile
@@ -158,12 +158,14 @@ MODULES = \
httpc_cookie_SUITE \
httpc_proxy_SUITE \
httpd_SUITE \
+ old_httpd_SUITE \
httpd_basic_SUITE \
httpd_mod \
httpd_block \
httpd_load \
httpd_time_test \
httpd_1_1 \
+ httpd_1_0 \
httpd_test_lib \
inets_sup_SUITE \
inets_SUITE \
@@ -201,7 +203,7 @@ INETS_FILES = inets.config $(INETS_SPECS)
# inets_tftp_suite
INETS_DATADIRS = inets_SUITE_data inets_sup_SUITE_data
-HTTPD_DATADIRS = httpd_test_data httpd_SUITE_data httpd_basic_SUITE_data
+HTTPD_DATADIRS = httpd_test_data httpd_SUITE_data httpd_basic_SUITE_data old_httpd_SUITE_data
HTTPC_DATADIRS = httpc_SUITE_data httpc_proxy_SUITE_data
FTP_DATADIRS = ftp_SUITE_data
diff --git a/lib/pman/src/pman_options.hrl b/lib/inets/test/httpd_1_0.erl
index 047b9866c3..53f23b12e0 100644
--- a/lib/pman/src/pman_options.hrl
+++ b/lib/inets/test/httpd_1_0.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -16,19 +16,18 @@
%%
%% %CopyrightEnd%
%%
-
%%
-%% An options-record contains the return data from the option dialog.
-%%
--record(trace_options, {send=true,
- treceive=true,
- functions=true,
- events=true,
- to_file=false,
- file="",
- inherit_on_1st_spawn=false,
- inherit_on_all_spawn=true,
- inherit_on_1st_link=false,
- inherit_on_all_link=true}).
+-module(httpd_1_0).
+
+-export([host/4]).
+%%-------------------------------------------------------------------------
+%% Test cases
+%%-------------------------------------------------------------------------
+host(Type, Port, Host, Node) ->
+ %% No host needed for HTTP/1.0
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET / HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]).
diff --git a/lib/inets/test/httpd_1_1.erl b/lib/inets/test/httpd_1_1.erl
index 07d94ea97a..4b2a5f619d 100644
--- a/lib/inets/test/httpd_1_1.erl
+++ b/lib/inets/test/httpd_1_1.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2011. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -20,8 +20,6 @@
-module(httpd_1_1).
--include("test_server.hrl").
--include("test_server_line.hrl").
-include_lib("kernel/include/file.hrl").
-export([host/4, chunked/4, expect/4, range/4, if_test/5, http_trace/4,
@@ -40,14 +38,10 @@
%%-------------------------------------------------------------------------
-%% Test cases starts here.
+%% Test cases
%%-------------------------------------------------------------------------
host(Type, Port, Host, Node) ->
- %% No host needed for HTTP/1.0
- ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
- "GET / HTTP/1.0\r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/1.0"}]),
+
%% No host must generate an error
ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
"GET / HTTP/1.1\r\n\r\n",
diff --git a/lib/inets/test/httpd_SUITE.erl b/lib/inets/test/httpd_SUITE.erl
index ef801f91c7..34d701eb26 100644
--- a/lib/inets/test/httpd_SUITE.erl
+++ b/lib/inets/test/httpd_SUITE.erl
@@ -1,2238 +1,770 @@
%%
%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
-%%
+%%
+%% Copyright Ericsson AB 2013-2013. All Rights Reserved.
+%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
%% compliance with the License. You should have received a copy of the
%% Erlang Public License along with this software. If not, it can be
%% retrieved online at http://www.erlang.org/.
-%%
+%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and limitations
%% under the License.
-%%
+%%
%% %CopyrightEnd%
%%
%%
--module(httpd_SUITE).
+%%
+%% ct:run("../inets_test", httpd_SUITE).
+%%
--include_lib("test_server/include/test_server.hrl").
--include("test_server_line.hrl").
--include("inets_test_lib.hrl").
+-module(httpd_SUITE).
-include_lib("kernel/include/file.hrl").
+-include_lib("common_test/include/ct.hrl").
+-include("inets_test_lib.hrl").
-%% Test server specific exports
--export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
--export([init_per_testcase/2, end_per_testcase/2,
- init_per_suite/1, end_per_suite/1]).
-
-%% Core Server tests
--export([
- ip_mod_alias/1,
- ip_mod_actions/1,
- ip_mod_security/1,
- ip_mod_auth/1,
- ip_mod_auth_api/1,
- ip_mod_auth_mnesia_api/1,
- ip_mod_htaccess/1,
- ip_mod_cgi/1,
- ip_mod_esi/1,
- ip_mod_get/1,
- ip_mod_head/1,
- ip_mod_all/1,
- ip_load_light/1,
- ip_load_medium/1,
- ip_load_heavy/1,
- ip_dos_hostname/1,
- ip_time_test/1,
- ip_block_disturbing_idle/1,
- ip_block_non_disturbing_idle/1,
- ip_block_503/1,
- ip_block_disturbing_active/1,
- ip_block_non_disturbing_active/1,
- ip_block_disturbing_active_timeout_not_released/1,
- ip_block_disturbing_active_timeout_released/1,
- ip_block_non_disturbing_active_timeout_not_released/1,
- ip_block_non_disturbing_active_timeout_released/1,
- ip_block_disturbing_blocker_dies/1,
- ip_block_non_disturbing_blocker_dies/1,
- ip_restart_no_block/1,
- ip_restart_disturbing_block/1,
- ip_restart_non_disturbing_block/1
- ]).
-
--export([
- essl_mod_alias/1,
- essl_mod_actions/1,
- essl_mod_security/1,
- essl_mod_auth/1,
- essl_mod_auth_api/1,
- essl_mod_auth_mnesia_api/1,
- essl_mod_htaccess/1,
- essl_mod_cgi/1,
- essl_mod_esi/1,
- essl_mod_get/1,
- essl_mod_head/1,
- essl_mod_all/1,
- essl_load_light/1,
- essl_load_medium/1,
- essl_load_heavy/1,
- essl_dos_hostname/1,
- essl_time_test/1,
- essl_restart_no_block/1,
- essl_restart_disturbing_block/1,
- essl_restart_non_disturbing_block/1,
- essl_block_disturbing_idle/1,
- essl_block_non_disturbing_idle/1,
- essl_block_503/1,
- essl_block_disturbing_active/1,
- essl_block_non_disturbing_active/1,
- essl_block_disturbing_active_timeout_not_released/1,
- essl_block_disturbing_active_timeout_released/1,
- essl_block_non_disturbing_active_timeout_not_released/1,
- essl_block_non_disturbing_active_timeout_released/1,
- essl_block_disturbing_blocker_dies/1,
- essl_block_non_disturbing_blocker_dies/1
- ]).
-
-%%% HTTP 1.1 tests
--export([ip_host/1, ip_chunked/1, ip_expect/1, ip_range/1,
- ip_if_test/1, ip_http_trace/1, ip_http1_1_head/1,
- ip_mod_cgi_chunked_encoding_test/1]).
-
-%%% HTTP 1.0 tests
--export([ip_head_1_0/1, ip_get_1_0/1, ip_post_1_0/1]).
-
-%%% HTTP 0.9 tests
--export([ip_get_0_9/1]).
-
-%%% Ticket tests
--export([ticket_5775/1,ticket_5865/1,ticket_5913/1,ticket_6003/1,
- ticket_7304/1]).
-
-%%% IPv6 tests
--export([ipv6_hostname_ipcomm/0, ipv6_hostname_ipcomm/1,
- ipv6_address_ipcomm/0, ipv6_address_ipcomm/1,
- ipv6_hostname_essl/0, ipv6_hostname_essl/1,
- ipv6_address_essl/0, ipv6_address_essl/1]).
-
-%% Help functions
--export([cleanup_mnesia/0, setup_mnesia/0, setup_mnesia/1]).
-
--define(IP_PORT, 8898).
--define(SSL_PORT, 8899).
--define(MAX_HEADER_SIZE, 256).
--define(IPV6_LOCAL_HOST, "0:0:0:0:0:0:0:1").
-
-%% Minutes before failed auths timeout.
--define(FAIL_EXPIRE_TIME,1).
-
-%% Seconds before successful auths timeout.
--define(AUTH_TIMEOUT,5).
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
-record(httpd_user, {user_name, password, user_data}).
-record(httpd_group, {group_name, userlist}).
-
%%--------------------------------------------------------------------
-%% all(Arg) -> [Doc] | [Case] | {skip, Comment}
-%% Arg - doc | suite
-%% Doc - string()
-%% Case - atom()
-%% Name of a test case function.
-%% Comment - string()
-%% Description: Returns documentation/test cases in this test suite
-%% or a skip tuple if the platform is not supported.
+%% Common Test interface functions -----------------------------------
%%--------------------------------------------------------------------
-suite() -> [{ct_hooks,[ts_install_cth]}].
+suite() ->
+ [{ct_hooks,[ts_install_cth]}].
-all() ->
+all() ->
[
- {group, ip},
- {group, ssl},
- {group, http_1_1_ip},
- {group, http_1_0_ip},
- {group, http_0_9_ip},
- {group, ipv6},
- {group, tickets}
+ {group, http}
+ %{group, https}
].
-groups() ->
+groups() ->
[
- {ip, [],
- [ip_mod_alias, ip_mod_actions, ip_mod_security,
- ip_mod_auth, ip_mod_auth_api, ip_mod_auth_mnesia_api,
- ip_mod_htaccess, ip_mod_cgi, ip_mod_esi, ip_mod_get,
- ip_mod_head, ip_mod_all, ip_load_light, ip_load_medium,
- ip_load_heavy, ip_dos_hostname, ip_time_test,
- ip_restart_no_block, ip_restart_disturbing_block,
- ip_restart_non_disturbing_block,
- ip_block_disturbing_idle, ip_block_non_disturbing_idle,
- ip_block_503, ip_block_disturbing_active,
- ip_block_non_disturbing_active,
- ip_block_disturbing_active_timeout_not_released,
- ip_block_disturbing_active_timeout_released,
- ip_block_non_disturbing_active_timeout_not_released,
- ip_block_non_disturbing_active_timeout_released,
- ip_block_disturbing_blocker_dies,
- ip_block_non_disturbing_blocker_dies]},
- {ssl, [], [{group, essl}]},
- {essl, [],
- [essl_mod_alias, essl_mod_actions, essl_mod_security,
- essl_mod_auth, essl_mod_auth_api,
- essl_mod_auth_mnesia_api, essl_mod_htaccess,
- essl_mod_cgi, essl_mod_esi, essl_mod_get, essl_mod_head,
- essl_mod_all, essl_load_light, essl_load_medium,
- essl_load_heavy, essl_dos_hostname, essl_time_test,
- essl_restart_no_block, essl_restart_disturbing_block,
- essl_restart_non_disturbing_block,
- essl_block_disturbing_idle,
- essl_block_non_disturbing_idle, essl_block_503,
- essl_block_disturbing_active,
- essl_block_non_disturbing_active,
- essl_block_disturbing_active_timeout_not_released,
- essl_block_disturbing_active_timeout_released,
- essl_block_non_disturbing_active_timeout_not_released,
- essl_block_non_disturbing_active_timeout_released,
- essl_block_disturbing_blocker_dies,
- essl_block_non_disturbing_blocker_dies]},
- {http_1_1_ip, [],
- [ip_host, ip_chunked, ip_expect, ip_range, ip_if_test,
- ip_http_trace, ip_http1_1_head,
- ip_mod_cgi_chunked_encoding_test]},
- {http_1_0_ip, [],
- [ip_head_1_0, ip_get_1_0, ip_post_1_0]},
- {http_0_9_ip, [], [ip_get_0_9]},
- {ipv6, [], [ipv6_hostname_ipcomm, ipv6_address_ipcomm,
- ipv6_hostname_essl, ipv6_address_essl]},
- {tickets, [],
- [ticket_5775, ticket_5865, ticket_5913, ticket_6003,
- ticket_7304]}].
-
-
-init_per_group(ipv6 = _GroupName, Config) ->
- case inets_test_lib:has_ipv6_support() of
- {ok, _} ->
- Config;
- _ ->
- {skip, "Host does not support IPv6"}
- end;
-init_per_group(essl, Config) ->
- catch crypto:stop(),
- case (catch crypto:start()) of
- ok ->
- Config;
- _ ->
- {skip, "Crypto not startable"}
- end;
-
-init_per_group(_GroupName, Config) ->
- Config.
+ {http, [], all_groups()},
+ %{https, [], all_groups()},
+ {http_1_1, [], [host, chunked, expect, cgi, max_clients
+ ] ++ http_head() ++ http_get()},
+ {http_1_0, [], [host, cgi] ++ http_head() ++ http_get()},
+ {http_0_9, [], http_head() ++ http_get()}
+ ].
-end_per_group(_GroupName, Config) ->
- Config.
+all_groups ()->
+ [{group, http_1_1},
+ {group, http_1_0},
+ {group, http_0_9}
+ ].
+http_head() ->
+ [head].
+http_get() ->
+ [alias, get,
+ basic_auth,
+ esi, ssi].
-%%--------------------------------------------------------------------
-%% Function: init_per_suite(Config) -> Config
-%% Config - [tuple()]
-%% A list of key/value pairs, holding the test case configuration.
-%% Description: Initiation before the whole suite
-%%
-%% Note: This function is free to add any key/value pairs to the Config
-%% variable, but should NOT alter/remove any existing entries.
-%%--------------------------------------------------------------------
init_per_suite(Config) ->
- io:format(user, "init_per_suite -> entry with"
- "~n Config: ~p"
- "~n", [Config]),
-
- ?PRINT_SYSTEM_INFO([]),
-
PrivDir = ?config(priv_dir, Config),
- SuiteTopDir = filename:join(PrivDir, ?MODULE),
- case file:make_dir(SuiteTopDir) of
- ok ->
- ok;
- {error, eexist} ->
- ok;
- Error ->
- throw({error, {failed_creating_suite_top_dir, Error}})
- end,
-
- [{has_ipv6_support, inets_test_lib:has_ipv6_support()},
- {suite_top_dir, SuiteTopDir},
+ DataDir = ?config(data_dir, Config),
+ inets_test_lib:stop_apps([inets]),
+ inets_test_lib:start_apps([inets]),
+ ServerRoot = filename:join(PrivDir, "server_root"),
+ inets_test_lib:del_dirs(ServerRoot),
+ DocRoot = filename:join(ServerRoot, "htdocs"),
+ setup_server_dirs(ServerRoot, DocRoot, DataDir),
+ [{server_root, ServerRoot},
+ {doc_root, DocRoot},
{node, node()},
- {host, inets_test_lib:hostname()},
- {address, getaddr()} | Config].
-
-
-%%--------------------------------------------------------------------
-%% Function: end_per_suite(Config) -> _
-%% Config - [tuple()]
-%% A list of key/value pairs, holding the test case configuration.
-%% Description: Cleanup after the whole suite
-%%--------------------------------------------------------------------
+ {host, inets_test_lib:hostname()} | Config].
end_per_suite(_Config) ->
- %% SuiteTopDir = ?config(suite_top_dir, Config),
- %% inets_test_lib:del_dirs(SuiteTopDir),
ok.
-
-%%--------------------------------------------------------------------
-%% Function: init_per_testcase(Case, Config) -> Config
-%% Case - atom()
-%% Name of the test case that is about to be run.
-%% Config - [tuple()]
-%% A list of key/value pairs, holding the test case configuration.
-%%
-%% Description: Initiation before each test case
-%%
-%% Note: This function is free to add any key/value pairs to the Config
-%% variable, but should NOT alter/remove any existing entries.
%%--------------------------------------------------------------------
-init_per_testcase(Case, Config) ->
- NewConfig = init_per_testcase2(Case, Config),
- init_per_testcase3(Case, NewConfig).
-
-
-init_per_testcase2(Case, Config) ->
-
- %% tsp("init_per_testcase2 -> entry with"
- %% "~n Config: ~p", [Config]),
-
- IpNormal = integer_to_list(?IP_PORT) ++ ".conf",
- IpHtaccess = integer_to_list(?IP_PORT) ++ "htaccess.conf",
- SslNormal = integer_to_list(?SSL_PORT) ++ ".conf",
- SslHtaccess = integer_to_list(?SSL_PORT) ++ "htaccess.conf",
-
- DataDir = ?config(data_dir, Config),
- SuiteTopDir = ?config(suite_top_dir, Config),
+init_per_group(https = Group, Config0) ->
+ case start_apps(Group) of
+ ok ->
+ init_httpd(Group, [{type, ssl} | Config0]);
+ _ ->
+ {skip, "Could not start https apps"}
+ end;
- %% tsp("init_per_testcase2 -> "
- %% "~n SuiteDir: ~p"
- %% "~n DataDir: ~p", [SuiteTopDir, DataDir]),
+init_per_group(http = Group, Config0) ->
+ init_httpd(Group, [{type, ip_comm} | Config0]);
+init_per_group(http_1_1, Config) ->
+ [{http_version, "HTTP/1.1"} | Config];
+init_per_group(http_1_0, Config) ->
+ [{http_version, "HTTP/1.0"} | Config];
+init_per_group(http_0_9, Config) ->
+ [{http_version, "HTTP/0.9"} | Config];
+init_per_group(_, Config) ->
+ Config.
+end_per_group(http, _Config) ->
+ inets:stop();
+end_per_group(https, _Config) ->
+ ssl:stop(),
+ inets:stop();
+end_per_group(_, _) ->
+ ok.
+
+init_httpd(Group, Config0) ->
+ Config1 = proplists:delete(port, Config0),
+ Config = proplists:delete(server_pid, Config1),
+ {Pid, Port} = server_start(Group, server_config(Group, Config)),
+ [{server_pid, Pid}, {port, Port} | Config].
+%%--------------------------------------------------------------------
+init_per_testcase(host = Case, Config) ->
+ Prop = ?config(tc_group_properties, Config),
+ Name = proplists:get_value(name, Prop),
+ Cb = case Name of
+ http_1_0 ->
+ httpd_1_0;
+ http_1_1 ->
+ httpd_1_1
+ end,
+ common_init_per_test_case(Case, [{version_cb, Cb} | proplists:delete(version_cb, Config)]);
+
+%% init_per_testcase(basic_auth = Case, Config) ->
+%% start_mnesia(?config(node, Config)),
+%% common_init_per_test_case(Case, Config);
- TcTopDir = filename:join(SuiteTopDir, Case),
- ?line ok = file:make_dir(TcTopDir),
+init_per_testcase(max_clients, Config) ->
+ Pid = ?config(server_pid, Config),
+ Prop = httpd:info(Pid),
+ Port = proplists:get_value(port, Prop),
+ TempProp = [{port, Port} | proplists:delete(port, server_config(http, Config))],
+ NewProp = [{max_clients, 1} | TempProp],
+ httpd:reload_config(NewProp, non_disturbing),
+ Config;
+
+init_per_testcase(_Case, Config) ->
+ common_init_per_test_case(_Case, Config).
+
+%%% Should be run by all test cases except max_clients, to make
+%%% sure failiure of max_clients does not affect other test cases
+common_init_per_test_case(_Case, Config) ->
+ Pid = ?config(server_pid, Config),
+ Prop = httpd:info(Pid),
+ case proplists:get_value(max_clients, Prop, 150) of
+ 150 ->
+ Config;
+ _ ->
+ end_per_testcase(max_clients, Config)
+ end.
- %% tsp("init_per_testcase2 -> "
- %% "~n TcTopDir: ~p", [TcTopDir]),
+end_per_testcase(max_clients, Config) ->
+ Pid = ?config(server_pid, Config),
+ Prop = httpd:info(Pid),
+ Port = proplists:get_value(port, Prop),
+ TempProp = [{port, Port} | proplists:delete(port, server_config(http, Config))],
+ NewProp = proplists:delete(max_clients, TempProp),
+ httpd:reload_config(NewProp, non_disturbing),
+ Config;
- DataSrc = filename:join([DataDir, "server_root"]),
- ServerRoot = filename:join([TcTopDir, "server_root"]),
-
- %% tsp("init_per_testcase2 -> "
- %% "~n DataSrc: ~p"
- %% "~n ServerRoot: ~p", [DataSrc, ServerRoot]),
+%% end_per_testcase(basic_auth, Config) ->
+%% cleanup_mnesia();
+end_per_testcase(_Case, _Config) ->
+ ok.
- ok = file:make_dir(ServerRoot),
- ok = file:make_dir(filename:join([TcTopDir, "logs"])),
+%%-------------------------------------------------------------------------
+%% Test cases starts here.
+%%-------------------------------------------------------------------------
- NewConfig = [{tc_top_dir, TcTopDir}, {server_root, ServerRoot} | Config],
+head() ->
+ [{doc, "HTTP HEAD request for static page"}].
- %% tsp("init_per_testcase2 -> copy DataSrc to ServerRoot"),
+head(Config) when is_list(Config) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ ok = httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request("HEAD /index.html ", Version, Host),
+ [{statuscode, head_status(Version)},
+ {version, Version}]).
- inets_test_lib:copy_dirs(DataSrc, ServerRoot),
+get() ->
+ [{doc, "HTTP GET request for static page"}].
- %% tsp("init_per_testcase2 -> fix cgi"),
- EnvCGI = filename:join([ServerRoot, "cgi-bin", "printenv.sh"]),
- {ok, FileInfo} = file:read_file_info(EnvCGI),
- ok = file:write_file_info(EnvCGI,
- FileInfo#file_info{mode = 8#00755}),
-
- EchoCGI = case test_server:os_type() of
- {win32, _} ->
- "cgi_echo.exe";
- _ ->
- "cgi_echo"
- end,
- CGIDir = filename:join([ServerRoot, "cgi-bin"]),
- inets_test_lib:copy_file(EchoCGI, DataDir, CGIDir),
- NewEchoCGI = filename:join([CGIDir, EchoCGI]),
- {ok, FileInfo1} = file:read_file_info(NewEchoCGI),
- ok = file:write_file_info(NewEchoCGI,
- FileInfo1#file_info{mode = 8#00755}),
-
- %% To be used by IP test cases
- %% tsp("init_per_testcase2 -> ip testcase setups"),
- create_config([{port, ?IP_PORT}, {sock_type, ip_comm} | NewConfig],
- normal_access, IpNormal),
- create_config([{port, ?IP_PORT}, {sock_type, ip_comm} | NewConfig],
- mod_htaccess, IpHtaccess),
-
- %% To be used by SSL test cases
- %% tsp("init_per_testcase2 -> ssl testcase setups"),
- SocketType =
- case atom_to_list(Case) of
- [X, $s, $s, $l | _] ->
- case X of
- $p -> ssl;
- $e -> essl
- end;
- _ ->
- ssl
- end,
+get(Config) when is_list(Config) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ ok = httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request("GET /index.html ", Version, Host),
+ [{statuscode, 200},
+ {header, "Content-Type", "text/html"},
+ {header, "Date"},
+ {header, "Server"},
+ {version, Version}]).
- create_config([{port, ?SSL_PORT}, {sock_type, SocketType} | NewConfig],
- normal_access, SslNormal),
- create_config([{port, ?SSL_PORT}, {sock_type, SocketType} | NewConfig],
- mod_htaccess, SslHtaccess),
-
- %% To be used by IPv6 test cases. Case-clause is so that
- %% you can do ts:run(inets, httpd_SUITE, <test case>)
- %% for all cases except the ipv6 cases as they depend
- %% on 'test_host_ipv6_only' that will only be present
- %% when you run the whole test suite due to shortcomings
- %% of the test server.
-
- tsp("init_per_testcase2 -> maybe generate IPv6 config file(s)"),
- NewConfig2 =
- case atom_to_list(Case) of
- "ipv6_" ++ _ ->
- case (catch inets_test_lib:has_ipv6_support(NewConfig)) of
- {ok, IPv6Address0} ->
- {ok, Hostname} = inet:gethostname(),
- IPv6Address = http_transport:ipv6_name(IPv6Address0),
- create_ipv6_config([{port, ?IP_PORT},
- {sock_type, ip_comm},
- {ipv6_host, IPv6Address} |
- NewConfig],
- "ipv6_hostname_ipcomm.conf",
- Hostname),
- create_ipv6_config([{port, ?IP_PORT},
- {sock_type, ip_comm},
- {ipv6_host, IPv6Address} |
- NewConfig],
- "ipv6_address_ipcomm.conf",
- IPv6Address),
- create_ipv6_config([{port, ?SSL_PORT},
- {sock_type, essl},
- {ipv6_host, IPv6Address} |
- NewConfig],
- "ipv6_hostname_essl.conf",
- Hostname),
- create_ipv6_config([{port, ?SSL_PORT},
- {sock_type, essl},
- {ipv6_host, IPv6Address} |
- NewConfig],
- "ipv6_address_essl.conf",
- IPv6Address),
- [{ipv6_host, IPv6Address} | NewConfig];
- _ ->
- NewConfig
- end;
+basic_auth() ->
+ [{doc, "Test Basic authentication with WWW-Authenticate header"}].
+basic_auth(Config) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ basic_auth_requiered(Config),
+ %% Authentication OK! ["one:OnePassword" user first in user list]
+ ok = auth_status(auth_request("/open/dummy.html", "one", "onePassword", Version, Host), Config,
+ [{statuscode, 200}]),
+ %% Authentication OK and a directory listing is supplied!
+ %% ["Aladdin:open sesame" user second in user list]
+ ok = auth_status(auth_request("/open/", "Aladdin", "AladdinPassword", Version, Host), Config,
+ [{statuscode, 200}]),
+ %% User correct but wrong password! ["one:one" user first in user list]
+ ok = auth_status(auth_request("/open/dummy.html", "one", "one", Version, Host), Config,
+ [{statuscode, 401},
+ {header, "WWW-Authenticate"}]),
+ %% Make sure Authenticate header is received even the second time
+ %% we try a incorrect password! Otherwise a browser client will hang!
+ ok = auth_status(auth_request("/open/dummy.html", "one", "one", Version, Host), Config,
+ [{statuscode, 401},
+ {header, "WWW-Authenticate"}]),
+ %% Neither user or password correct! ["dummy:dummy"]
+ ok = auth_status(auth_request("/open/dummy.html", "dummy", "dummy", Version, Host), Config,
+ [{statuscode, 401}]),
+ %% Nested secret/top_secret OK! ["Aladdin:open sesame"]
+ ok = http_status(auth_request("/secret/top_secret/", "Aladdin", "AladdinPassword", Version, Host),
+ Config, [{statuscode, 200}]),
+ %% Authentication still required!
+ basic_auth_requiered(Config).
+
+ssi() ->
+ [{doc, "HTTP GET server side include test"}].
+ssi(Config) when is_list(Config) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ ok = httpd_test_lib:verify_request(?config(type, Config), Host, ?config(port, Config),
+ ?config(node, Config),
+ http_request("GET /fsize.shtml ", Version, Host),
+ [{statuscode, 200},
+ {header, "Content-Type", "text/html"},
+ {header, "Date"},
+ {header, "Server"},
+ {version, Version}]).
+host() ->
+ [{doc, "Test host header"}].
+
+host(Config) when is_list(Config) ->
+ Cb = ?config(version_cb, Config),
+ Cb:host(?config(type, Config), ?config(port, Config),
+ ?config(host, Config), ?config(node, Config)).
+
+chunked() ->
+ [{doc, "Check that the server accepts chunked requests."}].
+
+chunked(Config) when is_list(Config) ->
+ httpd_1_1:chunked(?config(type, Config), ?config(port, Config),
+ ?config(host, Config), ?config(node, Config)).
+
+expect() ->
+ ["Check that the server handles request with the expect header "
+ "field appropiate"].
+expect(Config) when is_list(Config) ->
+ httpd_1_1:expect(?config(type, Config), ?config(port, Config),
+ ?config(host, Config), ?config(node, Config)).
+
+max_clients() ->
+ [{doc, "Test max clients limit"}].
+
+max_clients(Config) when is_list(Config) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ Pid = ?config(server_pid, Config),
+ ct:pal("Configurartion: ~p~n", [httpd:info(Pid)]),
+ spawn(fun() -> httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request("GET /eval?httpd_example:delay(1000) ",
+ Version, Host),
+ [{statuscode, 200},
+ {version, Version}])
+ end),
+ ok = httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request("GET /index.html ", Version, Host),
+ [{statuscode, 503},
+ {version, Version}]),
+ receive
+ after 1000 ->
+ ok = httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request("GET /index.html ", Version, Host),
+ [{statuscode, 200},
+ {version, Version}])
+ end.
+
+esi() ->
+ [{doc, "Test mod_esi"}].
+
+esi(Config) when is_list(Config) ->
+ ok = http_status("GET /eval?httpd_example:print(\"Hi!\") ",
+ Config, [{statuscode, 200}]),
+ ok = http_status("GET /eval?not_allowed:print(\"Hi!\") ",
+ Config, [{statuscode, 403}]),
+ ok = http_status("GET /eval?httpd_example:undef(\"Hi!\") ",
+ Config, [{statuscode, 500}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example ",
+ Config, [{statuscode, 400}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example:get ",
+ Config, [{statuscode, 200}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example:"
+ "get?input=4711 ", Config,
+ [{statuscode, 200}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example:post ",
+ Config, [{statuscode, 200}]),
+ ok = http_status("GET /cgi-bin/erl/not_allowed:post ",
+ Config, [{statuscode, 403}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example:undef ",
+ Config, [{statuscode, 404}]),
+ ok = http_status("GET /cgi-bin/erl/httpd_example/yahoo ",
+ Config, [{statuscode, 302}]),
+ %% Check "ErlScriptNoCache" directive (default: false)
+ ok = http_status("GET /cgi-bin/erl/httpd_example:get ",
+ Config, [{statuscode, 200},
+ {no_header, "cache-control"}]).
+
+cgi() ->
+ [{doc, "Test mod_cgi"}].
+
+cgi(Config) when is_list(Config) ->
+ {Script, Script2, Script3} =
+ case test_server:os_type() of
+ {win32, _} ->
+ {"printenv.bat", "printenv.sh", "cgi_echo.exe"};
_ ->
- NewConfig
+ {"printenv.sh", "printenv.bat", "cgi_echo"}
end,
- %% tsp("init_per_testcase2 -> done when"
- %% "~n NewConfig2: ~p", [NewConfig2]),
-
- NewConfig2.
-
-
-init_per_testcase3(Case, Config) ->
- tsp("init_per_testcase3(~w) -> entry with"
- "~n Config: ~p", [Case, Config]),
+ %%The length (> 100) is intentional
+ ok = http_status("POST /cgi-bin/" ++ Script3 ++ " ",
+ {"Content-Length:100 \r\n",
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"},
+ Config,
+ [{statuscode, 200},
+ {header, "content-type", "text/plain"}]),
+
+ ok = http_status("GET /cgi-bin/"++ Script ++ " ", Config, [{statuscode, 200}]),
+ ok = http_status("GET /cgi-bin/not_there ", Config,
+ [{statuscode, 404}, {statuscode, 500}]),
-%% %% Create a new fresh node to be used by the server in this test-case
+ ok = http_status("GET /cgi-bin/"++ Script ++ "?Nisse:kkk?sss/lll ",
+ Config,
+ [{statuscode, 200}]),
-%% NodeName = list_to_atom(atom_to_list(Case) ++ "_httpd"),
-%% Node = inets_test_lib:start_node(NodeName),
+ ok = http_status("POST /cgi-bin/"++ Script ++ " ", Config,
+ [{statuscode, 200}]),
- %% Clean up (we do not want this clean up in end_per_testcase
- %% if init_per_testcase crashes for some testcase it will
- %% have contaminated the environment and there will be no clean up.)
- %% This init can take a few different paths so that one crashes
- %% does not mean that all invocations will.
-
- application:unset_env(inets, services),
- application:stop(inets),
- application:stop(ssl),
- cleanup_mnesia(),
-
- %% Start initialization
- tsp("init_per_testcase3(~w) -> start init", [Case]),
-
- Dog = test_server:timetrap(inets_test_lib:minutes(10)),
- NewConfig = lists:keydelete(watchdog, 1, Config),
- TcTopDir = ?config(tc_top_dir, Config),
-
- CaseRest =
- case atom_to_list(Case) of
- "ip_mod_htaccess" ->
- inets_test_lib:start_http_server(
- filename:join(TcTopDir,
- integer_to_list(?IP_PORT) ++
- "htaccess.conf")),
- "mod_htaccess";
- "ip_" ++ Rest ->
- inets_test_lib:start_http_server(
- filename:join(TcTopDir,
- integer_to_list(?IP_PORT) ++ ".conf")),
- Rest;
- "ticket_5913" ->
- HttpdOptions =
- [{file,
- filename:join(TcTopDir,
- integer_to_list(?IP_PORT) ++ ".conf")},
- {accept_timeout,30000},
- {debug,[{exported_functions,
- [httpd_manager,httpd_request_handler]}]}],
- inets_test_lib:start_http_server(HttpdOptions);
- "ticket_"++Rest ->
- %% OTP-5913 use the new syntax of inets.config
- inets_test_lib:start_http_server([{file,
- filename:join(TcTopDir,
- integer_to_list(?IP_PORT) ++ ".conf")}]),
- Rest;
-
- [X, $s, $s, $l, $_, $m, $o, $d, $_, $h, $t, $a, $c, $c, $e, $s, $s] ->
- ?ENSURE_STARTED([crypto, public_key, ssl]),
- SslTag =
- case X of
- $p -> ssl; % Plain
- $e -> essl % Erlang based ssl
- end,
- case inets_test_lib:start_http_server_ssl(
- filename:join(TcTopDir,
- integer_to_list(?SSL_PORT) ++
- "htaccess.conf"), SslTag) of
- ok ->
- "mod_htaccess";
- Other ->
- error_logger:info_msg("Other: ~p~n", [Other]),
- {skip, "SSL does not seem to be supported"}
- end;
- [X, $s, $s, $l, $_ | Rest] ->
- ?ENSURE_STARTED([crypto, public_key, ssl]),
- SslTag =
- case X of
- $p -> ssl;
- $e -> essl
- end,
- case inets_test_lib:start_http_server_ssl(
- filename:join(TcTopDir,
- integer_to_list(?SSL_PORT) ++
- ".conf"), SslTag) of
- ok ->
- Rest;
- Other ->
- error_logger:info_msg("Other: ~p~n", [Other]),
- {skip, "SSL does not seem to be supported"}
- end;
- "ipv6_" ++ _ = TestCaseStr ->
- case inets_test_lib:has_ipv6_support() of
- {ok, _} ->
- inets_test_lib:start_http_server(
- filename:join(TcTopDir,
- TestCaseStr ++ ".conf"));
-
- _ ->
- {skip, "Host does not support IPv6"}
- end
- end,
-
- InitRes =
- case CaseRest of
- {skip, _} = Skip ->
- Skip;
- "mod_auth_" ++ _ ->
- start_mnesia(?config(node, Config)),
- [{watchdog, Dog} | NewConfig];
- "mod_htaccess" ->
- ServerRoot = ?config(server_root, Config),
- Path = filename:join([ServerRoot, "htdocs"]),
- catch remove_htaccess(Path),
- create_htaccess_data(Path, ?config(address, Config)),
- [{watchdog, Dog} | NewConfig];
- "range" ->
- ServerRoot = ?config(server_root, Config),
- Path = filename:join([ServerRoot, "htdocs"]),
- create_range_data(Path),
- [{watchdog, Dog} | NewConfig];
- _ ->
- [{watchdog, Dog} | NewConfig]
- end,
+ ok = http_status("GET /htbin/"++ Script ++ " ", Config,
+ [{statuscode, 200}]),
- tsp("init_per_testcase3(~w) -> done when"
- "~n InitRes: ~p", [Case, InitRes]),
-
- InitRes.
-
-
-%%--------------------------------------------------------------------
-%% Function: end_per_testcase(Case, Config) -> _
-%% Case - atom()
-%% Name of the test case that is about to be run.
-%% Config - [tuple()]
-%% A list of key/value pairs, holding the test case configuration.
-%% Description: Cleanup after each test case
-%%--------------------------------------------------------------------
-end_per_testcase(Case, Config) ->
- Dog = ?config(watchdog, Config),
- test_server:timetrap_cancel(Dog),
- end_per_testcase2(Case, lists:keydelete(watchdog, 1, Config)),
- ok.
-
-end_per_testcase2(Case, Config) ->
- tsp("end_per_testcase2(~w) -> entry with"
- "~n Config: ~p", [Case, Config]),
- application:unset_env(inets, services),
- application:stop(inets),
- application:stop(ssl),
- application:stop(crypto), % used by the new ssl (essl test cases)
- cleanup_mnesia(),
- tsp("end_per_testcase2(~w) -> done", [Case]),
- ok.
-
-
-%%-------------------------------------------------------------------------
-%% Test cases starts here.
-%%-------------------------------------------------------------------------
-
-%%-------------------------------------------------------------------------
-ip_mod_alias(doc) ->
- ["Module test: mod_alias"];
-ip_mod_alias(suite) ->
- [];
-ip_mod_alias(Config) when is_list(Config) ->
- httpd_mod:alias(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_actions(doc) ->
- ["Module test: mod_actions"];
-ip_mod_actions(suite) ->
- [];
-ip_mod_actions(Config) when is_list(Config) ->
- httpd_mod:actions(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_security(doc) ->
- ["Module test: mod_security"];
-ip_mod_security(suite) ->
- [];
-ip_mod_security(Config) when is_list(Config) ->
- ServerRoot = ?config(server_root, Config),
- httpd_mod:security(ServerRoot, ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_auth(doc) ->
- ["Module test: mod_auth"];
-ip_mod_auth(suite) ->
- [];
-ip_mod_auth(Config) when is_list(Config) ->
- httpd_mod:auth(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_auth_api(doc) ->
- ["Module test: mod_auth_api"];
-ip_mod_auth_api(suite) ->
- [];
-ip_mod_auth_api(Config) when is_list(Config) ->
- ServerRoot = ?config(server_root, Config),
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_mod:auth_api(ServerRoot, "", ip_comm, ?IP_PORT, Host, Node),
- httpd_mod:auth_api(ServerRoot, "dets_", ip_comm, ?IP_PORT, Host, Node),
- httpd_mod:auth_api(ServerRoot, "mnesia_", ip_comm, ?IP_PORT, Host, Node),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_auth_mnesia_api(doc) ->
- ["Module test: mod_auth_mnesia_api"];
-ip_mod_auth_mnesia_api(suite) ->
- [];
-ip_mod_auth_mnesia_api(Config) when is_list(Config) ->
- httpd_mod:auth_mnesia_api(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_htaccess(doc) ->
- ["Module test: mod_htaccess"];
-ip_mod_htaccess(suite) ->
- [];
-ip_mod_htaccess(Config) when is_list(Config) ->
- httpd_mod:htaccess(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_cgi(doc) ->
- ["Module test: mod_cgi"];
-ip_mod_cgi(suite) ->
- [];
-ip_mod_cgi(Config) when is_list(Config) ->
- httpd_mod:cgi(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_esi(doc) ->
- ["Module test: mod_esi"];
-ip_mod_esi(suite) ->
- [];
-ip_mod_esi(Config) when is_list(Config) ->
- httpd_mod:esi(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_get(doc) ->
- ["Module test: mod_get"];
-ip_mod_get(suite) ->
- [];
-ip_mod_get(Config) when is_list(Config) ->
- httpd_mod:get(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_mod_head(doc) ->
- ["Module test: mod_head"];
-ip_mod_head(suite) ->
- [];
-ip_mod_head(Config) when is_list(Config) ->
- httpd_mod:head(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_all(doc) ->
- ["All modules test"];
-ip_mod_all(suite) ->
- [];
-ip_mod_all(Config) when is_list(Config) ->
- httpd_mod:all(ip_comm, ?IP_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_load_light(doc) ->
- ["Test light load"];
-ip_load_light(suite) ->
- [];
-ip_load_light(Config) when is_list(Config) ->
- httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ip_comm, light)),
- ok.
-%%-------------------------------------------------------------------------
-ip_load_medium(doc) ->
- ["Test medium load"];
-ip_load_medium(suite) ->
- [];
-ip_load_medium(Config) when is_list(Config) ->
- httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ip_comm, medium)),
- ok.
-%%-------------------------------------------------------------------------
-ip_load_heavy(doc) ->
- ["Test heavy load"];
-ip_load_heavy(suite) ->
- [];
-ip_load_heavy(Config) when is_list(Config) ->
- httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ip_comm, heavy)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-ip_dos_hostname(doc) ->
- ["Denial Of Service (DOS) attack test case"];
-ip_dos_hostname(suite) ->
- [];
-ip_dos_hostname(Config) when is_list(Config) ->
- dos_hostname(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config), ?MAX_HEADER_SIZE),
- ok.
-
-
-%%-------------------------------------------------------------------------
-ip_time_test(doc) ->
- [""];
-ip_time_test(suite) ->
- [];
-ip_time_test(Config) when is_list(Config) ->
- %% <CONDITIONAL-SKIP>
- Skippable = [win32],
- Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
+ ok = http_status("GET /htbin/not_there ", Config,
+ [{statuscode, 404},{statuscode, 500}]),
- httpd_time_test:t(ip_comm, ?config(host, Config), ?IP_PORT),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_block_503(doc) ->
- ["Check that you will receive status code 503 when the server"
- " is blocked and 200 when its not blocked."];
-ip_block_503(suite) ->
- [];
-ip_block_503(Config) when is_list(Config) ->
- httpd_block:block_503(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_disturbing_idle(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "distribing does not really make a difference in this case."];
-ip_block_disturbing_idle(suite) ->
- [];
-ip_block_disturbing_idle(Config) when is_list(Config) ->
- httpd_block:block_disturbing_idle(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_non_disturbing_idle(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "non distribing does not really make a difference in this case."];
-ip_block_non_disturbing_idle(suite) ->
- [];
-ip_block_non_disturbing_idle(Config) when is_list(Config) ->
- httpd_block:block_non_disturbing_idle(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_disturbing_active(doc) ->
- ["Check that you can block/unblock an active server. The strategy "
- "distribing means ongoing requests should be terminated."];
-ip_block_disturbing_active(suite) ->
- [];
-ip_block_disturbing_active(Config) when is_list(Config) ->
- httpd_block:block_disturbing_active(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_non_disturbing_active(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "non distribing means the ongoing requests should be compleated."];
-ip_block_non_disturbing_active(suite) ->
- [];
-ip_block_non_disturbing_active(Config) when is_list(Config) ->
- httpd_block:block_non_disturbing_idle(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_block_disturbing_active_timeout_not_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "distribing means ongoing requests should be compleated"
- "if the timeout does not occur."];
-ip_block_disturbing_active_timeout_not_released(suite) ->
- [];
-ip_block_disturbing_active_timeout_not_released(Config)
- when is_list(Config) ->
- httpd_block:block_disturbing_active_timeout_not_released(ip_comm,
- ?IP_PORT,
- ?config(host,
- Config),
- ?config(node,
- Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_disturbing_active_timeout_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "distribing means ongoing requests should be terminated when"
- "the timeout occurs."];
-ip_block_disturbing_active_timeout_released(suite) ->
- [];
-ip_block_disturbing_active_timeout_released(Config)
- when is_list(Config) ->
- httpd_block:block_disturbing_active_timeout_released(ip_comm,
- ?IP_PORT,
- ?config(host,
- Config),
- ?config(node,
- Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_block_non_disturbing_active_timeout_not_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "non non distribing means ongoing requests should be completed."];
-ip_block_non_disturbing_active_timeout_not_released(suite) ->
- [];
-ip_block_non_disturbing_active_timeout_not_released(Config)
- when is_list(Config) ->
- httpd_block:
- block_non_disturbing_active_timeout_not_released(ip_comm,
- ?IP_PORT,
- ?config(host,
- Config),
- ?config(node,
- Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_non_disturbing_active_timeout_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "non non distribing means ongoing requests should be completed. "
- "When the timeout occurs the block operation sohould be canceled." ];
-ip_block_non_disturbing_active_timeout_released(suite) ->
- [];
-ip_block_non_disturbing_active_timeout_released(Config)
- when is_list(Config) ->
- httpd_block:
- block_non_disturbing_active_timeout_released(ip_comm,
- ?IP_PORT,
- ?config(host,
- Config),
- ?config(node,
- Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_disturbing_blocker_dies(doc) ->
- [];
-ip_block_disturbing_blocker_dies(suite) ->
- [];
-ip_block_disturbing_blocker_dies(Config) when is_list(Config) ->
- httpd_block:disturbing_blocker_dies(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_block_non_disturbing_blocker_dies(doc) ->
- [];
-ip_block_non_disturbing_blocker_dies(suite) ->
- [];
-ip_block_non_disturbing_blocker_dies(Config) when is_list(Config) ->
- httpd_block:non_disturbing_blocker_dies(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_restart_no_block(doc) ->
- [""];
-ip_restart_no_block(suite) ->
- [];
-ip_restart_no_block(Config) when is_list(Config) ->
- httpd_block:restart_no_block(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_restart_disturbing_block(doc) ->
- [""];
-ip_restart_disturbing_block(suite) ->
- [];
-ip_restart_disturbing_block(Config) when is_list(Config) ->
- %% <CONDITIONAL-SKIP>
- Condition =
- fun() ->
- case os:type() of
- {unix, linux} ->
- HW = string:strip(os:cmd("uname -m"), right, $\n),
- case HW of
- "ppc" ->
- case inet:gethostname() of
- {ok, "peach"} ->
- true;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end
- end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_block:restart_disturbing_block(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_restart_non_disturbing_block(doc) ->
- [""];
-ip_restart_non_disturbing_block(suite) ->
- [];
-ip_restart_non_disturbing_block(Config) when is_list(Config) ->
- %% <CONDITIONAL-SKIP>
- Condition =
- fun() ->
- case os:type() of
- {unix, linux} ->
- HW = string:strip(os:cmd("uname -m"), right, $\n),
- case HW of
- "ppc" ->
- case inet:gethostname() of
- {ok, "peach"} ->
- true;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end
- end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_block:restart_non_disturbing_block(ip_comm, ?IP_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-
-essl_mod_alias(doc) ->
- ["Module test: mod_alias - using new of configure new SSL"];
-essl_mod_alias(suite) ->
- [];
-essl_mod_alias(Config) when is_list(Config) ->
- ssl_mod_alias(essl, Config).
-
-
-ssl_mod_alias(Tag, Config) ->
- httpd_mod:alias(Tag, ?SSL_PORT,
- ?config(host, Config), ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_actions(doc) ->
- ["Module test: mod_actions - using new of configure new SSL"];
-essl_mod_actions(suite) ->
- [];
-essl_mod_actions(Config) when is_list(Config) ->
- ssl_mod_actions(essl, Config).
-
-
-ssl_mod_actions(Tag, Config) ->
- httpd_mod:actions(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_security(doc) ->
- ["Module test: mod_security - using new of configure new SSL"];
-essl_mod_security(suite) ->
- [];
-essl_mod_security(Config) when is_list(Config) ->
- ssl_mod_security(essl, Config).
-
-ssl_mod_security(Tag, Config) ->
- ServerRoot = ?config(server_root, Config),
- httpd_mod:security(ServerRoot,
- Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_auth(doc) ->
- ["Module test: mod_auth - using new of configure new SSL"];
-essl_mod_auth(suite) ->
- [];
-essl_mod_auth(Config) when is_list(Config) ->
- ssl_mod_auth(essl, Config).
-
-ssl_mod_auth(Tag, Config) ->
- httpd_mod:auth(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_mod_auth_api(doc) ->
- ["Module test: mod_auth - using new of configure new SSL"];
-essl_mod_auth_api(suite) ->
- [];
-essl_mod_auth_api(Config) when is_list(Config) ->
- ssl_mod_auth_api(essl, Config).
-
-ssl_mod_auth_api(Tag, Config) ->
- ServerRoot = ?config(server_root, Config),
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_mod:auth_api(ServerRoot, "", Tag, ?SSL_PORT, Host, Node),
- httpd_mod:auth_api(ServerRoot, "dets_", Tag, ?SSL_PORT, Host, Node),
- httpd_mod:auth_api(ServerRoot, "mnesia_", Tag, ?SSL_PORT, Host, Node),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_mod_auth_mnesia_api(doc) ->
- ["Module test: mod_auth_mnesia_api - using new of configure new SSL"];
-essl_mod_auth_mnesia_api(suite) ->
- [];
-essl_mod_auth_mnesia_api(Config) when is_list(Config) ->
- ssl_mod_auth_mnesia_api(essl, Config).
-
-ssl_mod_auth_mnesia_api(Tag, Config) ->
- httpd_mod:auth_mnesia_api(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_htaccess(doc) ->
- ["Module test: mod_htaccess - using new of configure new SSL"];
-essl_mod_htaccess(suite) ->
- [];
-essl_mod_htaccess(Config) when is_list(Config) ->
- ssl_mod_htaccess(essl, Config).
-
-ssl_mod_htaccess(Tag, Config) ->
- httpd_mod:htaccess(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_cgi(doc) ->
- ["Module test: mod_cgi - using new of configure new SSL"];
-essl_mod_cgi(suite) ->
- [];
-essl_mod_cgi(Config) when is_list(Config) ->
- ssl_mod_cgi(essl, Config).
-
-ssl_mod_cgi(Tag, Config) ->
- httpd_mod:cgi(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_esi(doc) ->
- ["Module test: mod_esi - using new of configure new SSL"];
-essl_mod_esi(suite) ->
- [];
-essl_mod_esi(Config) when is_list(Config) ->
- ssl_mod_esi(essl, Config).
-
-ssl_mod_esi(Tag, Config) ->
- httpd_mod:esi(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_get(doc) ->
- ["Module test: mod_get - using new of configure new SSL"];
-essl_mod_get(suite) ->
- [];
-essl_mod_get(Config) when is_list(Config) ->
- ssl_mod_get(essl, Config).
-
-ssl_mod_get(Tag, Config) ->
- httpd_mod:get(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_head(doc) ->
- ["Module test: mod_head - using new of configure new SSL"];
-essl_mod_head(suite) ->
- [];
-essl_mod_head(Config) when is_list(Config) ->
- ssl_mod_head(essl, Config).
-
-ssl_mod_head(Tag, Config) ->
- httpd_mod:head(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_mod_all(doc) ->
- ["All modules test - using new of configure new SSL"];
-essl_mod_all(suite) ->
- [];
-essl_mod_all(Config) when is_list(Config) ->
- ssl_mod_all(essl, Config).
-
-ssl_mod_all(Tag, Config) ->
- httpd_mod:all(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_load_light(doc) ->
- ["Test light load - using new of configure new SSL"];
-essl_load_light(suite) ->
- [];
-essl_load_light(Config) when is_list(Config) ->
- ssl_load_light(essl, Config).
-
-ssl_load_light(Tag, Config) ->
- httpd_load:load_test(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ssl, light)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_load_medium(doc) ->
- ["Test medium load - using new of configure new SSL"];
-essl_load_medium(suite) ->
- [];
-essl_load_medium(Config) when is_list(Config) ->
- ssl_load_medium(essl, Config).
-
-ssl_load_medium(Tag, Config) ->
- %% <CONDITIONAL-SKIP>
- Skippable = [win32],
- Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_load:load_test(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ssl, medium)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_load_heavy(doc) ->
- ["Test heavy load - using new of configure new SSL"];
-essl_load_heavy(suite) ->
- [];
-essl_load_heavy(Config) when is_list(Config) ->
- ssl_load_heavy(essl, Config).
-
-ssl_load_heavy(Tag, Config) ->
- %% <CONDITIONAL-SKIP>
- Skippable = [win32],
- Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_load:load_test(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config),
- get_nof_clients(ssl, heavy)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_dos_hostname(doc) ->
- ["Denial Of Service (DOS) attack test case - using new of configure new SSL"];
-essl_dos_hostname(suite) ->
- [];
-essl_dos_hostname(Config) when is_list(Config) ->
- ssl_dos_hostname(essl, Config).
-
-ssl_dos_hostname(Tag, Config) ->
- dos_hostname(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config),
- ?MAX_HEADER_SIZE),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_time_test(doc) ->
- ["using new of configure new SSL"];
-essl_time_test(suite) ->
- [];
-essl_time_test(Config) when is_list(Config) ->
- ssl_time_test(essl, Config).
-
-ssl_time_test(Tag, Config) when is_list(Config) ->
- %% <CONDITIONAL-SKIP>
- FreeBSDVersionVerify =
- fun() ->
- case os:version() of
- {7, 1, _} -> % We only have one such machine, so...
- true;
- _ ->
- false
- end
- end,
- Skippable = [win32, {unix, [{freebsd, FreeBSDVersionVerify}]}],
- Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
+ ok = http_status("GET /htbin/"++ Script ++ "?Nisse:kkk?sss/lll ", Config,
+ [{statuscode, 200}]),
- httpd_time_test:t(Tag,
- ?config(host, Config),
- ?SSL_PORT),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_block_503(doc) ->
- ["Check that you will receive status code 503 when the server"
- " is blocked and 200 when its not blocked - using new of configure new SSL."];
-essl_block_503(suite) ->
- [];
-essl_block_503(Config) when is_list(Config) ->
- ssl_block_503(essl, Config).
-
-ssl_block_503(Tag, Config) ->
- httpd_block:block_503(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_disturbing_idle(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "distribing does not really make a difference in this case."
- "Using new of configure new SSL"];
-essl_block_disturbing_idle(suite) ->
- [];
-essl_block_disturbing_idle(Config) when is_list(Config) ->
- ssl_block_disturbing_idle(essl, Config).
-
-ssl_block_disturbing_idle(Tag, Config) ->
- httpd_block:block_disturbing_idle(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_non_disturbing_idle(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "non distribing does not really make a difference in this case."
- "Using new of configure new SSL"];
-essl_block_non_disturbing_idle(suite) ->
- [];
-essl_block_non_disturbing_idle(Config) when is_list(Config) ->
- ssl_block_non_disturbing_idle(essl, Config).
-
-ssl_block_non_disturbing_idle(Tag, Config) ->
- httpd_block:block_non_disturbing_idle(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_disturbing_active(doc) ->
- ["Check that you can block/unblock an active server. The strategy "
- "distribing means ongoing requests should be terminated."
- "Using new of configure new SSL"];
-essl_block_disturbing_active(suite) ->
- [];
-essl_block_disturbing_active(Config) when is_list(Config) ->
- ssl_block_disturbing_active(essl, Config).
-
-ssl_block_disturbing_active(Tag, Config) ->
- httpd_block:block_disturbing_active(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_non_disturbing_active(doc) ->
- ["Check that you can block/unblock an idle server. The strategy "
- "non distribing means the ongoing requests should be compleated."
- "Using new of configure new SSL"];
-essl_block_non_disturbing_active(suite) ->
- [];
-essl_block_non_disturbing_active(Config) when is_list(Config) ->
- ssl_block_non_disturbing_active(essl, Config).
-
-ssl_block_non_disturbing_active(Tag, Config) ->
- httpd_block:block_non_disturbing_idle(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_disturbing_active_timeout_not_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "distribing means ongoing requests should be compleated"
- "if the timeout does not occur."
- "Using new of configure new SSL"];
-essl_block_disturbing_active_timeout_not_released(suite) ->
- [];
-essl_block_disturbing_active_timeout_not_released(Config)
- when is_list(Config) ->
- ssl_block_disturbing_active_timeout_not_released(essl, Config).
-
-ssl_block_disturbing_active_timeout_not_released(Tag, Config) ->
- Port = ?SSL_PORT,
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_block:block_disturbing_active_timeout_not_released(Tag,
- Port, Host, Node),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_disturbing_active_timeout_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "distribing means ongoing requests should be terminated when"
- "the timeout occurs."
- "Using new of configure new SSL"];
-essl_block_disturbing_active_timeout_released(suite) ->
- [];
-essl_block_disturbing_active_timeout_released(Config)
- when is_list(Config) ->
- ssl_block_disturbing_active_timeout_released(essl, Config).
-
-ssl_block_disturbing_active_timeout_released(Tag, Config) ->
- Port = ?SSL_PORT,
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_block:block_disturbing_active_timeout_released(Tag,
- Port,
- Host,
- Node),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_non_disturbing_active_timeout_not_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "non non distribing means ongoing requests should be completed."
- "Using new of configure new SSL"];
-essl_block_non_disturbing_active_timeout_not_released(suite) ->
- [];
-essl_block_non_disturbing_active_timeout_not_released(Config)
- when is_list(Config) ->
- ssl_block_non_disturbing_active_timeout_not_released(essl, Config).
-
-ssl_block_non_disturbing_active_timeout_not_released(Tag, Config) ->
- Port = ?SSL_PORT,
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_block:block_non_disturbing_active_timeout_not_released(Tag,
- Port,
- Host,
- Node),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_block_non_disturbing_active_timeout_released(doc) ->
- ["Check that you can block an active server. The strategy "
- "non distribing means ongoing requests should be completed. "
- "When the timeout occurs the block operation sohould be canceled."
- "Using new of configure new SSL"];
-essl_block_non_disturbing_active_timeout_released(suite) ->
- [];
-essl_block_non_disturbing_active_timeout_released(Config)
- when is_list(Config) ->
- ssl_block_non_disturbing_active_timeout_released(essl, Config).
-
-ssl_block_non_disturbing_active_timeout_released(Tag, Config)
- when is_list(Config) ->
- Port = ?SSL_PORT,
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- httpd_block:block_non_disturbing_active_timeout_released(Tag,
- Port,
- Host,
- Node),
-
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_block_disturbing_blocker_dies(doc) ->
- ["using new of configure new SSL"];
-essl_block_disturbing_blocker_dies(suite) ->
- [];
-essl_block_disturbing_blocker_dies(Config) when is_list(Config) ->
- ssl_block_disturbing_blocker_dies(essl, Config).
-
-ssl_block_disturbing_blocker_dies(Tag, Config) ->
- httpd_block:disturbing_blocker_dies(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-essl_block_non_disturbing_blocker_dies(doc) ->
- ["using new of configure new SSL"];
-essl_block_non_disturbing_blocker_dies(suite) ->
- [];
-essl_block_non_disturbing_blocker_dies(Config) when is_list(Config) ->
- ssl_block_non_disturbing_blocker_dies(essl, Config).
-
-ssl_block_non_disturbing_blocker_dies(Tag, Config) ->
- httpd_block:non_disturbing_blocker_dies(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_restart_no_block(doc) ->
- ["using new of configure new SSL"];
-essl_restart_no_block(suite) ->
- [];
-essl_restart_no_block(Config) when is_list(Config) ->
- ssl_restart_no_block(essl, Config).
-
-ssl_restart_no_block(Tag, Config) ->
- httpd_block:restart_no_block(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_restart_disturbing_block(doc) ->
- ["using new of configure new SSL"];
-essl_restart_disturbing_block(suite) ->
- [];
-essl_restart_disturbing_block(Config) when is_list(Config) ->
- ssl_restart_disturbing_block(essl, Config).
-
-ssl_restart_disturbing_block(Tag, Config) ->
- %% <CONDITIONAL-SKIP>
- Condition =
- fun() ->
- case os:type() of
- {unix, linux} ->
- case ?OSCMD("uname -m") of
- "ppc" ->
- case file:read_file_info("/etc/fedora-release") of
- {ok, _} ->
- case ?OSCMD("awk '{print $2}' /etc/fedora-release") of
- "release" ->
- %% Fedora 7 and later
- case ?OSCMD("awk '{print $3}' /etc/fedora-release") of
- "7" ->
- true;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end
- end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_block:restart_disturbing_block(Tag, ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-
-
-essl_restart_non_disturbing_block(doc) ->
- ["using new of configure new SSL"];
-essl_restart_non_disturbing_block(suite) ->
- [];
-essl_restart_non_disturbing_block(Config) when is_list(Config) ->
- ssl_restart_non_disturbing_block(essl, Config).
-
-ssl_restart_non_disturbing_block(Tag, Config) ->
- %% <CONDITIONAL-SKIP>
- Condition =
- fun() ->
- case os:type() of
- {unix, linux} ->
- HW = string:strip(os:cmd("uname -m"), right, $\n),
- case HW of
- "ppc" ->
- case inet:gethostname() of
- {ok, "peach"} ->
- true;
- _ ->
- false
- end;
- _ ->
- false
- end;
- _ ->
- false
- end
- end,
- ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
- %% </CONDITIONAL-SKIP>
-
- httpd_block:restart_non_disturbing_block(Tag,
- ?SSL_PORT,
- ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-
-%%-------------------------------------------------------------------------
-ip_host(doc) ->
- ["Control that the server accepts/rejects requests with/ without host"];
-ip_host(suite)->
- [];
-ip_host(Config) when is_list(Config) ->
- httpd_1_1:host(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_chunked(doc) ->
- ["Control that the server accepts chunked requests"];
-ip_chunked(suite) ->
- [];
-ip_chunked(Config) when is_list(Config) ->
- httpd_1_1:chunked(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_expect(doc) ->
- ["Control that the server handles request with the expect header "
- "field appropiate"];
-ip_expect(suite)->
- [];
-ip_expect(Config) when is_list(Config) ->
- httpd_1_1:expect(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_range(doc) ->
- ["Control that the server can handle range requests to plain files"];
-ip_range(suite)->
- [];
-ip_range(Config) when is_list(Config) ->
- httpd_1_1:range(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_if_test(doc) ->
- ["Test that the if - request header fields is handled correclty"];
-ip_if_test(suite) ->
- [];
-ip_if_test(Config) when is_list(Config) ->
- ServerRoot = ?config(server_root, Config),
- DocRoot = filename:join([ServerRoot, "htdocs"]),
- httpd_1_1:if_test(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config), DocRoot),
- ok.
-%%-------------------------------------------------------------------------
-ip_http_trace(doc) ->
- ["Test the trace module "];
-ip_http_trace(suite) ->
- [];
-ip_http_trace(Config) when is_list(Config) ->
- httpd_1_1:http_trace(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-%%-------------------------------------------------------------------------
-ip_http1_1_head(doc) ->
- ["Test the trace module "];
-ip_http1_1_head(suite)->
- [];
-ip_http1_1_head(Config) when is_list(Config) ->
- httpd_1_1:head(ip_comm, ?IP_PORT, ?config(host, Config),
- ?config(node, Config)),
- ok.
-
-%%-------------------------------------------------------------------------
-ip_get_0_9(doc) ->
- ["Test simple HTTP/0.9 GET"];
-ip_get_0_9(suite)->
- [];
-ip_get_0_9(Config) when is_list(Config) ->
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "GET / \r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/0.9"} ]),
- %% Without space after uri
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "GET /\r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/0.9"} ]),
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "GET / HTTP/0.9\r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/0.9"}]),
+ ok = http_status("POST /htbin/"++ Script ++ " ", Config,
+ [{statuscode, 200}]),
- ok.
-%%-------------------------------------------------------------------------
-ip_head_1_0(doc) ->
- ["Test HTTP/1.0 HEAD"];
-ip_head_1_0(suite)->
- [];
-ip_head_1_0(Config) when is_list(Config) ->
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "HEAD / HTTP/1.0\r\n\r\n", [{statuscode, 200},
- {version, "HTTP/1.0"}]),
+ ok = http_status("POST /htbin/"++ Script ++ " ", Config,
+ [{statuscode, 200}]),
- ok.
-%%-------------------------------------------------------------------------
-ip_get_1_0(doc) ->
- ["Test HTTP/1.0 GET"];
-ip_get_1_0(suite)->
- [];
-ip_get_1_0(Config) when is_list(Config) ->
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "GET / HTTP/1.0\r\n\r\n", [{statuscode, 200},
- {version, "HTTP/1.0"}]),
+ %% Execute an existing, but bad CGI script..
+ ok = http_status("POST /htbin/"++ Script2 ++ " ", Config,
+ [{statuscode, 404}]),
- ok.
-%%-------------------------------------------------------------------------
-ip_post_1_0(doc) ->
- ["Test HTTP/1.0 POST"];
-ip_post_1_0(suite)->
- [];
-ip_post_1_0(Config) when is_list(Config) ->
- Host = ?config(host, Config),
- Node = ?config(node, Config),
- %% Test the post message formatin 1.0! Real post are testes elsewhere
- ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
- "POST / HTTP/1.0\r\n\r\n "
- "Content-Length:6 \r\n\r\nfoobar",
- [{statuscode, 500}, {version, "HTTP/1.0"}]),
+ ok = http_status("POST /cgi-bin/"++ Script2 ++ " ", Config,
+ [{statuscode, 404}]),
- ok.
-%%-------------------------------------------------------------------------
-ip_mod_cgi_chunked_encoding_test(doc) ->
- ["Test the trace module "];
-ip_mod_cgi_chunked_encoding_test(suite)->
- [];
-ip_mod_cgi_chunked_encoding_test(Config) when is_list(Config) ->
- Host = ?config(host, Config),
- Script =
- case test_server:os_type() of
- {win32, _} ->
- "/cgi-bin/printenv.bat";
- _ ->
- "/cgi-bin/printenv.sh"
- end,
- Requests =
- ["GET " ++ Script ++ " HTTP/1.1\r\nHost:"++ Host ++"\r\n\r\n",
- "GET /cgi-bin/erl/httpd_example/newformat HTTP/1.1\r\nHost:"
- ++ Host ++"\r\n\r\n"],
- httpd_1_1:mod_cgi_chunked_encoding_test(ip_comm, ?IP_PORT,
- Host,
- ?config(node, Config),
- Requests),
- ok.
-
-%-------------------------------------------------------------------------
-
-ipv6_hostname_ipcomm() ->
- [{require, ipv6_hosts}].
-ipv6_hostname_ipcomm(X) ->
- SocketType = ip_comm,
- Port = ?IP_PORT,
- ipv6_hostname(SocketType, Port, X).
-
-ipv6_hostname_essl() ->
- [{require, ipv6_hosts}].
-ipv6_hostname_essl(X) ->
- SocketType = essl,
- Port = ?SSL_PORT,
- ipv6_hostname(SocketType, Port, X).
-
-ipv6_hostname(_SocketType, _Port, doc) ->
- ["Test standard ipv6 address"];
-ipv6_hostname(_SocketType, _Port, suite)->
- [];
-ipv6_hostname(SocketType, Port, Config) when is_list(Config) ->
- tsp("ipv6_hostname -> entry with"
- "~n SocketType: ~p"
- "~n Port: ~p"
- "~n Config: ~p", [SocketType, Port, Config]),
- Host = ?config(host, Config),
- URI = "GET HTTP://" ++
- Host ++ ":" ++ integer_to_list(Port) ++ "/ HTTP/1.1\r\n\r\n",
- tsp("ipv6_hostname -> Host: ~p", [Host]),
- httpd_test_lib:verify_request(SocketType, Host, Port, [inet6],
- node(),
- URI,
- [{statuscode, 200}, {version, "HTTP/1.1"}]),
- ok.
-
-%%-------------------------------------------------------------------------
-
-ipv6_address_ipcomm() ->
- [{require, ipv6_hosts}].
-ipv6_address_ipcomm(X) ->
- SocketType = ip_comm,
- Port = ?IP_PORT,
- ipv6_address(SocketType, Port, X).
-
-ipv6_address_essl() ->
- [{require, ipv6_hosts}].
-ipv6_address_essl(X) ->
- SocketType = essl,
- Port = ?SSL_PORT,
- ipv6_address(SocketType, Port, X).
-
-ipv6_address(_SocketType, _Port, doc) ->
- ["Test standard ipv6 address"];
-ipv6_address(_SocketType, _Port, suite)->
- [];
-ipv6_address(SocketType, Port, Config) when is_list(Config) ->
- tsp("ipv6_address -> entry with"
- "~n SocketType: ~p"
- "~n Port: ~p"
- "~n Config: ~p", [SocketType, Port, Config]),
- Host = ?config(host, Config),
- tsp("ipv6_address -> Host: ~p", [Host]),
- URI = "GET HTTP://" ++
- Host ++ ":" ++ integer_to_list(Port) ++ "/ HTTP/1.1\r\n\r\n",
- httpd_test_lib:verify_request(SocketType, Host, Port, [inet6],
- node(),
- URI,
- [{statuscode, 200}, {version, "HTTP/1.1"}]),
- ok.
-
-
-%%--------------------------------------------------------------------
-ticket_5775(doc) ->
- ["Tests that content-length is correct"];
-ticket_5775(suite) ->
- [];
-ticket_5775(Config) ->
- ok=httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
- ?IP_PORT, ?config(node, Config),
- "GET /cgi-bin/erl/httpd_example:get_bin "
- "HTTP/1.0\r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/1.0"}]),
- ok.
-ticket_5865(doc) ->
- ["Tests that a header without last-modified is handled"];
-ticket_5865(suite) ->
- [];
-ticket_5865(Config) ->
- ?SKIP(as_of_r15_behaviour_of_calendar_has_changed),
- Host = ?config(host,Config),
- ServerRoot = ?config(server_root, Config),
- DocRoot = filename:join([ServerRoot, "htdocs"]),
- File = filename:join([DocRoot,"last_modified.html"]),
-
- Bad_mtime = case test_server:os_type() of
- {win32, _} ->
- {{1600,12,31},{23,59,59}};
- {unix, _} ->
- {{1969,12,31},{23,59,59}}
- end,
+ %% Check "ScriptNoCache" directive (default: false)
+ ok = http_status("GET /cgi-bin/" ++ Script ++ " ", Config,
+ [{statuscode, 200},
+ {no_header, "cache-control"}]).
+
+alias() ->
+ [{doc, "Test mod_alias"}].
+
+alias(Config) when is_list(Config) ->
+ ok = http_status("GET /pics/icon.sheet.gif ", Config,
+ [{statuscode, 200},
+ {header, "Content-Type","image/gif"},
+ {header, "Server"},
+ {header, "Date"}]),
- {ok,FI}=file:read_file_info(File),
+ ok = http_status("GET / ", Config,
+ [{statuscode, 200},
+ {header, "Content-Type","text/html"},
+ {header, "Server"},
+ {header, "Date"}]),
- case file:write_file_info(File,FI#file_info{mtime=Bad_mtime}) of
- ok ->
- ok = httpd_test_lib:verify_request(ip_comm, Host,
- ?IP_PORT, ?config(node, Config),
- "GET /last_modified.html"
- " HTTP/1.1\r\nHost:"
- ++Host++"\r\n\r\n",
- [{statuscode, 200},
- {no_header,
- "last-modified"}]),
- ok;
- {error, Reason} ->
- Fault =
- io_lib:format("Attempt to change the file info to set the"
- " preconditions of the test case failed ~p~n",
- [Reason]),
- {skip, Fault}
- end.
-
-ticket_5913(doc) ->
- ["Tests that a header without last-modified is handled"];
-ticket_5913(suite) -> [];
-ticket_5913(Config) ->
- ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
- ?IP_PORT, ?config(node, Config),
- "GET /cgi-bin/erl/httpd_example:get_bin "
- "HTTP/1.0\r\n\r\n",
- [{statuscode, 200},
- {version, "HTTP/1.0"}]),
- ok.
+ ok = http_status("GET /misc/ ", Config,
+ [{statuscode, 200},
+ {header, "Content-Type","text/html"},
+ {header, "Server"},
+ {header, "Date"}]),
+
+ %% Check redirection if trailing slash is missing.
+ ok = http_status("GET /misc ", Config,
+ [{statuscode, 301},
+ {header, "Location"},
+ {header, "Content-Type","text/html"}]).
+
+
+%% auth_api() ->
+%% [{doc, "Test mod_auth API"}].
+
+%% auth_api(Config) when is_list(Config) ->
+%% Version = ?config(http_version, Config),
+%% Host = ?config(host, Config),
+%% ok = http_status("GET / ", Config,
+%% [{statuscode, 200}]),
+%% ok = auth_status(auth_request("/", "one", "WrongPassword", Version, Host), Config,
+%% [{statuscode, 200}]),
+
+%% %% Make sure Authenticate header is received even the second time
+%% %% we try a incorrect password! Otherwise a browser client will hang!
+%% ok = auth_status(auth_request("/" ++ AuthStoreType ++ "open/",
+%% "dummy", "WrongPassword", Host), Config,
+%% [{statuscode, 401},
+%% {header, "WWW-Authenticate"}]),
+%% ok = auth_status(auth_request("/" ++ AuthStoreType ++ "open/", "dummy", "WrongPassword",
+%% Host), Config, [{statuscode, 401},
+%% {header, "WWW-Authenticate"}]),
+
+%% %% Change the password to DummyPassword then try to add a user
+%% %% Get an error and set it to NoPassword
+%% ok = update_password(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "open", "NoPassword", "DummyPassword"),
+%% {error,bad_password} =
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "open", "one",
+%% "onePassword", []),
+%% ok = update_password(Node, ServerRoot, Host, Port, AuthStoreType ++"open",
+%% "DummyPassword", "NoPassword"),
+
+%% %% Test /*open, require user one Aladdin
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType ++ "open"),
-ticket_6003(doc) ->
- ["Tests that a URI with a bad hexadecimal code is handled"];
-ticket_6003(suite) -> [];
-ticket_6003(Config) ->
- ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
- ?IP_PORT, ?config(node, Config),
- "GET http://www.erlang.org/%skalle "
- "HTTP/1.0\r\n\r\n",
- [{statuscode, 400},
- {version, "HTTP/1.0"}]),
- ok.
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "open/",
+%% "one", "onePassword", [{statuscode, 401}]),
+
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "open/",
+%% "two", "twoPassword", [{statuscode, 401}]),
+
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "open/",
+%% "Aladdin", "onePassword", [{statuscode, 401}]),
+
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "open", "one",
+%% "onePassword", []),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "open", "two",
+%% "twoPassword", []),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "open", "Aladdin",
+%% "AladdinPassword", []),
+
+%% {ok, [_|_]} = list_users(Node, ServerRoot, Host, Port,
+%% AuthStoreType++"open"),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++ "open/",
+%% "one", "WrongPassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++ "open/",
+%% "one", "onePassword", [{statuscode, 200}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "open/",
+%% "two", "twoPassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++ "open/",
+%% "Aladdin", "WrongPassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "open/",
+%% "Aladdin", "AladdinPassword", [{statuscode, 200}]),
+
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType++"open"),
+%% {ok, []} = list_users(Node, ServerRoot, Host, Port,
+%% AuthStoreType++"open"),
+
+%% %% Phase 2
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType++"secret"),
+%% {ok, []} = list_users(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "secret"),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "one", "onePassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "two", "twoPassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++ "secret/",
+%% "three", "threePassword", [{statuscode, 401}]),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "secret", "one",
+%% "onePassword",
+%% []),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "secret",
+%% "two", "twoPassword", []),
+%% add_user(Node, ServerRoot, Port, AuthStoreType++"secret", "Aladdin",
+%% "AladdinPassword",[]),
+%% add_group_member(Node, ServerRoot, Port, AuthStoreType ++ "secret",
+%% "one", "group1"),
+%% add_group_member(Node, ServerRoot, Port, AuthStoreType ++ "secret",
+%% "two", "group1"),
+%% add_group_member(Node, ServerRoot, Port, AuthStoreType ++
+%% "secret", "Aladdin", "group2"),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "one", "onePassword", [{statuscode, 200}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "two", "twoPassword", [{statuscode, 200}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "Aladdin", "AladdinPassword", [{statuscode, 200}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++ "secret/",
+%% "three", "threePassword", [{statuscode, 401}]),
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType ++ "secret"),
+%% {ok, []} = list_users(Node, ServerRoot, Host, Port,
+%% AuthStoreType ++ "secret"),
+%% remove_groups(Node, ServerRoot, Host, Port, AuthStoreType ++ "secret"),
+%% Directory = filename:join([ServerRoot, "htdocs", AuthStoreType ++
+%% "secret"]),
+%% {ok, []} = list_groups(Node, ServerRoot, Host, Port, Directory),
+
+%% %% Phase 3
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "secret/top_secret"),
+%% remove_groups(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "secret/top_secret"),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++
+%% "secret/top_secret/",
+%% "three", "threePassword", [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++
+%% "secret/top_secret/", "two", "twoPassword",
+%% [{statuscode, 401}]),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++
+%% "secret/top_secret","three",
+%% "threePassword",[]),
+%% add_user(Node, ServerRoot, Port, AuthStoreType ++ "secret/top_secret",
+%% "two","twoPassword", []),
+%% add_group_member(Node, ServerRoot, Port, AuthStoreType ++
+%% "secret/top_secret",
+%% "three", "group3"),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++
+%% "secret/top_secret/", "three", "threePassword",
+%% [{statuscode, 200}]),
+%% auth_request(Type, Host, Port, Node,"/" ++ AuthStoreType ++
+%% "secret/top_secret/", "two", "twoPassword",
+%% [{statuscode, 401}]),
+%% add_group_member(Node, ServerRoot, Port, AuthStoreType ++
+%% "secret/top_secret",
+%% "two", "group3"),
+%% auth_request(Type,Host,Port,Node,"/" ++ AuthStoreType ++
+%% "secret/top_secret/",
+%% "two", "twoPassword", [{statuscode, 200}]),
+%% remove_users(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "secret/top_secret"),
+%% {ok, []} = list_users(Node, ServerRoot, Host, Port,
+%% AuthStoreType ++ "secret/top_secret"),
+%% remove_groups(Node, ServerRoot, Host, Port, AuthStoreType ++
+%% "secret/top_secret"),
+%% Directory2 = filename:join([ServerRoot, "htdocs",
+%% AuthStoreType ++ "secret/top_secret"]),
+%% {ok, []} = list_groups(Node, ServerRoot, Host, Port, Directory2),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++
+%% "secret/top_secret/", "two", "twoPassword",
+%% [{statuscode, 401}]),
+%% auth_request(Type, Host, Port, Node, "/" ++ AuthStoreType ++
+%% "secret/top_secret/","three", "threePassword",
+%% [{statuscode, 401}]).
-ticket_7304(doc) ->
- ["Tests missing CR in delimiter"];
-ticket_7304(suite) ->
- [];
-ticket_7304(Config) ->
- ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
- ?IP_PORT, ?config(node, Config),
- "GET / HTTP/1.0\r\n\n",
- [{statuscode, 200},
- {version, "HTTP/1.0"}]),
- ok.
%%--------------------------------------------------------------------
-%% Internal functions
+%% Internal functions -----------------------------------
%%--------------------------------------------------------------------
-dos_hostname(Type, Port, Host, Node, Max) ->
- H1 = {"", 200},
- H2 = {"dummy-host.ericsson.se", 200},
- TooLongHeader = lists:append(lists:duplicate(Max + 1, "a")),
- H3 = {TooLongHeader, 403},
- Hosts = [H1,H2,H3],
- dos_hostname_poll(Type, Host, Port, Node, Hosts).
-
-%% make_ipv6(T) when is_tuple(T) andalso (size(T) =:= 8) ->
-%% make_ipv6(tuple_to_list(T));
-
-%% make_ipv6([_, _, _, _, _, _, _, _] = IPV6) ->
-%% lists:flatten(io_lib:format("~s:~s:~s:~s:~s:~s:~s:~s", IPV6)).
-
+setup_server_dirs(ServerRoot, DocRoot, DataDir) ->
+ CgiDir = filename:join(ServerRoot, "cgi-bin"),
+ AuthDir = filename:join(ServerRoot, "auth"),
+ PicsDir = filename:join(ServerRoot, "icons"),
-%%--------------------------------------------------------------------
-%% Other help functions
-create_config(Config, Access, FileName) ->
- ServerRoot = ?config(server_root, Config),
- TcTopDir = ?config(tc_top_dir, Config),
- Port = ?config(port, Config),
- Type = ?config(sock_type, Config),
- Host = ?config(host, Config),
- Mods = io_lib:format("~p", [httpd_mod]),
- Funcs = io_lib:format("~p", [ssl_password_cb]),
- MaxHdrSz = io_lib:format("~p", [256]),
- MaxHdrAct = io_lib:format("~p", [close]),
-
- io:format(user,
- "create_config -> "
- "~n ServerRoot: ~p"
- "~n TcTopDir: ~p"
- "~n Type: ~p"
- "~n Port: ~p"
- "~n Host: ~p"
- "~n", [ServerRoot, TcTopDir, Type, Port, Host]),
-
- SSL =
- if
- (Type =:= ssl) orelse
- (Type =:= essl) ->
- [cline(["SSLCertificateFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLCertificateKeyFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLCACertificateFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLPasswordCallbackModule ", Mods]),
- cline(["SSLPasswordCallbackFunction ", Funcs]),
- cline(["SSLVerifyClient 0"]),
- cline(["SSLVerifyDepth 1"])];
- true ->
- []
- end,
- ModOrder =
- case Access of
- mod_htaccess ->
- "Modules mod_alias mod_htaccess mod_auth "
- "mod_security "
- "mod_responsecontrol mod_trace mod_esi "
- "mod_actions mod_cgi mod_include mod_dir "
- "mod_range mod_get "
- "mod_head mod_log mod_disk_log";
- _ ->
- "Modules mod_alias mod_auth mod_security "
- "mod_responsecontrol mod_trace mod_esi "
- "mod_actions mod_cgi mod_include mod_dir "
- "mod_range mod_get "
- "mod_head mod_log mod_disk_log"
- end,
+ ok = file:make_dir(ServerRoot),
+ ok = file:make_dir(DocRoot),
+ ok = file:make_dir(CgiDir),
+ ok = file:make_dir(AuthDir),
+ ok = file:make_dir(PicsDir),
+
+ DocSrc = filename:join(DataDir, "server_root/htdocs"),
+ AuthSrc = filename:join(DataDir, "server_root/auth"),
+ CgiSrc = filename:join(DataDir, "server_root/cgi-bin"),
+ PicsSrc = filename:join(DataDir, "server_root/icons"),
- %% The test suite currently does not handle an explicit BindAddress.
- %% They assume any has been used, that is Addr is always set to undefined!
-
- %% {ok, Hostname} = inet:gethostname(),
- %% {ok, Addr} = inet:getaddr(Hostname, inet6),
- %% AddrStr = make_ipv6(Addr),
- %% BindAddress = lists:flatten(io_lib:format("~s|inet6", [AddrStr])),
-
- BindAddress = "*|inet",
- %% BindAddress = "*",
-
- HttpConfig = [
- cline(["Port ", integer_to_list(Port)]),
- cline(["ServerName ", Host]),
- cline(["SocketType ", atom_to_list(Type)]),
- cline([ModOrder]),
- %% cline(["LogFormat ", "erlang"]),
- cline(["ServerAdmin [email protected]"]),
- cline(["BindAddress ", BindAddress]),
- cline(["ServerRoot ", ServerRoot]),
- cline(["ErrorLog ", TcTopDir,
- "/logs/error_log_", integer_to_list(Port)]),
- cline(["TransferLog ", TcTopDir,
- "/logs/access_log_", integer_to_list(Port)]),
- cline(["SecurityLog ", TcTopDir,
- "/logs/security_log_", integer_to_list(Port)]),
- cline(["ErrorDiskLog ", TcTopDir,
- "/logs/error_disk_log_", integer_to_list(Port)]),
- cline(["ErrorDiskLogSize ", "190000 ", "11"]),
- cline(["TransferDiskLog ", TcTopDir,
- "/logs/access_disk_log_", integer_to_list(Port)]),
- cline(["TransferDiskLogSize ", "200000 ", "10"]),
- cline(["SecurityDiskLog ", TcTopDir,
- "/logs/security_disk_log_", integer_to_list(Port)]),
- cline(["SecurityDiskLogSize ", "210000 ", "9"]),
- cline(["MaxClients 10"]),
- cline(["MaxHeaderSize ", MaxHdrSz]),
- cline(["MaxHeaderAction ", MaxHdrAct]),
- cline(["DocumentRoot ",
- filename:join(ServerRoot, "htdocs")]),
- cline(["DirectoryIndex ", "index.html ", "welcome.html"]),
- cline(["DefaultType ", "text/plain"]),
- SSL,
- mod_alias_config(ServerRoot),
-
- config_directory(filename:join([ServerRoot,"htdocs",
- "open"]),
- "Open Area",
- filename:join(ServerRoot, "auth/passwd"),
- filename:join(ServerRoot, "auth/group"),
- plain,
- "user one Aladdin",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join([ServerRoot,"htdocs",
- "secret"]),
- "Secret Area",
- filename:join(ServerRoot, "auth/passwd"),
- filename:join(ServerRoot, "auth/group"),
- plain,
- "group group1 group2",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join([ServerRoot,"htdocs",
- "secret",
- "top_secret"]),
- "Top Secret Area",
- filename:join(ServerRoot, "auth/passwd"),
- filename:join(ServerRoot, "auth/group"),
- plain,
- "group group3",
- filename:join(ServerRoot, "security_data")),
-
- config_directory(filename:join([ServerRoot,"htdocs",
- "dets_open"]),
- "Dets Open Area",
- filename:join(ServerRoot, "passwd"),
- filename:join(ServerRoot, "group"),
- dets,
- "user one Aladdin",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join([ServerRoot,"htdocs",
- "dets_secret"]),
- "Dets Secret Area",
- filename:join(ServerRoot, "passwd"),
- filename:join(ServerRoot, "group"),
- dets,
- "group group1 group2",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join([ServerRoot,"htdocs",
- "dets_secret",
- "top_secret"]),
- "Dets Top Secret Area",
- filename:join(ServerRoot, "passwd"),
- filename:join(ServerRoot, "group"),
- dets,
- "group group3",
- filename:join(ServerRoot, "security_data")),
-
- config_directory(filename:join([ServerRoot,"htdocs",
- "mnesia_open"]),
- "Mnesia Open Area",
- false,
- false,
- mnesia,
- "user one Aladdin",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join([ServerRoot,"htdocs",
- "mnesia_secret"]),
- "Mnesia Secret Area",
- false,
- false,
- mnesia,
- "group group1 group2",
- filename:join(ServerRoot, "security_data")),
- config_directory(filename:join(
- [ServerRoot, "htdocs", "mnesia_secret",
- "top_secret"]),
- "Mnesia Top Secret Area",
- false,
- false,
- mnesia,
- "group group3",
- filename:join(ServerRoot, "security_data"))
- ],
- ConfigFile = filename:join([TcTopDir, FileName]),
- {ok, Fd} = file:open(ConfigFile, [write]),
- ok = file:write(Fd, lists:flatten(HttpConfig)),
- ok = file:close(Fd).
-
-config_directory(Dir, AuthName, AuthUserFile, AuthGroupFile, AuthDBType,
- Require, SF) ->
- file:delete(SF),
- [
- cline(["<Directory ", Dir, ">"]),
- cline(["SecurityDataFile ", SF]),
- cline(["SecurityMaxRetries 3"]),
- cline(["SecurityFailExpireTime ", integer_to_list(?FAIL_EXPIRE_TIME)]),
- cline(["SecurityBlockTime 1"]),
- cline(["SecurityAuthTimeout ", integer_to_list(?AUTH_TIMEOUT)]),
- cline(["SecurityCallbackModule ", "httpd_mod"]),
- cline_if_set("AuthUserFile", AuthUserFile),
- cline_if_set("AuthGroupFile", AuthGroupFile),
- cline_if_set("AuthName", AuthName),
- cline_if_set("AuthDBType", AuthDBType),
- cline(["require ", Require]),
- cline(["</Directory>\r\n"])
- ].
-
-mod_alias_config(Root) ->
- [
- cline(["Alias /icons/ ", filename:join(Root,"icons"), "/"]),
- cline(["Alias /pics/ ", filename:join(Root, "icons"), "/"]),
- cline(["ScriptAlias /cgi-bin/ ", filename:join(Root, "cgi-bin"), "/"]),
- cline(["ScriptAlias /htbin/ ", filename:join(Root, "cgi-bin"), "/"]),
- cline(["ErlScriptAlias /cgi-bin/erl httpd_example io"]),
- cline(["EvalScriptAlias /eval httpd_example io"])
- ].
-
-cline(List) ->
- lists:flatten([List, "\r\n"]).
+ inets_test_lib:copy_dirs(DocSrc, DocRoot),
+ inets_test_lib:copy_dirs(AuthSrc, AuthDir),
+ inets_test_lib:copy_dirs(CgiSrc, CgiDir),
+ inets_test_lib:copy_dirs(PicsSrc, PicsDir),
+
+ Cgi = case test_server:os_type() of
+ {win32, _} ->
+ "cgi_echo.exe";
+ _ ->
+ "cgi_echo"
+ end,
+
+ inets_test_lib:copy_file(Cgi, DataDir, CgiDir),
+ AbsCgi = filename:join([CgiDir, Cgi]),
+ {ok, FileInfo} = file:read_file_info(AbsCgi),
+ ok = file:write_file_info(AbsCgi, FileInfo#file_info{mode = 8#00755}),
+
+ EnvCGI = filename:join([ServerRoot, "cgi-bin", "printenv.sh"]),
+ {ok, FileInfo1} = file:read_file_info(EnvCGI),
+ ok = file:write_file_info(EnvCGI,
+ FileInfo1#file_info{mode = 8#00755}).
+
+start_apps(https) ->
+ inets_test_lib:start_apps([crypto, public_key, ssl]);
+start_apps(_) ->
+ ok.
-cline_if_set(_, false) ->
- [];
-cline_if_set(Name, Var) when is_list(Var) ->
- cline([Name, " ", Var]);
-cline_if_set(Name, Var) when is_atom(Var) ->
- cline([Name, " ", atom_to_list(Var)]).
+server_start(_, HttpdConfig) ->
+ {ok, Pid} = inets:start(httpd, HttpdConfig),
+ Serv = inets:services_info(),
+ {value, {_, _, Info}} = lists:keysearch(Pid, 2, Serv),
+ {Pid, proplists:get_value(port, Info)}.
-getaddr() ->
- {ok,HostName} = inet:gethostname(),
- {ok,{A1,A2,A3,A4}} = inet:getaddr(HostName,inet),
- lists:flatten(io_lib:format("~p.~p.~p.~p",[A1,A2,A3,A4])).
+server_config(http, Config) ->
+ ServerRoot = ?config(server_root, Config),
+ [{port, 0},
+ {server_name,"httpd_test"},
+ {server_root, ServerRoot},
+ {document_root, ?config(doc_root, Config)},
+ {bind_address, any},
+ {ipfamily, inet},
+ {max_header_size, 256},
+ {max_header_action, close},
+ {mime_types, [{"html","text/html"},{"htm","text/html"}, {"shtml","text/html"},
+ {"gif", "image/gif"}]},
+ {alias, {"/icons/", filename:join(ServerRoot,"icons") ++ "/"}},
+ {alias, {"/pics/", filename:join(ServerRoot,"icons") ++ "/"}},
+ {script_alias, {"/cgi-bin/", filename:join(ServerRoot, "cgi-bin") ++ "/"}},
+ {script_alias, {"/htbin/", filename:join(ServerRoot, "cgi-bin") ++ "/"}},
+ {erl_script_alias, {"/cgi-bin/erl", [httpd_example, io]}},
+ {eval_script_alias, {"/eval", [httpd_example, io]}}
+ ] ++ auth_conf(ServerRoot);
+server_config(_, _) ->
+ [].
+
+http_request(Request, "HTTP/1.1" = Version, Host, {Headers, Body}) ->
+ Request ++ Version ++ "\r\nhost:" ++ Host ++ "\r\n" ++ Headers ++ "\r\n" ++ Body;
+http_request(Request, Version, _, {Headers, Body}) ->
+ Request ++ Version ++ "\r\n" ++ Headers ++ "\r\n" ++ Body.
+
+http_request(Request, "HTTP/1.1" = Version, Host) ->
+ Request ++ Version ++ "\r\nhost:" ++ Host ++ "\r\n\r\n";
+http_request(Request, Version, _) ->
+ Request ++ Version ++ "\r\n\r\n".
+
+auth_request(Path, User, Passwd, "HTTP/1.1" = Version, Host) ->
+ "GET " ++ Path ++ " " ++ Version ++ "\r\nhost:" ++ Host ++
+ "\r\nAuthorization: Basic " ++
+ base64:encode_to_string(User++":"++Passwd) ++
+ "\r\n\r\n";
+auth_request(Path, User, Passwd, Version, _Host) ->
+ "GET " ++ Path ++ " " ++ Version ++
+ "\r\nAuthorization: Basic " ++
+ base64:encode_to_string(User++":"++Passwd) ++
+ "\r\n\r\n".
+
+head_status("HTTP/0.9") ->
+ 501; %% Not implemented in HTTP/0.9
+head_status(_) ->
+ 200.
+
+auth_conf(Root) ->
+ [{directory, {filename:join(Root, "htdocs/open"),
+ [{auth_type, plain},
+ {auth_name, "Open Area"},
+ {auth_user_file, filename:join(Root, "auth/passwd")},
+ {auth_group_file, filename:join(Root, "auth/group")},
+ {require_user, ["one", "Aladdin"]}]}},
+ {directory, {filename:join(Root, "htdocs/secret"),
+ [{auth_type, plain},
+ {auth_name, "Secret Area"},
+ {auth_user_file, filename:join(Root, "auth/passwd")},
+ {auth_group_file, filename:join(Root, "auth/group")},
+ {require_group, ["group1", "group2"]}]}},
+ {directory, {filename:join(Root, "htdocs/secret/top_secret"),
+ [{auth_type, plain},
+ {auth_name, "Top Secret Area"},
+ {auth_user_file, filename:join(Root, "auth/passwd")},
+ {auth_group_file, filename:join(Root, "auth/group")},
+ {require_group, ["group3"]}]}},
+ {directory, {filename:join(Root, "htdocs/open"),
+ [{auth_type, mnesia},
+ {auth_name, "Open Area"},
+ {auth_user_file, filename:join(Root, "auth/passwd")},
+ {auth_group_file, filename:join(Root, "auth/group")},
+ {require_user, ["one", "Aladdin"]}]}},
+ {directory, {filename:join(Root, "htdocs/secret"),
+ [{auth_type, mnesia},
+ {auth_name, "Secret Area"},
+ {auth_user_file, filename:join(Root, "auth/passwd")},
+ {auth_group_file, filename:join(Root, "auth/group")},
+ {require_group, ["group1", "group2"]}]}}
+ ].
+
+
+http_status(Request, Config, Expected) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request(Request, Version, Host),
+ Expected ++ [{version, Version}]).
+
+http_status(Request, HeadersAndBody, Config, Expected) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ http_request(Request, Version, Host, HeadersAndBody),
+ Expected ++ [{version, Version}]).
+
+auth_status(AuthRequest, Config, Expected) ->
+ Version = ?config(http_version, Config),
+ Host = ?config(host, Config),
+ httpd_test_lib:verify_request(?config(type, Config), Host,
+ ?config(port, Config), ?config(node, Config),
+ AuthRequest,
+ Expected ++ [{version, Version}]).
+
+basic_auth_requiered(Config) ->
+ ok = http_status("GET /open/ ", Config, [{statuscode, 401},
+ {header, "WWW-Authenticate"}]),
+ ok = http_status("GET /secret/ ", Config, [{statuscode, 401},
+ {header, "WWW-Authenticate"}]),
+ ok = http_status("GET /secret/top_secret/ ", Config, [{statuscode, 401},
+ {header, "WWW-Authenticate"}]).
start_mnesia(Node) ->
case rpc:call(Node, ?MODULE, cleanup_mnesia, []) of
ok ->
ok;
Other ->
- tsf({failed_to_cleanup_mnesia, Other})
+ ct:fail({failed_to_cleanup_mnesia, Other})
end,
case rpc:call(Node, ?MODULE, setup_mnesia, []) of
{atomic, ok} ->
ok;
Other2 ->
- tsf({failed_to_setup_mnesia, Other2})
+ ct:fail({failed_to_setup_mnesia, Other2})
end,
ok.
@@ -2259,196 +791,3 @@ cleanup_mnesia() ->
stopped = mnesia:stop(),
mnesia:delete_schema([node()]),
ok.
-
-create_htaccess_data(Path, IpAddress)->
- create_htaccess_dirs(Path),
-
- create_html_file(filename:join([Path,"ht/open/dummy.html"])),
- create_html_file(filename:join([Path,"ht/blocknet/dummy.html"])),
- create_html_file(filename:join([Path,"ht/secret/dummy.html"])),
- create_html_file(filename:join([Path,"ht/secret/top_secret/dummy.html"])),
-
- create_htaccess_file(filename:join([Path,"ht/open/.htaccess"]),
- Path, "user one Aladdin"),
- create_htaccess_file(filename:join([Path,"ht/secret/.htaccess"]),
- Path, "group group1 group2"),
- create_htaccess_file(filename:join([Path,
- "ht/secret/top_secret/.htaccess"]),
- Path, "user four"),
- create_htaccess_file(filename:join([Path,"ht/blocknet/.htaccess"]),
- Path, nouser, IpAddress),
-
- create_user_group_file(filename:join([Path,"ht","users.file"]),
- "one:OnePassword\ntwo:TwoPassword\nthree:"
- "ThreePassword\nfour:FourPassword\nAladdin:"
- "AladdinPassword"),
- create_user_group_file(filename:join([Path,"ht","groups.file"]),
- "group1: two one\ngroup2: two three").
-
-create_html_file(PathAndFileName)->
- file:write_file(PathAndFileName,list_to_binary(
- "<html><head><title>test</title></head>
- <body>testar</body></html>")).
-
-create_htaccess_file(PathAndFileName, BaseDir, RequireData)->
- file:write_file(PathAndFileName,
- list_to_binary(
- "AuthUserFile "++ BaseDir ++
- "/ht/users.file\nAuthGroupFile "++ BaseDir
- ++ "/ht/groups.file\nAuthName Test\nAuthType"
- " Basic\n<Limit>\nrequire " ++ RequireData ++
- "\n</Limit>")).
-
-create_htaccess_file(PathAndFileName, BaseDir, nouser, IpAddress)->
- file:write_file(PathAndFileName,list_to_binary(
- "AuthUserFile "++ BaseDir ++
- "/ht/users.file\nAuthGroupFile " ++
- BaseDir ++ "/ht/groups.file\nAuthName"
- " Test\nAuthType"
- " Basic\n<Limit GET>\n\tallow from " ++
- format_ip(IpAddress,
- string:rchr(IpAddress,$.)) ++
- "\n</Limit>")).
-
-create_user_group_file(PathAndFileName, Data)->
- file:write_file(PathAndFileName, list_to_binary(Data)).
-
-create_htaccess_dirs(Path)->
- ok = file:make_dir(filename:join([Path,"ht"])),
- ok = file:make_dir(filename:join([Path,"ht/open"])),
- ok = file:make_dir(filename:join([Path,"ht/blocknet"])),
- ok = file:make_dir(filename:join([Path,"ht/secret"])),
- ok = file:make_dir(filename:join([Path,"ht/secret/top_secret"])).
-
-remove_htaccess_dirs(Path)->
- file:del_dir(filename:join([Path,"ht/secret/top_secret"])),
- file:del_dir(filename:join([Path,"ht/secret"])),
- file:del_dir(filename:join([Path,"ht/blocknet"])),
- file:del_dir(filename:join([Path,"ht/open"])),
- file:del_dir(filename:join([Path,"ht"])).
-
-format_ip(IpAddress,Pos)when Pos > 0->
- case lists:nth(Pos,IpAddress) of
- $.->
- case lists:nth(Pos-2,IpAddress) of
- $.->
- format_ip(IpAddress,Pos-3);
- _->
- lists:sublist(IpAddress,Pos-2) ++ "."
- end;
- _ ->
- format_ip(IpAddress,Pos-1)
- end;
-
-format_ip(IpAddress, _Pos)->
- "1" ++ IpAddress.
-
-remove_htaccess(Path)->
- file:delete(filename:join([Path,"ht/open/dummy.html"])),
- file:delete(filename:join([Path,"ht/secret/dummy.html"])),
- file:delete(filename:join([Path,"ht/secret/top_secret/dummy.html"])),
- file:delete(filename:join([Path,"ht/blocknet/dummy.html"])),
- file:delete(filename:join([Path,"ht/blocknet/.htaccess"])),
- file:delete(filename:join([Path,"ht/open/.htaccess"])),
- file:delete(filename:join([Path,"ht/secret/.htaccess"])),
- file:delete(filename:join([Path,"ht/secret/top_secret/.htaccess"])),
- file:delete(filename:join([Path,"ht","users.file"])),
- file:delete(filename:join([Path,"ht","groups.file"])),
- remove_htaccess_dirs(Path).
-
-
-dos_hostname_poll(Type, Host, Port, Node, Hosts) ->
- [dos_hostname_poll1(Type, Host, Port, Node, Host1, Code)
- || {Host1,Code} <- Hosts].
-
-dos_hostname_poll1(Type, Host, Port, Node, Host1, Code) ->
- ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
- dos_hostname_request(Host1),
- [{statuscode, Code},
- {version, "HTTP/1.0"}]).
-
-dos_hostname_request(Host) ->
- "GET / HTTP/1.0\r\n" ++ Host ++ "\r\n\r\n".
-
-get_nof_clients(Mode, Load) ->
- get_nof_clients(test_server:os_type(), Mode, Load).
-
-get_nof_clients(_, ip_comm, light) -> 5;
-get_nof_clients(_, ssl, light) -> 2;
-get_nof_clients(_, ip_comm, medium) -> 10;
-get_nof_clients(_, ssl, medium) -> 4;
-get_nof_clients(_, ip_comm, heavy) -> 20;
-get_nof_clients(_, ssl, heavy) -> 6.
-
-%% Make a file 100 bytes long containing 012...9*10
-create_range_data(Path) ->
- PathAndFileName=filename:join([Path,"range.txt"]),
- file:write_file(PathAndFileName,list_to_binary(["12345678901234567890",
- "12345678901234567890",
- "12345678901234567890",
- "12345678901234567890",
- "12345678901234567890"])).
-
-create_ipv6_config(Config, FileName, Ipv6Address) ->
- ServerRoot = ?config(server_root, Config),
- TcTopDir = ?config(tc_top_dir, Config),
- Port = ?config(port, Config),
- SockType = ?config(sock_type, Config),
- Mods = io_lib:format("~p", [httpd_mod]),
- Funcs = io_lib:format("~p", [ssl_password_cb]),
- Host = ?config(ipv6_host, Config),
-
- MaxHdrSz = io_lib:format("~p", [256]),
- MaxHdrAct = io_lib:format("~p", [close]),
-
- Mod_order = "Modules mod_alias mod_auth mod_esi mod_actions mod_cgi"
- " mod_include mod_dir mod_get mod_head"
- " mod_log mod_disk_log mod_trace",
-
- SSL =
- if
- (SockType =:= ssl) orelse
- (SockType =:= essl) ->
- [cline(["SSLCertificateFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLCertificateKeyFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLCACertificateFile ",
- filename:join(ServerRoot, "ssl/ssl_server.pem")]),
- cline(["SSLPasswordCallbackModule ", Mods]),
- cline(["SSLPasswordCallbackFunction ", Funcs]),
- cline(["SSLVerifyClient 0"]),
- cline(["SSLVerifyDepth 1"])];
- true ->
- []
- end,
-
- BindAddress = "[" ++ Ipv6Address ++"]|inet6",
-
- HttpConfig =
- [cline(["BindAddress ", BindAddress]),
- cline(["Port ", integer_to_list(Port)]),
- cline(["ServerName ", Host]),
- cline(["SocketType ", atom_to_list(SockType)]),
- cline([Mod_order]),
- cline(["ServerRoot ", ServerRoot]),
- cline(["DocumentRoot ", filename:join(ServerRoot, "htdocs")]),
- cline(["MaxHeaderSize ",MaxHdrSz]),
- cline(["MaxHeaderAction ",MaxHdrAct]),
- cline(["DirectoryIndex ", "index.html "]),
- cline(["DefaultType ", "text/plain"]),
- SSL],
- ConfigFile = filename:join([TcTopDir,FileName]),
- {ok, Fd} = file:open(ConfigFile, [write]),
- ok = file:write(Fd, lists:flatten(HttpConfig)),
- ok = file:close(Fd).
-
-
-tsp(F) ->
- inets_test_lib:tsp("[~w]" ++ F, [?MODULE]).
-tsp(F, A) ->
- inets_test_lib:tsp("[~w]" ++ F, [?MODULE|A]).
-
-tsf(Reason) ->
- inets_test_lib:tsf(Reason).
-
diff --git a/lib/inets/test/httpd_all.erl b/lib/inets/test/httpd_all.erl
new file mode 100644
index 0000000000..9be02e3fd8
--- /dev/null
+++ b/lib/inets/test/httpd_all.erl
@@ -0,0 +1,240 @@
+alias(Version, Type, Port, Host, Node) ->
+ Opts = [],
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Opts, Node,
+ "GET /pics/icon.sheet.gif "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {header, "Content-Type","image/gif"},
+ {header, "Server"},
+ {header, "Date"},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Opts, Node,
+ "GET / " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {header, "Content-Type","text/html"},
+ {header, "Server"},
+ {header, "Date"},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Opts, Node,
+ "GET /misc/ " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {header, "Content-Type","text/html"},
+ {header, "Server"},
+ {header, "Date"},
+ {version, Version}]),
+
+ %% Check redirection if trailing slash is missing.
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Opts, Node,
+ "GET /misc "++ Version ++ "\r\n\r\n",
+ [{statuscode, 301},
+ {header, "Location"},
+ {header, "Content-Type","text/html"},
+ {version, Version}]).
+
+
+head(Version, Type, Port, Host, Node) ->
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "HEAD /index.html " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]).
+
+
+get(Version, Type, Port, Host, Node) ->
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /index.html " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {header, "Content-Type", "text/html"},
+ {header, "Date"},
+ {header, "Server"},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /fsize.shtml " ++ Version ++ "\r\nHost:"
+ ++ Host ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {header, "Content-Type", "text/html"},
+ {header, "Date"},
+ {header, "Server"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /secret/dummy.html "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 401},
+ {header, "WWW-Authenticate"},
+ {version, Version}]).
+
+esi(Version, Type, Port, Host, Node) ->
+ %% Check "ErlScriptAlias" and "EvalScriptAlias" directives
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /eval?httpd_example:print(\"Hi!\") "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /eval?not_allowed:print(\"Hi!\") "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 403},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /eval?httpd_example:undef(\"Hi!\") "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 500},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 400},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example:get "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example:"
+ "get?input=4711"
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example:"
+ "post " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/not_allowed:post "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 403},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example:undef "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 404},
+ {version, Version}]),
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example/yahoo "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 302},
+ {version, Version}]),
+ %% Check "ErlScriptNoCache" directive (default: false)
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/erl/httpd_example:get "
+ ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {no_header, "cache-control"},
+ {version, "HTTP/1.0"}]).
+
+cgi(Version, Type, Port, Host, Node) ->
+ {Script, Script2, Script3} =
+ case test_server:os_type() of
+ {win32, _} ->
+ {"printenv.bat", "printenv.sh", "cgi_echo.exe"};
+ _ ->
+ {"printenv.sh", "printenv.bat", "cgi_echo"}
+ end,
+
+ %% The length (> 100) is intentional
+ ok = httpd_test_lib:
+ verify_request(Type, Host, Port, Node,
+ "POST /cgi-bin/" ++ Script3 ++
+ Version ++ " \r\n"
+ "Content-Length:100 \r\n\r\n "
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
+ " \r\n\r\n",
+ [{statuscode, 200},
+ {version, Version},
+ {header, "content-type", "text/plain"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/"++ Script ++
+ " " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/not_there " ++
+ Version ++ "\r\n\r\n",
+ [{statuscode, 404},{statuscode, 500},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/"++ Script ++
+ "?Nisse:kkk?sss/lll " ++ Version ++ "\r\n\r\n",
+ [{statuscode, 200},
+ {version, Version}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "POST /cgi-bin/"++ Script ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /htbin/"++ Script ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /htbin/not_there "
+ "HTTP/1.0\r\n\r\n",
+ [{statuscode, 404},{statuscode, 500},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /htbin/"++ Script ++
+ "?Nisse:kkk?sss/lll HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "POST /htbin/"++ Script ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "POST /htbin/"++ Script ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ %% Execute an existing, but bad CGI script..
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "POST /htbin/"++ Script2 ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 404},
+ {version, "HTTP/1.0"}]),
+
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "POST /cgi-bin/"++ Script2 ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 404},
+ {version, "HTTP/1.0"}]),
+
+ %% Check "ScriptNoCache" directive (default: false)
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ "GET /cgi-bin/" ++ Script ++
+ " HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {no_header, "cache-control"},
+ {version, "HTTP/1.0"}]).
+
diff --git a/lib/inets/test/httpd_block.erl b/lib/inets/test/httpd_block.erl
index ac1bf43ff5..706d014bda 100644
--- a/lib/inets/test/httpd_block.erl
+++ b/lib/inets/test/httpd_block.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2005-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2005-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -19,8 +19,7 @@
%%
-module(httpd_block).
--include("test_server.hrl").
--include("test_server_line.hrl").
+-include_lib("common_test/include/ct.hrl").
%% General testcases bodies called from httpd_SUITE
-export([block_disturbing_idle/4, block_non_disturbing_idle/4,
@@ -88,7 +87,7 @@ block_503(Type, Port, Host, Node) ->
block_disturbing_active(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Pid = long_poll(Type, Host, Port, Node, 200, 60000),
- test_server:sleep(15000),
+ ct:sleep(15000),
block_server(Node, Host, Port),
await_suite_failed_process_exit(Pid, "poller", 60000,
connection_closed),
@@ -100,7 +99,7 @@ block_disturbing_active(Type, Port, Host, Node) ->
block_non_disturbing_active(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
- test_server:sleep(15000),
+ ct:sleep(15000),
ok = block_nd_server(Node, Host, Port),
await_normal_process_exit(Poller, "poller", 60000),
blocked = get_admin_state(Node, Host, Port),
@@ -111,7 +110,7 @@ block_non_disturbing_active(Type, Port, Host, Node) ->
block_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
- test_server:sleep(15000),
+ ct:sleep(15000),
Blocker = blocker(Node, Host, Port, 50000),
await_normal_process_exit(Blocker, "blocker", 50000),
await_normal_process_exit(Poller, "poller", 30000),
@@ -123,7 +122,7 @@ block_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
block_disturbing_active_timeout_released(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 40000),
- test_server:sleep(5000),
+ ct:sleep(5000),
Blocker = blocker(Node, Host, Port, 10000),
await_normal_process_exit(Blocker, "blocker", 15000),
await_suite_failed_process_exit(Poller, "poller", 40000,
@@ -146,7 +145,7 @@ block_non_disturbing_active_timeout_not_released(Type, Port, Host, Node) ->
block_non_disturbing_active_timeout_released(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 45000),
- test_server:sleep(5000),
+ ct:sleep(5000),
Blocker = blocker_nd(Node, Host, Port ,10000, {error,timeout}),
await_normal_process_exit(Blocker, "blocker", 15000),
await_normal_process_exit(Poller, "poller", 50000),
@@ -157,9 +156,9 @@ block_non_disturbing_active_timeout_released(Type, Port, Host, Node) ->
disturbing_blocker_dies(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
- test_server:sleep(5000),
+ ct:sleep(5000),
Blocker = blocker(Node, Host, Port, 10000),
- test_server:sleep(5000),
+ ct:sleep(5000),
exit(Blocker,simulate_blocker_crash),
await_normal_process_exit(Poller, "poller", 60000),
unblocked = get_admin_state(Node, Host, Port),
@@ -170,9 +169,9 @@ disturbing_blocker_dies(Type, Port, Host, Node) ->
non_disturbing_blocker_dies(Type, Port, Host, Node) ->
process_flag(trap_exit, true),
Poller = long_poll(Type, Host, Port, Node, 200, 60000),
- test_server:sleep(5000),
+ ct:sleep(5000),
Blocker = blocker_nd(Node, Host, Port, 10000, ok),
- test_server:sleep(5000),
+ ct:sleep(5000),
exit(Blocker, simulate_blocker_crash),
await_normal_process_exit(Poller, "poller", 60000),
unblocked = get_admin_state(Node, Host, Port),
@@ -297,9 +296,12 @@ httpd_restart(Addr, Port) ->
make_name(Addr, Port) ->
httpd_util:make_name("httpd", Addr, Port).
-get_admin_state(Node, _Host, Port) ->
- Addr = undefined,
- rpc:call(Node, httpd, get_admin_state, [Addr, Port]).
+get_admin_state(_, _Host, Port) ->
+ Name = make_name(undefined, Port),
+ {status, _, _, StatusInfo} = sys:get_status(whereis(Name)),
+ [_, _,_, _, Prop] = StatusInfo,
+ State = state(Prop),
+ element(6, State).
validate_admin_state(Node, Host, Port, Expect) ->
io:format("try validating server admin state: ~p~n", [Expect]),
@@ -323,15 +325,15 @@ await_normal_process_exit(Pid, Name, Timeout) ->
io_lib:format("expected normal exit, "
"unexpected exit of ~s process: ~p",
[Name, Reason])),
- test_server:fail(Err)
+ ct:fail(Err)
after Timeout ->
- test_server:fail("timeout while waiting for " ++ Name)
+ ct:fail("timeout while waiting for " ++ Name)
end.
await_suite_failed_process_exit(Pid, Name, Timeout, Why) ->
receive
- {'EXIT', Pid, {suite_failed, Why}} ->
+ {'EXIT', Pid, {test_failed, Why}} ->
ok;
{'EXIT', Pid, Reason} ->
Err =
@@ -339,9 +341,9 @@ await_suite_failed_process_exit(Pid, Name, Timeout, Why) ->
io_lib:format("expected connection_closed, "
"unexpected exit of ~s process: ~p",
[Name, Reason])),
- test_server:fail(Err)
+ ct:fail(Err)
after Timeout ->
- test_server:fail("timeout while waiting for " ++ Name)
+ ct:fail("timeout while waiting for " ++ Name)
end.
long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
@@ -359,10 +361,13 @@ do_long_poll(Type, Host, Port, Node, StatusCode, Timeout) ->
ok ->
exit(normal);
Reason ->
- test_server:fail(Reason)
+ exit({test_failed, Reason})
end.
-
-
-
+state([{data,[{"State", State}]} | _]) ->
+ State;
+state([{data,[{"StateData", State}]} | _]) ->
+ State;
+state([_ | Rest]) ->
+ state(Rest).
diff --git a/lib/inets/test/httpd_mod_SUITE.erl b/lib/inets/test/httpd_mod_SUITE.erl
new file mode 100644
index 0000000000..d23cd22670
--- /dev/null
+++ b/lib/inets/test/httpd_mod_SUITE.erl
@@ -0,0 +1,76 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2013-2013. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+
+%%
+%% ct:run("../inets_test", httpd_mod_SUITE).
+-module(httpd_mod_SUITE).
+
+-include_lib("kernel/include/file.hrl").
+-include_lib("common_test/include/ct.hrl").
+-include("inets_test_lib.hrl").
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+%%--------------------------------------------------------------------
+%% Common Test interface functions -----------------------------------
+%%--------------------------------------------------------------------
+suite() ->
+ [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [
+ {group, http},
+ {group, https}
+ ].
+
+groups() ->
+ [
+ {http, [], all_version_groups()},
+ {https, [], all_version_groups()}
+ {http_1_1, [], []},
+ {http_1_0, [], []},
+ {http_0_9, [], []},
+ {mod_alias, [], []},
+ {mod_actions, [], []},
+ {mod_security, [], []},
+ {mod_auth, [], []},
+ {mod_htaccess, [], []},
+ {mod_cgi, [], []},
+ {mod_esi, [], []},
+ {mod_head, [], []},
+ {configure, [], []}
+ ].
+
+all_version_groups ()->
+ [
+ {group, mod_alias},
+ {group, mod_actions},
+ {group, mod_security},
+ {group, mod_auth},
+ {group, mod_htaccess},
+ {group, mod_cgi},
+ {group, mod_esi},
+ {group, mod_head}
+ ].
+
+%%-------------------------------------------------------------------------
+%% Test cases starts here.
+%%-------------------------------------------------------------------------
diff --git a/lib/inets/test/httpd_test_lib.erl b/lib/inets/test/httpd_test_lib.erl
index 3e82324a30..6406eeae79 100644
--- a/lib/inets/test/httpd_test_lib.erl
+++ b/lib/inets/test/httpd_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -187,12 +187,12 @@ request(#state{mfa = {Module, Function, Args},
{tcp_closed, Socket} ->
io:format("~p ~w[~w]request -> received (tcp) closed"
"~n", [self(), ?MODULE, ?LINE]),
- test_server:fail(connection_closed);
+ exit({test_failed, connection_closed});
{tcp_error, Socket, Reason} ->
io:format("~p ~w[~w]request -> received (tcp) error"
"~n Reason: ~p"
"~n", [self(), ?MODULE, ?LINE, Reason]),
- test_server:fail({tcp_error, Reason});
+ ct:fail({tcp_error, Reason});
{ssl, Socket, Data} ->
print(ssl, Data, State),
case Module:Function([Data | Args]) of
@@ -207,13 +207,13 @@ request(#state{mfa = {Module, Function, Args},
print(ssl, "closed", State),
State#state{body = hd(Args)};
{ssl_closed, Socket} ->
- test_server:fail(connection_closed);
+ exit({test_failed, connection_closed});
{ssl_error, Socket, Reason} ->
- test_server:fail({ssl_error, Reason})
+ ct:fail({ssl_error, Reason})
after TimeOut ->
io:format("~p ~w[~w]request -> timeout"
"~n", [self(), ?MODULE, ?LINE]),
- test_server:fail(connection_timed_out)
+ ct:fail(connection_timed_out)
end.
handle_http_msg({Version, StatusCode, ReasonPharse, Headers, Body},
@@ -277,7 +277,7 @@ handle_http_body(Body, State = #state{headers = Headers,
request(State#state{mfa = MFA}, 5000)
end;
false ->
- test_server:fail(body_too_big)
+ ct:fail(body_too_big)
end
end.
@@ -405,7 +405,7 @@ check_body(_, _, _, _,_) ->
ok.
print(Proto, Data, #state{print = true}) ->
- test_server:format("Received ~p: ~p~n", [Proto, Data]);
+ ct:pal("Received ~p: ~p~n", [Proto, Data]);
print(_, _, #state{print = false}) ->
ok.
diff --git a/lib/inets/test/inets_sup_SUITE.erl b/lib/inets/test/inets_sup_SUITE.erl
index 0ac940fd3e..12b85a816f 100644
--- a/lib/inets/test/inets_sup_SUITE.erl
+++ b/lib/inets/test/inets_sup_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -21,7 +21,7 @@
-module(inets_sup_SUITE).
-include_lib("common_test/include/ct.hrl").
--include("test_server_line.hrl").
+
%% Note: This directive should only be used in test suites.
-compile(export_all).
@@ -297,13 +297,14 @@ httpd_subtree(Config) when is_list(Config) ->
%% Check that we have the expected httpd instance children
io:format("httpd_subtree -> verify httpd instance children "
"(acceptor, misc and manager)~n", []),
+ {ok, _} = verify_child(Instance, httpd_connection_sup, supervisor),
{ok, _} = verify_child(Instance, httpd_acceptor_sup, supervisor),
{ok, _} = verify_child(Instance, httpd_misc_sup, supervisor),
{ok, _} = verify_child(Instance, httpd_manager, worker),
%% Check that the httpd instance acc supervisor has children
io:format("httpd_subtree -> verify acc~n", []),
- InstanceAcc = httpd_util:make_name("httpd_acc_sup", Addr, Port),
+ InstanceAcc = httpd_util:make_name("httpd_acceptor_sup", Addr, Port),
case supervisor:which_children(InstanceAcc) of
[_ | _] ->
ok;
diff --git a/lib/inets/test/inets_test_lib.erl b/lib/inets/test/inets_test_lib.erl
index 6ccc7b0da1..4be9d9c8b3 100644
--- a/lib/inets/test/inets_test_lib.erl
+++ b/lib/inets/test/inets_test_lib.erl
@@ -287,7 +287,9 @@ print(F, A, Mod, Line) ->
print("", F, A, Mod, Line).
hostname() ->
- from($@, atom_to_list(node())).
+ {ok, Name} = inet:gethostname(),
+ Name.
+
from(H, [H | T]) -> T;
from(H, [_ | T]) -> from(H, T);
from(_, []) -> [].
@@ -545,14 +547,14 @@ tsp(F) ->
tsp(F, []).
tsp(F, A) ->
Timestamp = formated_timestamp(),
- test_server:format("*** ~s ~p ~p " ++ F ++ "~n",
+ ct:pal("*** ~s ~p ~p " ++ F ++ "~n",
[Timestamp, node(), self() | A]).
tsf(Reason) ->
- test_server:fail(Reason).
+ ct:fail(Reason).
tss(Time) ->
- test_server:sleep(Time).
+ ct:sleep(Time).
timestamp() ->
http_util:timestamp().
diff --git a/lib/inets/test/old_httpd_SUITE.erl b/lib/inets/test/old_httpd_SUITE.erl
new file mode 100644
index 0000000000..de9aa4562e
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE.erl
@@ -0,0 +1,2445 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+
+-module(old_httpd_SUITE).
+
+-include_lib("test_server/include/test_server.hrl").
+-include("test_server_line.hrl").
+-include("inets_test_lib.hrl").
+
+-include_lib("kernel/include/file.hrl").
+
+%% Test server specific exports
+-export([all/0, suite/0,groups/0,init_per_group/2,end_per_group/2]).
+-export([init_per_testcase/2, end_per_testcase/2,
+ init_per_suite/1, end_per_suite/1]).
+
+%% Core Server tests
+-export([
+ ip_mod_alias/1,
+ ip_mod_actions/1,
+ ip_mod_security/1,
+ ip_mod_auth/1,
+ ip_mod_auth_api/1,
+ ip_mod_auth_mnesia_api/1,
+ ip_mod_htaccess/1,
+ ip_mod_cgi/1,
+ ip_mod_esi/1,
+ ip_mod_get/1,
+ ip_mod_head/1,
+ ip_mod_all/1,
+ ip_load_light/1,
+ ip_load_medium/1,
+ ip_load_heavy/1,
+ ip_dos_hostname/1,
+ ip_time_test/1,
+ ip_block_disturbing_idle/1,
+ ip_block_non_disturbing_idle/1,
+ ip_block_503/1,
+ ip_block_disturbing_active/1,
+ ip_block_non_disturbing_active/1,
+ ip_block_disturbing_active_timeout_not_released/1,
+ ip_block_disturbing_active_timeout_released/1,
+ ip_block_non_disturbing_active_timeout_not_released/1,
+ ip_block_non_disturbing_active_timeout_released/1,
+ ip_block_disturbing_blocker_dies/1,
+ ip_block_non_disturbing_blocker_dies/1,
+ ip_restart_no_block/1,
+ ip_restart_disturbing_block/1,
+ ip_restart_non_disturbing_block/1
+ ]).
+
+-export([
+ essl_mod_alias/1,
+ essl_mod_actions/1,
+ essl_mod_security/1,
+ essl_mod_auth/1,
+ essl_mod_auth_api/1,
+ essl_mod_auth_mnesia_api/1,
+ essl_mod_htaccess/1,
+ essl_mod_cgi/1,
+ essl_mod_esi/1,
+ essl_mod_get/1,
+ essl_mod_head/1,
+ essl_mod_all/1,
+ essl_load_light/1,
+ essl_load_medium/1,
+ essl_load_heavy/1,
+ essl_dos_hostname/1,
+ essl_time_test/1,
+ essl_restart_no_block/1,
+ essl_restart_disturbing_block/1,
+ essl_restart_non_disturbing_block/1,
+ essl_block_disturbing_idle/1,
+ essl_block_non_disturbing_idle/1,
+ essl_block_503/1,
+ essl_block_disturbing_active/1,
+ essl_block_non_disturbing_active/1,
+ essl_block_disturbing_active_timeout_not_released/1,
+ essl_block_disturbing_active_timeout_released/1,
+ essl_block_non_disturbing_active_timeout_not_released/1,
+ essl_block_non_disturbing_active_timeout_released/1,
+ essl_block_disturbing_blocker_dies/1,
+ essl_block_non_disturbing_blocker_dies/1
+ ]).
+
+%%% HTTP 1.1 tests
+-export([ip_host/1, ip_chunked/1, ip_expect/1, ip_range/1,
+ ip_if_test/1, ip_http_trace/1, ip_http1_1_head/1,
+ ip_mod_cgi_chunked_encoding_test/1]).
+
+%%% HTTP 1.0 tests
+-export([ip_head_1_0/1, ip_get_1_0/1, ip_post_1_0/1]).
+
+%%% HTTP 0.9 tests
+-export([ip_get_0_9/1]).
+
+%%% Ticket tests
+-export([ticket_5775/1,ticket_5865/1,ticket_5913/1,ticket_6003/1,
+ ticket_7304/1]).
+
+%%% IPv6 tests
+-export([ipv6_hostname_ipcomm/0, ipv6_hostname_ipcomm/1,
+ ipv6_address_ipcomm/0, ipv6_address_ipcomm/1,
+ ipv6_hostname_essl/0, ipv6_hostname_essl/1,
+ ipv6_address_essl/0, ipv6_address_essl/1]).
+
+%% Help functions
+-export([cleanup_mnesia/0, setup_mnesia/0, setup_mnesia/1]).
+
+-define(IP_PORT, 8898).
+-define(SSL_PORT, 8899).
+-define(MAX_HEADER_SIZE, 256).
+-define(IPV6_LOCAL_HOST, "0:0:0:0:0:0:0:1").
+
+%% Minutes before failed auths timeout.
+-define(FAIL_EXPIRE_TIME,1).
+
+%% Seconds before successful auths timeout.
+-define(AUTH_TIMEOUT,5).
+
+-record(httpd_user, {user_name, password, user_data}).
+-record(httpd_group, {group_name, userlist}).
+
+
+%%--------------------------------------------------------------------
+%% all(Arg) -> [Doc] | [Case] | {skip, Comment}
+%% Arg - doc | suite
+%% Doc - string()
+%% Case - atom()
+%% Name of a test case function.
+%% Comment - string()
+%% Description: Returns documentation/test cases in this test suite
+%% or a skip tuple if the platform is not supported.
+%%--------------------------------------------------------------------
+suite() -> [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [
+ {group, ip},
+ {group, ssl},
+ {group, http_1_1_ip},
+ {group, http_1_0_ip},
+ {group, http_0_9_ip},
+ {group, ipv6},
+ {group, tickets}
+ ].
+
+groups() ->
+ [
+ {ip, [],
+ [ip_mod_alias, ip_mod_actions, ip_mod_security,
+ ip_mod_auth, ip_mod_auth_api, ip_mod_auth_mnesia_api,
+ ip_mod_htaccess, ip_mod_cgi, ip_mod_esi, ip_mod_get,
+ ip_mod_head, ip_mod_all, ip_load_light, ip_load_medium,
+ ip_load_heavy, ip_dos_hostname, ip_time_test,
+ ip_restart_no_block, ip_restart_disturbing_block,
+ ip_restart_non_disturbing_block,
+ ip_block_disturbing_idle, ip_block_non_disturbing_idle,
+ ip_block_503, ip_block_disturbing_active,
+ ip_block_non_disturbing_active,
+ ip_block_disturbing_active_timeout_not_released,
+ ip_block_disturbing_active_timeout_released,
+ ip_block_non_disturbing_active_timeout_not_released,
+ ip_block_non_disturbing_active_timeout_released,
+ ip_block_disturbing_blocker_dies,
+ ip_block_non_disturbing_blocker_dies]},
+ {ssl, [], [{group, essl}]},
+ {essl, [],
+ [essl_mod_alias, essl_mod_actions, essl_mod_security,
+ essl_mod_auth, essl_mod_auth_api,
+ essl_mod_auth_mnesia_api, essl_mod_htaccess,
+ essl_mod_cgi, essl_mod_esi, essl_mod_get, essl_mod_head,
+ essl_mod_all, essl_load_light, essl_load_medium,
+ essl_load_heavy, essl_dos_hostname, essl_time_test,
+ essl_restart_no_block, essl_restart_disturbing_block,
+ essl_restart_non_disturbing_block,
+ essl_block_disturbing_idle,
+ essl_block_non_disturbing_idle, essl_block_503,
+ essl_block_disturbing_active,
+ essl_block_non_disturbing_active,
+ essl_block_disturbing_active_timeout_not_released,
+ essl_block_disturbing_active_timeout_released,
+ essl_block_non_disturbing_active_timeout_not_released,
+ essl_block_non_disturbing_active_timeout_released,
+ essl_block_disturbing_blocker_dies,
+ essl_block_non_disturbing_blocker_dies]},
+ {http_1_1_ip, [],
+ [ip_host, ip_chunked, ip_expect, ip_range, ip_if_test,
+ ip_http_trace, ip_http1_1_head,
+ ip_mod_cgi_chunked_encoding_test]},
+ {http_1_0_ip, [],
+ [ip_head_1_0, ip_get_1_0, ip_post_1_0]},
+ {http_0_9_ip, [], [ip_get_0_9]},
+ {ipv6, [], [ipv6_hostname_ipcomm, ipv6_address_ipcomm,
+ ipv6_hostname_essl, ipv6_address_essl]},
+ {tickets, [],
+ [ticket_5775, ticket_5865, ticket_5913, ticket_6003,
+ ticket_7304]}].
+
+
+init_per_group(ipv6 = _GroupName, Config) ->
+ case inets_test_lib:has_ipv6_support() of
+ {ok, _} ->
+ Config;
+ _ ->
+ {skip, "Host does not support IPv6"}
+ end;
+init_per_group(_GroupName, Config) ->
+ Config.
+
+end_per_group(_GroupName, Config) ->
+ Config.
+
+
+%%--------------------------------------------------------------------
+%% Function: init_per_suite(Config) -> Config
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%% Description: Initiation before the whole suite
+%%
+%% Note: This function is free to add any key/value pairs to the Config
+%% variable, but should NOT alter/remove any existing entries.
+%%--------------------------------------------------------------------
+init_per_suite(Config) ->
+ io:format(user, "init_per_suite -> entry with"
+ "~n Config: ~p"
+ "~n", [Config]),
+
+ ?PRINT_SYSTEM_INFO([]),
+
+ PrivDir = ?config(priv_dir, Config),
+ SuiteTopDir = filename:join(PrivDir, ?MODULE),
+ case file:make_dir(SuiteTopDir) of
+ ok ->
+ ok;
+ {error, eexist} ->
+ ok;
+ Error ->
+ throw({error, {failed_creating_suite_top_dir, Error}})
+ end,
+
+ [{has_ipv6_support, inets_test_lib:has_ipv6_support()},
+ {suite_top_dir, SuiteTopDir},
+ {node, node()},
+ {host, inets_test_lib:hostname()},
+ {address, getaddr()} | Config].
+
+
+%%--------------------------------------------------------------------
+%% Function: end_per_suite(Config) -> _
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%% Description: Cleanup after the whole suite
+%%--------------------------------------------------------------------
+
+end_per_suite(_Config) ->
+ %% SuiteTopDir = ?config(suite_top_dir, Config),
+ %% inets_test_lib:del_dirs(SuiteTopDir),
+ ok.
+
+
+%%--------------------------------------------------------------------
+%% Function: init_per_testcase(Case, Config) -> Config
+%% Case - atom()
+%% Name of the test case that is about to be run.
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%%
+%% Description: Initiation before each test case
+%%
+%% Note: This function is free to add any key/value pairs to the Config
+%% variable, but should NOT alter/remove any existing entries.
+%%--------------------------------------------------------------------
+init_per_testcase(Case, Config) ->
+ NewConfig = init_per_testcase2(Case, Config),
+ init_per_testcase3(Case, NewConfig).
+
+
+init_per_testcase2(Case, Config) ->
+
+ %% tsp("init_per_testcase2 -> entry with"
+ %% "~n Config: ~p", [Config]),
+
+ IpNormal = integer_to_list(?IP_PORT) ++ ".conf",
+ IpHtaccess = integer_to_list(?IP_PORT) ++ "htaccess.conf",
+ SslNormal = integer_to_list(?SSL_PORT) ++ ".conf",
+ SslHtaccess = integer_to_list(?SSL_PORT) ++ "htaccess.conf",
+
+ DataDir = ?config(data_dir, Config),
+ SuiteTopDir = ?config(suite_top_dir, Config),
+
+ %% tsp("init_per_testcase2 -> "
+ %% "~n SuiteDir: ~p"
+ %% "~n DataDir: ~p", [SuiteTopDir, DataDir]),
+
+ TcTopDir = filename:join(SuiteTopDir, Case),
+ ?line ok = file:make_dir(TcTopDir),
+
+ %% tsp("init_per_testcase2 -> "
+ %% "~n TcTopDir: ~p", [TcTopDir]),
+
+ DataSrc = filename:join([DataDir, "server_root"]),
+ ServerRoot = filename:join([TcTopDir, "server_root"]),
+
+ %% tsp("init_per_testcase2 -> "
+ %% "~n DataSrc: ~p"
+ %% "~n ServerRoot: ~p", [DataSrc, ServerRoot]),
+
+ ok = file:make_dir(ServerRoot),
+ ok = file:make_dir(filename:join([TcTopDir, "logs"])),
+
+ NewConfig = [{tc_top_dir, TcTopDir}, {server_root, ServerRoot} | Config],
+
+ %% tsp("init_per_testcase2 -> copy DataSrc to ServerRoot"),
+
+ inets_test_lib:copy_dirs(DataSrc, ServerRoot),
+
+ %% tsp("init_per_testcase2 -> fix cgi"),
+ EnvCGI = filename:join([ServerRoot, "cgi-bin", "printenv.sh"]),
+ {ok, FileInfo} = file:read_file_info(EnvCGI),
+ ok = file:write_file_info(EnvCGI,
+ FileInfo#file_info{mode = 8#00755}),
+
+ EchoCGI = case test_server:os_type() of
+ {win32, _} ->
+ "cgi_echo.exe";
+ _ ->
+ "cgi_echo"
+ end,
+ CGIDir = filename:join([ServerRoot, "cgi-bin"]),
+ inets_test_lib:copy_file(EchoCGI, DataDir, CGIDir),
+ NewEchoCGI = filename:join([CGIDir, EchoCGI]),
+ {ok, FileInfo1} = file:read_file_info(NewEchoCGI),
+ ok = file:write_file_info(NewEchoCGI,
+ FileInfo1#file_info{mode = 8#00755}),
+
+ %% To be used by IP test cases
+ %% tsp("init_per_testcase2 -> ip testcase setups"),
+ create_config([{port, ?IP_PORT}, {sock_type, ip_comm} | NewConfig],
+ normal_access, IpNormal),
+ create_config([{port, ?IP_PORT}, {sock_type, ip_comm} | NewConfig],
+ mod_htaccess, IpHtaccess),
+
+ %% To be used by SSL test cases
+ %% tsp("init_per_testcase2 -> ssl testcase setups"),
+ SocketType =
+ case atom_to_list(Case) of
+ [X, $s, $s, $l | _] ->
+ case X of
+ $p -> ssl;
+ $e -> essl
+ end;
+ _ ->
+ ssl
+ end,
+
+ create_config([{port, ?SSL_PORT}, {sock_type, SocketType} | NewConfig],
+ normal_access, SslNormal),
+ create_config([{port, ?SSL_PORT}, {sock_type, SocketType} | NewConfig],
+ mod_htaccess, SslHtaccess),
+
+ %% To be used by IPv6 test cases. Case-clause is so that
+ %% you can do ts:run(inets, httpd_SUITE, <test case>)
+ %% for all cases except the ipv6 cases as they depend
+ %% on 'test_host_ipv6_only' that will only be present
+ %% when you run the whole test suite due to shortcomings
+ %% of the test server.
+
+ tsp("init_per_testcase2 -> maybe generate IPv6 config file(s)"),
+ NewConfig2 =
+ case atom_to_list(Case) of
+ "ipv6_" ++ _ ->
+ case (catch inets_test_lib:has_ipv6_support(NewConfig)) of
+ {ok, IPv6Address0} ->
+ {ok, Hostname} = inet:gethostname(),
+ IPv6Address = http_transport:ipv6_name(IPv6Address0),
+ create_ipv6_config([{port, ?IP_PORT},
+ {sock_type, ip_comm},
+ {ipv6_host, IPv6Address} |
+ NewConfig],
+ "ipv6_hostname_ipcomm.conf",
+ Hostname),
+ create_ipv6_config([{port, ?IP_PORT},
+ {sock_type, ip_comm},
+ {ipv6_host, IPv6Address} |
+ NewConfig],
+ "ipv6_address_ipcomm.conf",
+ IPv6Address),
+ create_ipv6_config([{port, ?SSL_PORT},
+ {sock_type, essl},
+ {ipv6_host, IPv6Address} |
+ NewConfig],
+ "ipv6_hostname_essl.conf",
+ Hostname),
+ create_ipv6_config([{port, ?SSL_PORT},
+ {sock_type, essl},
+ {ipv6_host, IPv6Address} |
+ NewConfig],
+ "ipv6_address_essl.conf",
+ IPv6Address),
+ [{ipv6_host, IPv6Address} | NewConfig];
+ _ ->
+ NewConfig
+ end;
+
+ _ ->
+ NewConfig
+ end,
+
+ %% tsp("init_per_testcase2 -> done when"
+ %% "~n NewConfig2: ~p", [NewConfig2]),
+
+ NewConfig2.
+
+
+init_per_testcase3(Case, Config) ->
+ tsp("init_per_testcase3(~w) -> entry with"
+ "~n Config: ~p", [Case, Config]),
+
+
+%% %% Create a new fresh node to be used by the server in this test-case
+
+%% NodeName = list_to_atom(atom_to_list(Case) ++ "_httpd"),
+%% Node = inets_test_lib:start_node(NodeName),
+
+ %% Clean up (we do not want this clean up in end_per_testcase
+ %% if init_per_testcase crashes for some testcase it will
+ %% have contaminated the environment and there will be no clean up.)
+ %% This init can take a few different paths so that one crashes
+ %% does not mean that all invocations will.
+
+ application:unset_env(inets, services),
+ application:stop(inets),
+ application:stop(ssl),
+ cleanup_mnesia(),
+
+ %% Start initialization
+ tsp("init_per_testcase3(~w) -> start init", [Case]),
+
+ Dog = test_server:timetrap(inets_test_lib:minutes(10)),
+ NewConfig = lists:keydelete(watchdog, 1, Config),
+ TcTopDir = ?config(tc_top_dir, Config),
+
+ CaseRest =
+ case atom_to_list(Case) of
+ "ip_mod_htaccess" ->
+ inets_test_lib:start_http_server(
+ filename:join(TcTopDir,
+ integer_to_list(?IP_PORT) ++
+ "htaccess.conf")),
+ "mod_htaccess";
+ "ip_" ++ Rest ->
+ inets_test_lib:start_http_server(
+ filename:join(TcTopDir,
+ integer_to_list(?IP_PORT) ++ ".conf")),
+ Rest;
+ "ticket_5913" ->
+ HttpdOptions =
+ [{file,
+ filename:join(TcTopDir,
+ integer_to_list(?IP_PORT) ++ ".conf")},
+ {accept_timeout,30000},
+ {debug,[{exported_functions,
+ [httpd_manager,httpd_request_handler]}]}],
+ inets_test_lib:start_http_server(HttpdOptions);
+ "ticket_"++Rest ->
+ %% OTP-5913 use the new syntax of inets.config
+ inets_test_lib:start_http_server([{file,
+ filename:join(TcTopDir,
+ integer_to_list(?IP_PORT) ++ ".conf")}]),
+ Rest;
+
+ [X, $s, $s, $l, $_, $m, $o, $d, $_, $h, $t, $a, $c, $c, $e, $s, $s] ->
+ ?ENSURE_STARTED([crypto, public_key, ssl]),
+ SslTag =
+ case X of
+ $p -> ssl; % Plain
+ $e -> essl % Erlang based ssl
+ end,
+ case inets_test_lib:start_http_server_ssl(
+ filename:join(TcTopDir,
+ integer_to_list(?SSL_PORT) ++
+ "htaccess.conf"), SslTag) of
+ ok ->
+ "mod_htaccess";
+ Other ->
+ error_logger:info_msg("Other: ~p~n", [Other]),
+ {skip, "SSL does not seem to be supported"}
+ end;
+ [X, $s, $s, $l, $_ | Rest] ->
+ ?ENSURE_STARTED([crypto, public_key, ssl]),
+ SslTag =
+ case X of
+ $p -> ssl;
+ $e -> essl
+ end,
+ case inets_test_lib:start_http_server_ssl(
+ filename:join(TcTopDir,
+ integer_to_list(?SSL_PORT) ++
+ ".conf"), SslTag) of
+ ok ->
+ Rest;
+ Other ->
+ error_logger:info_msg("Other: ~p~n", [Other]),
+ {skip, "SSL does not seem to be supported"}
+ end;
+ "ipv6_" ++ _ = TestCaseStr ->
+ case inets_test_lib:has_ipv6_support() of
+ {ok, _} ->
+ inets_test_lib:start_http_server(
+ filename:join(TcTopDir,
+ TestCaseStr ++ ".conf"));
+
+ _ ->
+ {skip, "Host does not support IPv6"}
+ end
+ end,
+
+ InitRes =
+ case CaseRest of
+ {skip, _} = Skip ->
+ Skip;
+ "mod_auth_" ++ _ ->
+ start_mnesia(?config(node, Config)),
+ [{watchdog, Dog} | NewConfig];
+ "mod_htaccess" ->
+ ServerRoot = ?config(server_root, Config),
+ Path = filename:join([ServerRoot, "htdocs"]),
+ catch remove_htaccess(Path),
+ create_htaccess_data(Path, ?config(address, Config)),
+ [{watchdog, Dog} | NewConfig];
+ "range" ->
+ ServerRoot = ?config(server_root, Config),
+ Path = filename:join([ServerRoot, "htdocs"]),
+ create_range_data(Path),
+ [{watchdog, Dog} | NewConfig];
+ _ ->
+ [{watchdog, Dog} | NewConfig]
+ end,
+
+ tsp("init_per_testcase3(~w) -> done when"
+ "~n InitRes: ~p", [Case, InitRes]),
+
+ InitRes.
+
+
+%%--------------------------------------------------------------------
+%% Function: end_per_testcase(Case, Config) -> _
+%% Case - atom()
+%% Name of the test case that is about to be run.
+%% Config - [tuple()]
+%% A list of key/value pairs, holding the test case configuration.
+%% Description: Cleanup after each test case
+%%--------------------------------------------------------------------
+end_per_testcase(Case, Config) ->
+ Dog = ?config(watchdog, Config),
+ test_server:timetrap_cancel(Dog),
+ end_per_testcase2(Case, lists:keydelete(watchdog, 1, Config)),
+ ok.
+
+end_per_testcase2(Case, Config) ->
+ tsp("end_per_testcase2(~w) -> entry with"
+ "~n Config: ~p", [Case, Config]),
+ application:unset_env(inets, services),
+ application:stop(inets),
+ application:stop(ssl),
+ application:stop(crypto), % used by the new ssl (essl test cases)
+ cleanup_mnesia(),
+ tsp("end_per_testcase2(~w) -> done", [Case]),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+%% Test cases starts here.
+%%-------------------------------------------------------------------------
+
+%%-------------------------------------------------------------------------
+ip_mod_alias(doc) ->
+ ["Module test: mod_alias"];
+ip_mod_alias(suite) ->
+ [];
+ip_mod_alias(Config) when is_list(Config) ->
+ httpd_mod:alias(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_actions(doc) ->
+ ["Module test: mod_actions"];
+ip_mod_actions(suite) ->
+ [];
+ip_mod_actions(Config) when is_list(Config) ->
+ httpd_mod:actions(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_security(doc) ->
+ ["Module test: mod_security"];
+ip_mod_security(suite) ->
+ [];
+ip_mod_security(Config) when is_list(Config) ->
+ ServerRoot = ?config(server_root, Config),
+ httpd_mod:security(ServerRoot, ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_auth(doc) ->
+ ["Module test: mod_auth"];
+ip_mod_auth(suite) ->
+ [];
+ip_mod_auth(Config) when is_list(Config) ->
+ httpd_mod:auth(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_auth_api(doc) ->
+ ["Module test: mod_auth_api"];
+ip_mod_auth_api(suite) ->
+ [];
+ip_mod_auth_api(Config) when is_list(Config) ->
+ ServerRoot = ?config(server_root, Config),
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_mod:auth_api(ServerRoot, "", ip_comm, ?IP_PORT, Host, Node),
+ httpd_mod:auth_api(ServerRoot, "dets_", ip_comm, ?IP_PORT, Host, Node),
+ httpd_mod:auth_api(ServerRoot, "mnesia_", ip_comm, ?IP_PORT, Host, Node),
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_auth_mnesia_api(doc) ->
+ ["Module test: mod_auth_mnesia_api"];
+ip_mod_auth_mnesia_api(suite) ->
+ [];
+ip_mod_auth_mnesia_api(Config) when is_list(Config) ->
+ httpd_mod:auth_mnesia_api(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_htaccess(doc) ->
+ ["Module test: mod_htaccess"];
+ip_mod_htaccess(suite) ->
+ [];
+ip_mod_htaccess(Config) when is_list(Config) ->
+ httpd_mod:htaccess(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_cgi(doc) ->
+ ["Module test: mod_cgi"];
+ip_mod_cgi(suite) ->
+ [];
+ip_mod_cgi(Config) when is_list(Config) ->
+ httpd_mod:cgi(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_esi(doc) ->
+ ["Module test: mod_esi"];
+ip_mod_esi(suite) ->
+ [];
+ip_mod_esi(Config) when is_list(Config) ->
+ httpd_mod:esi(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_get(doc) ->
+ ["Module test: mod_get"];
+ip_mod_get(suite) ->
+ [];
+ip_mod_get(Config) when is_list(Config) ->
+ httpd_mod:get(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_mod_head(doc) ->
+ ["Module test: mod_head"];
+ip_mod_head(suite) ->
+ [];
+ip_mod_head(Config) when is_list(Config) ->
+ httpd_mod:head(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_all(doc) ->
+ ["All modules test"];
+ip_mod_all(suite) ->
+ [];
+ip_mod_all(Config) when is_list(Config) ->
+ httpd_mod:all(ip_comm, ?IP_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_load_light(doc) ->
+ ["Test light load"];
+ip_load_light(suite) ->
+ [];
+ip_load_light(Config) when is_list(Config) ->
+ httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ip_comm, light)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_load_medium(doc) ->
+ ["Test medium load"];
+ip_load_medium(suite) ->
+ [];
+ip_load_medium(Config) when is_list(Config) ->
+ httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ip_comm, medium)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_load_heavy(doc) ->
+ ["Test heavy load"];
+ip_load_heavy(suite) ->
+ [];
+ip_load_heavy(Config) when is_list(Config) ->
+ httpd_load:load_test(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ip_comm, heavy)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+ip_dos_hostname(doc) ->
+ ["Denial Of Service (DOS) attack test case"];
+ip_dos_hostname(suite) ->
+ [];
+ip_dos_hostname(Config) when is_list(Config) ->
+ dos_hostname(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config), ?MAX_HEADER_SIZE),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+ip_time_test(doc) ->
+ [""];
+ip_time_test(suite) ->
+ [];
+ip_time_test(Config) when is_list(Config) ->
+ %% <CONDITIONAL-SKIP>
+ Skippable = [win32],
+ Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_time_test:t(ip_comm, ?config(host, Config), ?IP_PORT),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_block_503(doc) ->
+ ["Check that you will receive status code 503 when the server"
+ " is blocked and 200 when its not blocked."];
+ip_block_503(suite) ->
+ [];
+ip_block_503(Config) when is_list(Config) ->
+ httpd_block:block_503(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_disturbing_idle(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "distribing does not really make a difference in this case."];
+ip_block_disturbing_idle(suite) ->
+ [];
+ip_block_disturbing_idle(Config) when is_list(Config) ->
+ httpd_block:block_disturbing_idle(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_non_disturbing_idle(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "non distribing does not really make a difference in this case."];
+ip_block_non_disturbing_idle(suite) ->
+ [];
+ip_block_non_disturbing_idle(Config) when is_list(Config) ->
+ httpd_block:block_non_disturbing_idle(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_disturbing_active(doc) ->
+ ["Check that you can block/unblock an active server. The strategy "
+ "distribing means ongoing requests should be terminated."];
+ip_block_disturbing_active(suite) ->
+ [];
+ip_block_disturbing_active(Config) when is_list(Config) ->
+ httpd_block:block_disturbing_active(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_non_disturbing_active(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "non distribing means the ongoing requests should be compleated."];
+ip_block_non_disturbing_active(suite) ->
+ [];
+ip_block_non_disturbing_active(Config) when is_list(Config) ->
+ httpd_block:block_non_disturbing_idle(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_block_disturbing_active_timeout_not_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "distribing means ongoing requests should be compleated"
+ "if the timeout does not occur."];
+ip_block_disturbing_active_timeout_not_released(suite) ->
+ [];
+ip_block_disturbing_active_timeout_not_released(Config)
+ when is_list(Config) ->
+ httpd_block:block_disturbing_active_timeout_not_released(ip_comm,
+ ?IP_PORT,
+ ?config(host,
+ Config),
+ ?config(node,
+ Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_disturbing_active_timeout_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "distribing means ongoing requests should be terminated when"
+ "the timeout occurs."];
+ip_block_disturbing_active_timeout_released(suite) ->
+ [];
+ip_block_disturbing_active_timeout_released(Config)
+ when is_list(Config) ->
+ httpd_block:block_disturbing_active_timeout_released(ip_comm,
+ ?IP_PORT,
+ ?config(host,
+ Config),
+ ?config(node,
+ Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_block_non_disturbing_active_timeout_not_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "non non distribing means ongoing requests should be completed."];
+ip_block_non_disturbing_active_timeout_not_released(suite) ->
+ [];
+ip_block_non_disturbing_active_timeout_not_released(Config)
+ when is_list(Config) ->
+ httpd_block:
+ block_non_disturbing_active_timeout_not_released(ip_comm,
+ ?IP_PORT,
+ ?config(host,
+ Config),
+ ?config(node,
+ Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_non_disturbing_active_timeout_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "non non distribing means ongoing requests should be completed. "
+ "When the timeout occurs the block operation sohould be canceled." ];
+ip_block_non_disturbing_active_timeout_released(suite) ->
+ [];
+ip_block_non_disturbing_active_timeout_released(Config)
+ when is_list(Config) ->
+ httpd_block:
+ block_non_disturbing_active_timeout_released(ip_comm,
+ ?IP_PORT,
+ ?config(host,
+ Config),
+ ?config(node,
+ Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_disturbing_blocker_dies(doc) ->
+ [];
+ip_block_disturbing_blocker_dies(suite) ->
+ [];
+ip_block_disturbing_blocker_dies(Config) when is_list(Config) ->
+ httpd_block:disturbing_blocker_dies(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_block_non_disturbing_blocker_dies(doc) ->
+ [];
+ip_block_non_disturbing_blocker_dies(suite) ->
+ [];
+ip_block_non_disturbing_blocker_dies(Config) when is_list(Config) ->
+ httpd_block:non_disturbing_blocker_dies(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_restart_no_block(doc) ->
+ [""];
+ip_restart_no_block(suite) ->
+ [];
+ip_restart_no_block(Config) when is_list(Config) ->
+ httpd_block:restart_no_block(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_restart_disturbing_block(doc) ->
+ [""];
+ip_restart_disturbing_block(suite) ->
+ [];
+ip_restart_disturbing_block(Config) when is_list(Config) ->
+ %% <CONDITIONAL-SKIP>
+ Condition =
+ fun() ->
+ case os:type() of
+ {unix, linux} ->
+ HW = string:strip(os:cmd("uname -m"), right, $\n),
+ case HW of
+ "ppc" ->
+ case inet:gethostname() of
+ {ok, "peach"} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end
+ end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_block:restart_disturbing_block(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_restart_non_disturbing_block(doc) ->
+ [""];
+ip_restart_non_disturbing_block(suite) ->
+ [];
+ip_restart_non_disturbing_block(Config) when is_list(Config) ->
+ %% <CONDITIONAL-SKIP>
+ Condition =
+ fun() ->
+ case os:type() of
+ {unix, linux} ->
+ HW = string:strip(os:cmd("uname -m"), right, $\n),
+ case HW of
+ "ppc" ->
+ case inet:gethostname() of
+ {ok, "peach"} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end
+ end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_block:restart_non_disturbing_block(ip_comm, ?IP_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+
+essl_mod_alias(doc) ->
+ ["Module test: mod_alias - using new of configure new SSL"];
+essl_mod_alias(suite) ->
+ [];
+essl_mod_alias(Config) when is_list(Config) ->
+ ssl_mod_alias(essl, Config).
+
+
+ssl_mod_alias(Tag, Config) ->
+ httpd_mod:alias(Tag, ?SSL_PORT,
+ ?config(host, Config), ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_actions(doc) ->
+ ["Module test: mod_actions - using new of configure new SSL"];
+essl_mod_actions(suite) ->
+ [];
+essl_mod_actions(Config) when is_list(Config) ->
+ ssl_mod_actions(essl, Config).
+
+
+ssl_mod_actions(Tag, Config) ->
+ httpd_mod:actions(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_security(doc) ->
+ ["Module test: mod_security - using new of configure new SSL"];
+essl_mod_security(suite) ->
+ [];
+essl_mod_security(Config) when is_list(Config) ->
+ ssl_mod_security(essl, Config).
+
+ssl_mod_security(Tag, Config) ->
+ ServerRoot = ?config(server_root, Config),
+ httpd_mod:security(ServerRoot,
+ Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_auth(doc) ->
+ ["Module test: mod_auth - using new of configure new SSL"];
+essl_mod_auth(suite) ->
+ [];
+essl_mod_auth(Config) when is_list(Config) ->
+ ssl_mod_auth(essl, Config).
+
+ssl_mod_auth(Tag, Config) ->
+ httpd_mod:auth(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_mod_auth_api(doc) ->
+ ["Module test: mod_auth - using new of configure new SSL"];
+essl_mod_auth_api(suite) ->
+ [];
+essl_mod_auth_api(Config) when is_list(Config) ->
+ ssl_mod_auth_api(essl, Config).
+
+ssl_mod_auth_api(Tag, Config) ->
+ ServerRoot = ?config(server_root, Config),
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_mod:auth_api(ServerRoot, "", Tag, ?SSL_PORT, Host, Node),
+ httpd_mod:auth_api(ServerRoot, "dets_", Tag, ?SSL_PORT, Host, Node),
+ httpd_mod:auth_api(ServerRoot, "mnesia_", Tag, ?SSL_PORT, Host, Node),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_mod_auth_mnesia_api(doc) ->
+ ["Module test: mod_auth_mnesia_api - using new of configure new SSL"];
+essl_mod_auth_mnesia_api(suite) ->
+ [];
+essl_mod_auth_mnesia_api(Config) when is_list(Config) ->
+ ssl_mod_auth_mnesia_api(essl, Config).
+
+ssl_mod_auth_mnesia_api(Tag, Config) ->
+ httpd_mod:auth_mnesia_api(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_htaccess(doc) ->
+ ["Module test: mod_htaccess - using new of configure new SSL"];
+essl_mod_htaccess(suite) ->
+ [];
+essl_mod_htaccess(Config) when is_list(Config) ->
+ ssl_mod_htaccess(essl, Config).
+
+ssl_mod_htaccess(Tag, Config) ->
+ httpd_mod:htaccess(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_cgi(doc) ->
+ ["Module test: mod_cgi - using new of configure new SSL"];
+essl_mod_cgi(suite) ->
+ [];
+essl_mod_cgi(Config) when is_list(Config) ->
+ ssl_mod_cgi(essl, Config).
+
+ssl_mod_cgi(Tag, Config) ->
+ httpd_mod:cgi(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_esi(doc) ->
+ ["Module test: mod_esi - using new of configure new SSL"];
+essl_mod_esi(suite) ->
+ [];
+essl_mod_esi(Config) when is_list(Config) ->
+ ssl_mod_esi(essl, Config).
+
+ssl_mod_esi(Tag, Config) ->
+ httpd_mod:esi(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_get(doc) ->
+ ["Module test: mod_get - using new of configure new SSL"];
+essl_mod_get(suite) ->
+ [];
+essl_mod_get(Config) when is_list(Config) ->
+ ssl_mod_get(essl, Config).
+
+ssl_mod_get(Tag, Config) ->
+ httpd_mod:get(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_head(doc) ->
+ ["Module test: mod_head - using new of configure new SSL"];
+essl_mod_head(suite) ->
+ [];
+essl_mod_head(Config) when is_list(Config) ->
+ ssl_mod_head(essl, Config).
+
+ssl_mod_head(Tag, Config) ->
+ httpd_mod:head(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_mod_all(doc) ->
+ ["All modules test - using new of configure new SSL"];
+essl_mod_all(suite) ->
+ [];
+essl_mod_all(Config) when is_list(Config) ->
+ ssl_mod_all(essl, Config).
+
+ssl_mod_all(Tag, Config) ->
+ httpd_mod:all(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_load_light(doc) ->
+ ["Test light load - using new of configure new SSL"];
+essl_load_light(suite) ->
+ [];
+essl_load_light(Config) when is_list(Config) ->
+ ssl_load_light(essl, Config).
+
+ssl_load_light(Tag, Config) ->
+ httpd_load:load_test(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ssl, light)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_load_medium(doc) ->
+ ["Test medium load - using new of configure new SSL"];
+essl_load_medium(suite) ->
+ [];
+essl_load_medium(Config) when is_list(Config) ->
+ ssl_load_medium(essl, Config).
+
+ssl_load_medium(Tag, Config) ->
+ %% <CONDITIONAL-SKIP>
+ Skippable = [win32],
+ Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_load:load_test(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ssl, medium)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_load_heavy(doc) ->
+ ["Test heavy load - using new of configure new SSL"];
+essl_load_heavy(suite) ->
+ [];
+essl_load_heavy(Config) when is_list(Config) ->
+ ssl_load_heavy(essl, Config).
+
+ssl_load_heavy(Tag, Config) ->
+ %% <CONDITIONAL-SKIP>
+ Skippable = [win32],
+ Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_load:load_test(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config),
+ get_nof_clients(ssl, heavy)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_dos_hostname(doc) ->
+ ["Denial Of Service (DOS) attack test case - using new of configure new SSL"];
+essl_dos_hostname(suite) ->
+ [];
+essl_dos_hostname(Config) when is_list(Config) ->
+ ssl_dos_hostname(essl, Config).
+
+ssl_dos_hostname(Tag, Config) ->
+ dos_hostname(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config),
+ ?MAX_HEADER_SIZE),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_time_test(doc) ->
+ ["using new of configure new SSL"];
+essl_time_test(suite) ->
+ [];
+essl_time_test(Config) when is_list(Config) ->
+ ssl_time_test(essl, Config).
+
+ssl_time_test(Tag, Config) when is_list(Config) ->
+ %% <CONDITIONAL-SKIP>
+ FreeBSDVersionVerify =
+ fun() ->
+ case os:version() of
+ {7, 1, _} -> % We only have one such machine, so...
+ true;
+ _ ->
+ false
+ end
+ end,
+ Skippable = [win32, {unix, [{freebsd, FreeBSDVersionVerify}]}],
+ Condition = fun() -> ?OS_BASED_SKIP(Skippable) end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_time_test:t(Tag,
+ ?config(host, Config),
+ ?SSL_PORT),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_block_503(doc) ->
+ ["Check that you will receive status code 503 when the server"
+ " is blocked and 200 when its not blocked - using new of configure new SSL."];
+essl_block_503(suite) ->
+ [];
+essl_block_503(Config) when is_list(Config) ->
+ ssl_block_503(essl, Config).
+
+ssl_block_503(Tag, Config) ->
+ httpd_block:block_503(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_disturbing_idle(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "distribing does not really make a difference in this case."
+ "Using new of configure new SSL"];
+essl_block_disturbing_idle(suite) ->
+ [];
+essl_block_disturbing_idle(Config) when is_list(Config) ->
+ ssl_block_disturbing_idle(essl, Config).
+
+ssl_block_disturbing_idle(Tag, Config) ->
+ httpd_block:block_disturbing_idle(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_non_disturbing_idle(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "non distribing does not really make a difference in this case."
+ "Using new of configure new SSL"];
+essl_block_non_disturbing_idle(suite) ->
+ [];
+essl_block_non_disturbing_idle(Config) when is_list(Config) ->
+ ssl_block_non_disturbing_idle(essl, Config).
+
+ssl_block_non_disturbing_idle(Tag, Config) ->
+ httpd_block:block_non_disturbing_idle(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_disturbing_active(doc) ->
+ ["Check that you can block/unblock an active server. The strategy "
+ "distribing means ongoing requests should be terminated."
+ "Using new of configure new SSL"];
+essl_block_disturbing_active(suite) ->
+ [];
+essl_block_disturbing_active(Config) when is_list(Config) ->
+ ssl_block_disturbing_active(essl, Config).
+
+ssl_block_disturbing_active(Tag, Config) ->
+ httpd_block:block_disturbing_active(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_non_disturbing_active(doc) ->
+ ["Check that you can block/unblock an idle server. The strategy "
+ "non distribing means the ongoing requests should be compleated."
+ "Using new of configure new SSL"];
+essl_block_non_disturbing_active(suite) ->
+ [];
+essl_block_non_disturbing_active(Config) when is_list(Config) ->
+ ssl_block_non_disturbing_active(essl, Config).
+
+ssl_block_non_disturbing_active(Tag, Config) ->
+ httpd_block:block_non_disturbing_idle(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_disturbing_active_timeout_not_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "distribing means ongoing requests should be compleated"
+ "if the timeout does not occur."
+ "Using new of configure new SSL"];
+essl_block_disturbing_active_timeout_not_released(suite) ->
+ [];
+essl_block_disturbing_active_timeout_not_released(Config)
+ when is_list(Config) ->
+ ssl_block_disturbing_active_timeout_not_released(essl, Config).
+
+ssl_block_disturbing_active_timeout_not_released(Tag, Config) ->
+ Port = ?SSL_PORT,
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_block:block_disturbing_active_timeout_not_released(Tag,
+ Port, Host, Node),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_disturbing_active_timeout_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "distribing means ongoing requests should be terminated when"
+ "the timeout occurs."
+ "Using new of configure new SSL"];
+essl_block_disturbing_active_timeout_released(suite) ->
+ [];
+essl_block_disturbing_active_timeout_released(Config)
+ when is_list(Config) ->
+ ssl_block_disturbing_active_timeout_released(essl, Config).
+
+ssl_block_disturbing_active_timeout_released(Tag, Config) ->
+ Port = ?SSL_PORT,
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_block:block_disturbing_active_timeout_released(Tag,
+ Port,
+ Host,
+ Node),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_non_disturbing_active_timeout_not_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "non non distribing means ongoing requests should be completed."
+ "Using new of configure new SSL"];
+essl_block_non_disturbing_active_timeout_not_released(suite) ->
+ [];
+essl_block_non_disturbing_active_timeout_not_released(Config)
+ when is_list(Config) ->
+ ssl_block_non_disturbing_active_timeout_not_released(essl, Config).
+
+ssl_block_non_disturbing_active_timeout_not_released(Tag, Config) ->
+ Port = ?SSL_PORT,
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_block:block_non_disturbing_active_timeout_not_released(Tag,
+ Port,
+ Host,
+ Node),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_block_non_disturbing_active_timeout_released(doc) ->
+ ["Check that you can block an active server. The strategy "
+ "non distribing means ongoing requests should be completed. "
+ "When the timeout occurs the block operation sohould be canceled."
+ "Using new of configure new SSL"];
+essl_block_non_disturbing_active_timeout_released(suite) ->
+ [];
+essl_block_non_disturbing_active_timeout_released(Config)
+ when is_list(Config) ->
+ ssl_block_non_disturbing_active_timeout_released(essl, Config).
+
+ssl_block_non_disturbing_active_timeout_released(Tag, Config)
+ when is_list(Config) ->
+ Port = ?SSL_PORT,
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ httpd_block:block_non_disturbing_active_timeout_released(Tag,
+ Port,
+ Host,
+ Node),
+
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_block_disturbing_blocker_dies(doc) ->
+ ["using new of configure new SSL"];
+essl_block_disturbing_blocker_dies(suite) ->
+ [];
+essl_block_disturbing_blocker_dies(Config) when is_list(Config) ->
+ ssl_block_disturbing_blocker_dies(essl, Config).
+
+ssl_block_disturbing_blocker_dies(Tag, Config) ->
+ httpd_block:disturbing_blocker_dies(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+essl_block_non_disturbing_blocker_dies(doc) ->
+ ["using new of configure new SSL"];
+essl_block_non_disturbing_blocker_dies(suite) ->
+ [];
+essl_block_non_disturbing_blocker_dies(Config) when is_list(Config) ->
+ ssl_block_non_disturbing_blocker_dies(essl, Config).
+
+ssl_block_non_disturbing_blocker_dies(Tag, Config) ->
+ httpd_block:non_disturbing_blocker_dies(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_restart_no_block(doc) ->
+ ["using new of configure new SSL"];
+essl_restart_no_block(suite) ->
+ [];
+essl_restart_no_block(Config) when is_list(Config) ->
+ ssl_restart_no_block(essl, Config).
+
+ssl_restart_no_block(Tag, Config) ->
+ httpd_block:restart_no_block(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_restart_disturbing_block(doc) ->
+ ["using new of configure new SSL"];
+essl_restart_disturbing_block(suite) ->
+ [];
+essl_restart_disturbing_block(Config) when is_list(Config) ->
+ ssl_restart_disturbing_block(essl, Config).
+
+ssl_restart_disturbing_block(Tag, Config) ->
+ %% <CONDITIONAL-SKIP>
+ Condition =
+ fun() ->
+ case os:type() of
+ {unix, linux} ->
+ case ?OSCMD("uname -m") of
+ "ppc" ->
+ case file:read_file_info("/etc/fedora-release") of
+ {ok, _} ->
+ case ?OSCMD("awk '{print $2}' /etc/fedora-release") of
+ "release" ->
+ %% Fedora 7 and later
+ case ?OSCMD("awk '{print $3}' /etc/fedora-release") of
+ "7" ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end
+ end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_block:restart_disturbing_block(Tag, ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+
+
+essl_restart_non_disturbing_block(doc) ->
+ ["using new of configure new SSL"];
+essl_restart_non_disturbing_block(suite) ->
+ [];
+essl_restart_non_disturbing_block(Config) when is_list(Config) ->
+ ssl_restart_non_disturbing_block(essl, Config).
+
+ssl_restart_non_disturbing_block(Tag, Config) ->
+ %% <CONDITIONAL-SKIP>
+ Condition =
+ fun() ->
+ case os:type() of
+ {unix, linux} ->
+ HW = string:strip(os:cmd("uname -m"), right, $\n),
+ case HW of
+ "ppc" ->
+ case inet:gethostname() of
+ {ok, "peach"} ->
+ true;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end;
+ _ ->
+ false
+ end
+ end,
+ ?NON_PC_TC_MAYBE_SKIP(Config, Condition),
+ %% </CONDITIONAL-SKIP>
+
+ httpd_block:restart_non_disturbing_block(Tag,
+ ?SSL_PORT,
+ ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+
+%%-------------------------------------------------------------------------
+ip_host(doc) ->
+ ["Control that the server accepts/rejects requests with/ without host"];
+ip_host(suite)->
+ [];
+ip_host(Config) when is_list(Config) ->
+ httpd_1_1:host(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_chunked(doc) ->
+ ["Control that the server accepts chunked requests"];
+ip_chunked(suite) ->
+ [];
+ip_chunked(Config) when is_list(Config) ->
+ httpd_1_1:chunked(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_expect(doc) ->
+ ["Control that the server handles request with the expect header "
+ "field appropiate"];
+ip_expect(suite)->
+ [];
+ip_expect(Config) when is_list(Config) ->
+ httpd_1_1:expect(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_range(doc) ->
+ ["Control that the server can handle range requests to plain files"];
+ip_range(suite)->
+ [];
+ip_range(Config) when is_list(Config) ->
+ httpd_1_1:range(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_if_test(doc) ->
+ ["Test that the if - request header fields is handled correclty"];
+ip_if_test(suite) ->
+ [];
+ip_if_test(Config) when is_list(Config) ->
+ ServerRoot = ?config(server_root, Config),
+ DocRoot = filename:join([ServerRoot, "htdocs"]),
+ httpd_1_1:if_test(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config), DocRoot),
+ ok.
+%%-------------------------------------------------------------------------
+ip_http_trace(doc) ->
+ ["Test the trace module "];
+ip_http_trace(suite) ->
+ [];
+ip_http_trace(Config) when is_list(Config) ->
+ httpd_1_1:http_trace(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+%%-------------------------------------------------------------------------
+ip_http1_1_head(doc) ->
+ ["Test the trace module "];
+ip_http1_1_head(suite)->
+ [];
+ip_http1_1_head(Config) when is_list(Config) ->
+ httpd_1_1:head(ip_comm, ?IP_PORT, ?config(host, Config),
+ ?config(node, Config)),
+ ok.
+
+%%-------------------------------------------------------------------------
+ip_get_0_9(doc) ->
+ ["Test simple HTTP/0.9 GET"];
+ip_get_0_9(suite)->
+ [];
+ip_get_0_9(Config) when is_list(Config) ->
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "GET / \r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/0.9"} ]),
+ %% Without space after uri
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "GET /\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/0.9"} ]),
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "GET / HTTP/0.9\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/0.9"}]),
+
+ ok.
+%%-------------------------------------------------------------------------
+ip_head_1_0(doc) ->
+ ["Test HTTP/1.0 HEAD"];
+ip_head_1_0(suite)->
+ [];
+ip_head_1_0(Config) when is_list(Config) ->
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "HEAD / HTTP/1.0\r\n\r\n", [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok.
+%%-------------------------------------------------------------------------
+ip_get_1_0(doc) ->
+ ["Test HTTP/1.0 GET"];
+ip_get_1_0(suite)->
+ [];
+ip_get_1_0(Config) when is_list(Config) ->
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "GET / HTTP/1.0\r\n\r\n", [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+
+ ok.
+%%-------------------------------------------------------------------------
+ip_post_1_0(doc) ->
+ ["Test HTTP/1.0 POST"];
+ip_post_1_0(suite)->
+ [];
+ip_post_1_0(Config) when is_list(Config) ->
+ Host = ?config(host, Config),
+ Node = ?config(node, Config),
+ %% Test the post message formatin 1.0! Real post are testes elsewhere
+ ok = httpd_test_lib:verify_request(ip_comm, Host, ?IP_PORT, Node,
+ "POST / HTTP/1.0\r\n\r\n "
+ "Content-Length:6 \r\n\r\nfoobar",
+ [{statuscode, 500}, {version, "HTTP/1.0"}]),
+
+ ok.
+%%-------------------------------------------------------------------------
+ip_mod_cgi_chunked_encoding_test(doc) ->
+ ["Test the trace module "];
+ip_mod_cgi_chunked_encoding_test(suite)->
+ [];
+ip_mod_cgi_chunked_encoding_test(Config) when is_list(Config) ->
+ Host = ?config(host, Config),
+ Script =
+ case test_server:os_type() of
+ {win32, _} ->
+ "/cgi-bin/printenv.bat";
+ _ ->
+ "/cgi-bin/printenv.sh"
+ end,
+ Requests =
+ ["GET " ++ Script ++ " HTTP/1.1\r\nHost:"++ Host ++"\r\n\r\n",
+ "GET /cgi-bin/erl/httpd_example/newformat HTTP/1.1\r\nHost:"
+ ++ Host ++"\r\n\r\n"],
+ httpd_1_1:mod_cgi_chunked_encoding_test(ip_comm, ?IP_PORT,
+ Host,
+ ?config(node, Config),
+ Requests),
+ ok.
+
+%-------------------------------------------------------------------------
+
+ipv6_hostname_ipcomm() ->
+ [{require, ipv6_hosts}].
+ipv6_hostname_ipcomm(X) ->
+ SocketType = ip_comm,
+ Port = ?IP_PORT,
+ ipv6_hostname(SocketType, Port, X).
+
+ipv6_hostname_essl() ->
+ [{require, ipv6_hosts}].
+ipv6_hostname_essl(X) ->
+ SocketType = essl,
+ Port = ?SSL_PORT,
+ ipv6_hostname(SocketType, Port, X).
+
+ipv6_hostname(_SocketType, _Port, doc) ->
+ ["Test standard ipv6 address"];
+ipv6_hostname(_SocketType, _Port, suite)->
+ [];
+ipv6_hostname(SocketType, Port, Config) when is_list(Config) ->
+ tsp("ipv6_hostname -> entry with"
+ "~n SocketType: ~p"
+ "~n Port: ~p"
+ "~n Config: ~p", [SocketType, Port, Config]),
+ Host = ?config(host, Config),
+ URI = "GET HTTP://" ++
+ Host ++ ":" ++ integer_to_list(Port) ++ "/ HTTP/1.1\r\n\r\n",
+ tsp("ipv6_hostname -> Host: ~p", [Host]),
+ httpd_test_lib:verify_request(SocketType, Host, Port, [inet6],
+ node(),
+ URI,
+ [{statuscode, 200}, {version, "HTTP/1.1"}]),
+ ok.
+
+%%-------------------------------------------------------------------------
+
+ipv6_address_ipcomm() ->
+ [{require, ipv6_hosts}].
+ipv6_address_ipcomm(X) ->
+ SocketType = ip_comm,
+ Port = ?IP_PORT,
+ ipv6_address(SocketType, Port, X).
+
+ipv6_address_essl() ->
+ [{require, ipv6_hosts}].
+ipv6_address_essl(X) ->
+ SocketType = essl,
+ Port = ?SSL_PORT,
+ ipv6_address(SocketType, Port, X).
+
+ipv6_address(_SocketType, _Port, doc) ->
+ ["Test standard ipv6 address"];
+ipv6_address(_SocketType, _Port, suite)->
+ [];
+ipv6_address(SocketType, Port, Config) when is_list(Config) ->
+ tsp("ipv6_address -> entry with"
+ "~n SocketType: ~p"
+ "~n Port: ~p"
+ "~n Config: ~p", [SocketType, Port, Config]),
+ Host = ?config(host, Config),
+ tsp("ipv6_address -> Host: ~p", [Host]),
+ URI = "GET HTTP://" ++
+ Host ++ ":" ++ integer_to_list(Port) ++ "/ HTTP/1.1\r\n\r\n",
+ httpd_test_lib:verify_request(SocketType, Host, Port, [inet6],
+ node(),
+ URI,
+ [{statuscode, 200}, {version, "HTTP/1.1"}]),
+ ok.
+
+
+%%--------------------------------------------------------------------
+ticket_5775(doc) ->
+ ["Tests that content-length is correct"];
+ticket_5775(suite) ->
+ [];
+ticket_5775(Config) ->
+ ok=httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
+ ?IP_PORT, ?config(node, Config),
+ "GET /cgi-bin/erl/httpd_example:get_bin "
+ "HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+ ok.
+ticket_5865(doc) ->
+ ["Tests that a header without last-modified is handled"];
+ticket_5865(suite) ->
+ [];
+ticket_5865(Config) ->
+ ?SKIP(as_of_r15_behaviour_of_calendar_has_changed),
+ Host = ?config(host,Config),
+ ServerRoot = ?config(server_root, Config),
+ DocRoot = filename:join([ServerRoot, "htdocs"]),
+ File = filename:join([DocRoot,"last_modified.html"]),
+
+ Bad_mtime = case test_server:os_type() of
+ {win32, _} ->
+ {{1600,12,31},{23,59,59}};
+ {unix, _} ->
+ {{1969,12,31},{23,59,59}}
+ end,
+
+ {ok,FI}=file:read_file_info(File),
+
+ case file:write_file_info(File,FI#file_info{mtime=Bad_mtime}) of
+ ok ->
+ ok = httpd_test_lib:verify_request(ip_comm, Host,
+ ?IP_PORT, ?config(node, Config),
+ "GET /last_modified.html"
+ " HTTP/1.1\r\nHost:"
+ ++Host++"\r\n\r\n",
+ [{statuscode, 200},
+ {no_header,
+ "last-modified"}]),
+ ok;
+ {error, Reason} ->
+ Fault =
+ io_lib:format("Attempt to change the file info to set the"
+ " preconditions of the test case failed ~p~n",
+ [Reason]),
+ {skip, Fault}
+ end.
+
+ticket_5913(doc) ->
+ ["Tests that a header without last-modified is handled"];
+ticket_5913(suite) -> [];
+ticket_5913(Config) ->
+ ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
+ ?IP_PORT, ?config(node, Config),
+ "GET /cgi-bin/erl/httpd_example:get_bin "
+ "HTTP/1.0\r\n\r\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+ ok.
+
+ticket_6003(doc) ->
+ ["Tests that a URI with a bad hexadecimal code is handled"];
+ticket_6003(suite) -> [];
+ticket_6003(Config) ->
+ ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
+ ?IP_PORT, ?config(node, Config),
+ "GET http://www.erlang.org/%skalle "
+ "HTTP/1.0\r\n\r\n",
+ [{statuscode, 400},
+ {version, "HTTP/1.0"}]),
+ ok.
+
+ticket_7304(doc) ->
+ ["Tests missing CR in delimiter"];
+ticket_7304(suite) ->
+ [];
+ticket_7304(Config) ->
+ ok = httpd_test_lib:verify_request(ip_comm, ?config(host, Config),
+ ?IP_PORT, ?config(node, Config),
+ "GET / HTTP/1.0\r\n\n",
+ [{statuscode, 200},
+ {version, "HTTP/1.0"}]),
+ ok.
+
+%%--------------------------------------------------------------------
+%% Internal functions
+%%--------------------------------------------------------------------
+dos_hostname(Type, Port, Host, Node, Max) ->
+ H1 = {"", 200},
+ H2 = {"dummy-host.ericsson.se", 200},
+ TooLongHeader = lists:append(lists:duplicate(Max + 1, "a")),
+ H3 = {TooLongHeader, 403},
+ Hosts = [H1,H2,H3],
+ dos_hostname_poll(Type, Host, Port, Node, Hosts).
+
+%% make_ipv6(T) when is_tuple(T) andalso (size(T) =:= 8) ->
+%% make_ipv6(tuple_to_list(T));
+
+%% make_ipv6([_, _, _, _, _, _, _, _] = IPV6) ->
+%% lists:flatten(io_lib:format("~s:~s:~s:~s:~s:~s:~s:~s", IPV6)).
+
+
+%%--------------------------------------------------------------------
+%% Other help functions
+create_config(Config, Access, FileName) ->
+ ServerRoot = ?config(server_root, Config),
+ TcTopDir = ?config(tc_top_dir, Config),
+ Port = ?config(port, Config),
+ Type = ?config(sock_type, Config),
+ Host = ?config(host, Config),
+ Mods = io_lib:format("~p", [httpd_mod]),
+ Funcs = io_lib:format("~p", [ssl_password_cb]),
+ MaxHdrSz = io_lib:format("~p", [256]),
+ MaxHdrAct = io_lib:format("~p", [close]),
+
+ io:format(user,
+ "create_config -> "
+ "~n ServerRoot: ~p"
+ "~n TcTopDir: ~p"
+ "~n Type: ~p"
+ "~n Port: ~p"
+ "~n Host: ~p"
+ "~n", [ServerRoot, TcTopDir, Type, Port, Host]),
+
+ SSL =
+ if
+ (Type =:= ssl) orelse
+ (Type =:= essl) ->
+ [cline(["SSLCertificateFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLCertificateKeyFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLCACertificateFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLPasswordCallbackModule ", Mods]),
+ cline(["SSLPasswordCallbackFunction ", Funcs]),
+ cline(["SSLVerifyClient 0"]),
+ cline(["SSLVerifyDepth 1"])];
+ true ->
+ []
+ end,
+ ModOrder =
+ case Access of
+ mod_htaccess ->
+ "Modules mod_alias mod_htaccess mod_auth "
+ "mod_security "
+ "mod_responsecontrol mod_trace mod_esi "
+ "mod_actions mod_cgi mod_include mod_dir "
+ "mod_range mod_get "
+ "mod_head mod_log mod_disk_log";
+ _ ->
+ "Modules mod_alias mod_auth mod_security "
+ "mod_responsecontrol mod_trace mod_esi "
+ "mod_actions mod_cgi mod_include mod_dir "
+ "mod_range mod_get "
+ "mod_head mod_log mod_disk_log"
+ end,
+
+ %% The test suite currently does not handle an explicit BindAddress.
+ %% They assume any has been used, that is Addr is always set to undefined!
+
+ %% {ok, Hostname} = inet:gethostname(),
+ %% {ok, Addr} = inet:getaddr(Hostname, inet6),
+ %% AddrStr = make_ipv6(Addr),
+ %% BindAddress = lists:flatten(io_lib:format("~s|inet6", [AddrStr])),
+
+ BindAddress = "*|inet",
+ %% BindAddress = "*",
+
+ HttpConfig = [
+ cline(["Port ", integer_to_list(Port)]),
+ cline(["ServerName ", Host]),
+ cline(["SocketType ", atom_to_list(Type)]),
+ cline([ModOrder]),
+ %% cline(["LogFormat ", "erlang"]),
+ cline(["ServerAdmin [email protected]"]),
+ cline(["BindAddress ", BindAddress]),
+ cline(["ServerRoot ", ServerRoot]),
+ cline(["ErrorLog ", TcTopDir,
+ "/logs/error_log_", integer_to_list(Port)]),
+ cline(["TransferLog ", TcTopDir,
+ "/logs/access_log_", integer_to_list(Port)]),
+ cline(["SecurityLog ", TcTopDir,
+ "/logs/security_log_", integer_to_list(Port)]),
+ cline(["ErrorDiskLog ", TcTopDir,
+ "/logs/error_disk_log_", integer_to_list(Port)]),
+ cline(["ErrorDiskLogSize ", "190000 ", "11"]),
+ cline(["TransferDiskLog ", TcTopDir,
+ "/logs/access_disk_log_", integer_to_list(Port)]),
+ cline(["TransferDiskLogSize ", "200000 ", "10"]),
+ cline(["SecurityDiskLog ", TcTopDir,
+ "/logs/security_disk_log_", integer_to_list(Port)]),
+ cline(["SecurityDiskLogSize ", "210000 ", "9"]),
+ cline(["MaxClients 10"]),
+ cline(["MaxHeaderSize ", MaxHdrSz]),
+ cline(["MaxHeaderAction ", MaxHdrAct]),
+ cline(["DocumentRoot ",
+ filename:join(ServerRoot, "htdocs")]),
+ cline(["DirectoryIndex ", "index.html ", "welcome.html"]),
+ cline(["DefaultType ", "text/plain"]),
+ SSL,
+ mod_alias_config(ServerRoot),
+
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "open"]),
+ "Open Area",
+ filename:join(ServerRoot, "auth/passwd"),
+ filename:join(ServerRoot, "auth/group"),
+ plain,
+ "user one Aladdin",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "secret"]),
+ "Secret Area",
+ filename:join(ServerRoot, "auth/passwd"),
+ filename:join(ServerRoot, "auth/group"),
+ plain,
+ "group group1 group2",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "secret",
+ "top_secret"]),
+ "Top Secret Area",
+ filename:join(ServerRoot, "auth/passwd"),
+ filename:join(ServerRoot, "auth/group"),
+ plain,
+ "group group3",
+ filename:join(ServerRoot, "security_data")),
+
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "dets_open"]),
+ "Dets Open Area",
+ filename:join(ServerRoot, "passwd"),
+ filename:join(ServerRoot, "group"),
+ dets,
+ "user one Aladdin",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "dets_secret"]),
+ "Dets Secret Area",
+ filename:join(ServerRoot, "passwd"),
+ filename:join(ServerRoot, "group"),
+ dets,
+ "group group1 group2",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "dets_secret",
+ "top_secret"]),
+ "Dets Top Secret Area",
+ filename:join(ServerRoot, "passwd"),
+ filename:join(ServerRoot, "group"),
+ dets,
+ "group group3",
+ filename:join(ServerRoot, "security_data")),
+
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "mnesia_open"]),
+ "Mnesia Open Area",
+ false,
+ false,
+ mnesia,
+ "user one Aladdin",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join([ServerRoot,"htdocs",
+ "mnesia_secret"]),
+ "Mnesia Secret Area",
+ false,
+ false,
+ mnesia,
+ "group group1 group2",
+ filename:join(ServerRoot, "security_data")),
+ config_directory(filename:join(
+ [ServerRoot, "htdocs", "mnesia_secret",
+ "top_secret"]),
+ "Mnesia Top Secret Area",
+ false,
+ false,
+ mnesia,
+ "group group3",
+ filename:join(ServerRoot, "security_data"))
+ ],
+ ConfigFile = filename:join([TcTopDir, FileName]),
+ {ok, Fd} = file:open(ConfigFile, [write]),
+ ok = file:write(Fd, lists:flatten(HttpConfig)),
+ ok = file:close(Fd).
+
+config_directory(Dir, AuthName, AuthUserFile, AuthGroupFile, AuthDBType,
+ Require, SF) ->
+ file:delete(SF),
+ [
+ cline(["<Directory ", Dir, ">"]),
+ cline(["SecurityDataFile ", SF]),
+ cline(["SecurityMaxRetries 3"]),
+ cline(["SecurityFailExpireTime ", integer_to_list(?FAIL_EXPIRE_TIME)]),
+ cline(["SecurityBlockTime 1"]),
+ cline(["SecurityAuthTimeout ", integer_to_list(?AUTH_TIMEOUT)]),
+ cline(["SecurityCallbackModule ", "httpd_mod"]),
+ cline_if_set("AuthUserFile", AuthUserFile),
+ cline_if_set("AuthGroupFile", AuthGroupFile),
+ cline_if_set("AuthName", AuthName),
+ cline_if_set("AuthDBType", AuthDBType),
+ cline(["require ", Require]),
+ cline(["</Directory>\r\n"])
+ ].
+
+mod_alias_config(Root) ->
+ [
+ cline(["Alias /icons/ ", filename:join(Root,"icons"), "/"]),
+ cline(["Alias /pics/ ", filename:join(Root, "icons"), "/"]),
+ cline(["ScriptAlias /cgi-bin/ ", filename:join(Root, "cgi-bin"), "/"]),
+ cline(["ScriptAlias /htbin/ ", filename:join(Root, "cgi-bin"), "/"]),
+ cline(["ErlScriptAlias /cgi-bin/erl httpd_example io"]),
+ cline(["EvalScriptAlias /eval httpd_example io"])
+ ].
+
+cline(List) ->
+ lists:flatten([List, "\r\n"]).
+
+cline_if_set(_, false) ->
+ [];
+cline_if_set(Name, Var) when is_list(Var) ->
+ cline([Name, " ", Var]);
+cline_if_set(Name, Var) when is_atom(Var) ->
+ cline([Name, " ", atom_to_list(Var)]).
+
+getaddr() ->
+ {ok,HostName} = inet:gethostname(),
+ {ok,{A1,A2,A3,A4}} = inet:getaddr(HostName,inet),
+ lists:flatten(io_lib:format("~p.~p.~p.~p",[A1,A2,A3,A4])).
+
+start_mnesia(Node) ->
+ case rpc:call(Node, ?MODULE, cleanup_mnesia, []) of
+ ok ->
+ ok;
+ Other ->
+ tsf({failed_to_cleanup_mnesia, Other})
+ end,
+ case rpc:call(Node, ?MODULE, setup_mnesia, []) of
+ {atomic, ok} ->
+ ok;
+ Other2 ->
+ tsf({failed_to_setup_mnesia, Other2})
+ end,
+ ok.
+
+setup_mnesia() ->
+ setup_mnesia([node()]).
+
+setup_mnesia(Nodes) ->
+ ok = mnesia:create_schema(Nodes),
+ ok = mnesia:start(),
+ {atomic, ok} = mnesia:create_table(httpd_user,
+ [{attributes,
+ record_info(fields, httpd_user)},
+ {disc_copies,Nodes}, {type, set}]),
+ {atomic, ok} = mnesia:create_table(httpd_group,
+ [{attributes,
+ record_info(fields,
+ httpd_group)},
+ {disc_copies,Nodes}, {type,bag}]).
+
+cleanup_mnesia() ->
+ mnesia:start(),
+ mnesia:delete_table(httpd_user),
+ mnesia:delete_table(httpd_group),
+ stopped = mnesia:stop(),
+ mnesia:delete_schema([node()]),
+ ok.
+
+create_htaccess_data(Path, IpAddress)->
+ create_htaccess_dirs(Path),
+
+ create_html_file(filename:join([Path,"ht/open/dummy.html"])),
+ create_html_file(filename:join([Path,"ht/blocknet/dummy.html"])),
+ create_html_file(filename:join([Path,"ht/secret/dummy.html"])),
+ create_html_file(filename:join([Path,"ht/secret/top_secret/dummy.html"])),
+
+ create_htaccess_file(filename:join([Path,"ht/open/.htaccess"]),
+ Path, "user one Aladdin"),
+ create_htaccess_file(filename:join([Path,"ht/secret/.htaccess"]),
+ Path, "group group1 group2"),
+ create_htaccess_file(filename:join([Path,
+ "ht/secret/top_secret/.htaccess"]),
+ Path, "user four"),
+ create_htaccess_file(filename:join([Path,"ht/blocknet/.htaccess"]),
+ Path, nouser, IpAddress),
+
+ create_user_group_file(filename:join([Path,"ht","users.file"]),
+ "one:OnePassword\ntwo:TwoPassword\nthree:"
+ "ThreePassword\nfour:FourPassword\nAladdin:"
+ "AladdinPassword"),
+ create_user_group_file(filename:join([Path,"ht","groups.file"]),
+ "group1: two one\ngroup2: two three").
+
+create_html_file(PathAndFileName)->
+ file:write_file(PathAndFileName,list_to_binary(
+ "<html><head><title>test</title></head>
+ <body>testar</body></html>")).
+
+create_htaccess_file(PathAndFileName, BaseDir, RequireData)->
+ file:write_file(PathAndFileName,
+ list_to_binary(
+ "AuthUserFile "++ BaseDir ++
+ "/ht/users.file\nAuthGroupFile "++ BaseDir
+ ++ "/ht/groups.file\nAuthName Test\nAuthType"
+ " Basic\n<Limit>\nrequire " ++ RequireData ++
+ "\n</Limit>")).
+
+create_htaccess_file(PathAndFileName, BaseDir, nouser, IpAddress)->
+ file:write_file(PathAndFileName,list_to_binary(
+ "AuthUserFile "++ BaseDir ++
+ "/ht/users.file\nAuthGroupFile " ++
+ BaseDir ++ "/ht/groups.file\nAuthName"
+ " Test\nAuthType"
+ " Basic\n<Limit GET>\n\tallow from " ++
+ format_ip(IpAddress,
+ string:rchr(IpAddress,$.)) ++
+ "\n</Limit>")).
+
+create_user_group_file(PathAndFileName, Data)->
+ file:write_file(PathAndFileName, list_to_binary(Data)).
+
+create_htaccess_dirs(Path)->
+ ok = file:make_dir(filename:join([Path,"ht"])),
+ ok = file:make_dir(filename:join([Path,"ht/open"])),
+ ok = file:make_dir(filename:join([Path,"ht/blocknet"])),
+ ok = file:make_dir(filename:join([Path,"ht/secret"])),
+ ok = file:make_dir(filename:join([Path,"ht/secret/top_secret"])).
+
+remove_htaccess_dirs(Path)->
+ file:del_dir(filename:join([Path,"ht/secret/top_secret"])),
+ file:del_dir(filename:join([Path,"ht/secret"])),
+ file:del_dir(filename:join([Path,"ht/blocknet"])),
+ file:del_dir(filename:join([Path,"ht/open"])),
+ file:del_dir(filename:join([Path,"ht"])).
+
+format_ip(IpAddress,Pos)when Pos > 0->
+ case lists:nth(Pos,IpAddress) of
+ $.->
+ case lists:nth(Pos-2,IpAddress) of
+ $.->
+ format_ip(IpAddress,Pos-3);
+ _->
+ lists:sublist(IpAddress,Pos-2) ++ "."
+ end;
+ _ ->
+ format_ip(IpAddress,Pos-1)
+ end;
+
+format_ip(IpAddress, _Pos)->
+ "1" ++ IpAddress.
+
+remove_htaccess(Path)->
+ file:delete(filename:join([Path,"ht/open/dummy.html"])),
+ file:delete(filename:join([Path,"ht/secret/dummy.html"])),
+ file:delete(filename:join([Path,"ht/secret/top_secret/dummy.html"])),
+ file:delete(filename:join([Path,"ht/blocknet/dummy.html"])),
+ file:delete(filename:join([Path,"ht/blocknet/.htaccess"])),
+ file:delete(filename:join([Path,"ht/open/.htaccess"])),
+ file:delete(filename:join([Path,"ht/secret/.htaccess"])),
+ file:delete(filename:join([Path,"ht/secret/top_secret/.htaccess"])),
+ file:delete(filename:join([Path,"ht","users.file"])),
+ file:delete(filename:join([Path,"ht","groups.file"])),
+ remove_htaccess_dirs(Path).
+
+
+dos_hostname_poll(Type, Host, Port, Node, Hosts) ->
+ [dos_hostname_poll1(Type, Host, Port, Node, Host1, Code)
+ || {Host1,Code} <- Hosts].
+
+dos_hostname_poll1(Type, Host, Port, Node, Host1, Code) ->
+ ok = httpd_test_lib:verify_request(Type, Host, Port, Node,
+ dos_hostname_request(Host1),
+ [{statuscode, Code},
+ {version, "HTTP/1.0"}]).
+
+dos_hostname_request(Host) ->
+ "GET / HTTP/1.0\r\n" ++ Host ++ "\r\n\r\n".
+
+get_nof_clients(Mode, Load) ->
+ get_nof_clients(test_server:os_type(), Mode, Load).
+
+get_nof_clients(_, ip_comm, light) -> 5;
+get_nof_clients(_, ssl, light) -> 2;
+get_nof_clients(_, ip_comm, medium) -> 10;
+get_nof_clients(_, ssl, medium) -> 4;
+get_nof_clients(_, ip_comm, heavy) -> 20;
+get_nof_clients(_, ssl, heavy) -> 6.
+
+%% Make a file 100 bytes long containing 012...9*10
+create_range_data(Path) ->
+ PathAndFileName=filename:join([Path,"range.txt"]),
+ file:write_file(PathAndFileName,list_to_binary(["12345678901234567890",
+ "12345678901234567890",
+ "12345678901234567890",
+ "12345678901234567890",
+ "12345678901234567890"])).
+
+create_ipv6_config(Config, FileName, Ipv6Address) ->
+ ServerRoot = ?config(server_root, Config),
+ TcTopDir = ?config(tc_top_dir, Config),
+ Port = ?config(port, Config),
+ SockType = ?config(sock_type, Config),
+ Mods = io_lib:format("~p", [httpd_mod]),
+ Funcs = io_lib:format("~p", [ssl_password_cb]),
+ Host = ?config(ipv6_host, Config),
+
+ MaxHdrSz = io_lib:format("~p", [256]),
+ MaxHdrAct = io_lib:format("~p", [close]),
+
+ Mod_order = "Modules mod_alias mod_auth mod_esi mod_actions mod_cgi"
+ " mod_include mod_dir mod_get mod_head"
+ " mod_log mod_disk_log mod_trace",
+
+ SSL =
+ if
+ (SockType =:= ssl) orelse
+ (SockType =:= essl) ->
+ [cline(["SSLCertificateFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLCertificateKeyFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLCACertificateFile ",
+ filename:join(ServerRoot, "ssl/ssl_server.pem")]),
+ cline(["SSLPasswordCallbackModule ", Mods]),
+ cline(["SSLPasswordCallbackFunction ", Funcs]),
+ cline(["SSLVerifyClient 0"]),
+ cline(["SSLVerifyDepth 1"])];
+ true ->
+ []
+ end,
+
+ BindAddress = "[" ++ Ipv6Address ++"]|inet6",
+
+ HttpConfig =
+ [cline(["BindAddress ", BindAddress]),
+ cline(["Port ", integer_to_list(Port)]),
+ cline(["ServerName ", Host]),
+ cline(["SocketType ", atom_to_list(SockType)]),
+ cline([Mod_order]),
+ cline(["ServerRoot ", ServerRoot]),
+ cline(["DocumentRoot ", filename:join(ServerRoot, "htdocs")]),
+ cline(["MaxHeaderSize ",MaxHdrSz]),
+ cline(["MaxHeaderAction ",MaxHdrAct]),
+ cline(["DirectoryIndex ", "index.html "]),
+ cline(["DefaultType ", "text/plain"]),
+ SSL],
+ ConfigFile = filename:join([TcTopDir,FileName]),
+ {ok, Fd} = file:open(ConfigFile, [write]),
+ ok = file:write(Fd, lists:flatten(HttpConfig)),
+ ok = file:close(Fd).
+
+
+tsp(F) ->
+ inets_test_lib:tsp("[~w]" ++ F, [?MODULE]).
+tsp(F, A) ->
+ inets_test_lib:tsp("[~w]" ++ F, [?MODULE|A]).
+
+tsf(Reason) ->
+ inets_test_lib:tsf(Reason).
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/Makefile.src b/lib/inets/test/old_httpd_SUITE_data/Makefile.src
new file mode 100644
index 0000000000..b0fdb43d8d
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/Makefile.src
@@ -0,0 +1,14 @@
+CC = @CC@
+LD = @LD@
+CFLAGS = @CFLAGS@ -I@erl_include@ @DEFS@
+CROSSLDFLAGS = @CROSSLDFLAGS@
+
+PROGS = cgi_echo@exe@
+
+all: $(PROGS)
+
+cgi_echo@exe@: cgi_echo@obj@
+ $(LD) $(CROSSLDFLAGS) -o cgi_echo cgi_echo@obj@ @LIBS@
+
+cgi_echo@obj@: cgi_echo.c
+ $(CC) -c -o cgi_echo@obj@ $(CFLAGS) cgi_echo.c
diff --git a/lib/inets/test/old_httpd_SUITE_data/cgi_echo.c b/lib/inets/test/old_httpd_SUITE_data/cgi_echo.c
new file mode 100644
index 0000000000..580f860e96
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/cgi_echo.c
@@ -0,0 +1,97 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+#if defined __WIN32__
+#include <windows.h>
+#include <fcntl.h>
+#endif
+
+static int read_exact(char *buffer, int len);
+static int write_exact(char *buffer, int len);
+
+int main(void)
+{
+ char msg[100];
+ int msg_len;
+#ifdef __WIN32__
+ _setmode(_fileno( stdin), _O_BINARY);
+ _setmode(_fileno( stdout), _O_BINARY);
+#endif
+ msg_len = read_exact(msg, 100);
+
+ write_exact("Content-type: text/plain\r\n\r\n", 28);
+ write_exact(msg, msg_len);
+ exit(EXIT_SUCCESS);
+}
+
+
+/* read from stdin */
+#ifdef __WIN32__
+static int read_exact(char *buffer, int len)
+{
+ HANDLE standard_input = GetStdHandle(STD_INPUT_HANDLE);
+
+ unsigned read_result;
+ unsigned sofar = 0;
+
+ if (!len) { /* Happens for "empty packages */
+ return 0;
+ }
+ for (;;) {
+ if (!ReadFile(standard_input, buffer + sofar,
+ len - sofar, &read_result, NULL)) {
+ return -1; /* EOF */
+ }
+ if (!read_result) {
+ return -2; /* Interrupted while reading? */
+ }
+ sofar += read_result;
+ if (sofar == len) {
+ return len;
+ }
+ }
+}
+#else
+static int read_exact(char *buffer, int len) {
+ int i, got = 0;
+
+ do {
+ if ((i = read(0, buffer + got, len - got)) <= 0)
+ return(i);
+ got += i;
+ } while (got < len);
+ return len;
+
+}
+#endif
+
+/* write to stdout */
+#ifdef __WIN32__
+ static int write_exact(char *buffer, int len)
+ {
+ HANDLE standard_output = GetStdHandle(STD_OUTPUT_HANDLE);
+ unsigned written;
+
+ if (!WriteFile(standard_output, buffer, len, &written, NULL)) {
+ return -1; /* Broken Pipe */
+ }
+ if (written < ((unsigned) len)) {
+ /* This should not happen, standard output is not blocking? */
+ return -2;
+ }
+
+ return (int) written;
+}
+
+#else
+ static int write_exact(char *buffer, int len) {
+ int i, wrote = 0;
+
+ do {
+ if ((i = write(1, buffer + wrote, len - wrote)) <= 0)
+ return i;
+ wrote += i;
+ } while (wrote < len);
+ return len;
+ }
+#endif
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/Makefile b/lib/inets/test/old_httpd_SUITE_data/server_root/Makefile
index d7a3231068..d7a3231068 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/Makefile
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/Makefile
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/auth/group b/lib/inets/test/old_httpd_SUITE_data/server_root/auth/group
new file mode 100644
index 0000000000..b3da0ccbd3
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/auth/group
@@ -0,0 +1,3 @@
+group1: one two
+group2: two three
+group3: three Aladdin
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/auth/passwd b/lib/inets/test/old_httpd_SUITE_data/server_root/auth/passwd
new file mode 100644
index 0000000000..8c980ff547
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/auth/passwd
@@ -0,0 +1,4 @@
+one:onePassword
+two:twoPassword
+three:threePassword
+Aladdin:AladdinPassword
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.bat b/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.bat
new file mode 100644
index 0000000000..25a49a1536
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.bat
@@ -0,0 +1,9 @@
+@echo off
+echo tomrad > c:\cygwin\tmp\hej
+echo Content-type: text/html
+echo.
+echo ^<HTML^> ^<HEAD^> ^<TITLE^>OS Environment^</TITLE^> ^</HEAD^> ^<BODY^>^<PRE^>
+set
+echo ^</PRE^>^</BODY^>^</HTML^>
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.sh b/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.sh
new file mode 100755
index 0000000000..de81de9bde
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/cgi-bin/printenv.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+echo "Content-type: text/html"
+echo ""
+echo "<HTML> <HEAD> <TITLE>OS Environment</TITLE> </HEAD> <BODY><PRE>"
+env
+echo "</PRE></BODY></HTML>" \ No newline at end of file
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/8080.conf b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/8080.conf
index 48e66f0114..48e66f0114 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/8080.conf
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/8080.conf
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/8888.conf b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/8888.conf
index 79bb7fcca4..79bb7fcca4 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/8888.conf
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/8888.conf
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/httpd.conf
index ceb94237d2..ceb94237d2 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/httpd.conf
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/httpd.conf
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/mime.types b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/mime.types
index d2f81e4e5e..d2f81e4e5e 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/mime.types
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/mime.types
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/conf/ssl.conf b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/ssl.conf
index 8b8c57a98b..8b8c57a98b 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/conf/ssl.conf
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/conf/ssl.conf
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/config.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/config.shtml
new file mode 100644
index 0000000000..107e3ff610
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/config.shtml
@@ -0,0 +1,70 @@
+<HTML>
+<HEAD>
+<TITLE>/ssi.html (17-Apr-1997)</TITLE>
+</HEAD>
+<BODY>
+<H1>/ssi.html</H1>
+
+<!-- ************* CONFIG ************* -->
+
+<!--#config timefmt="%a %b %e %T %Z %Y" sizefmt="abbrev"-->
+<!--#config errmsg="[an especially ugly error occurred while processing this directive]"-->
+
+<!-- ************* INCLUDE ************* -->
+
+<P>Include /misc/friedrich.html:
+<!--#include virtual="/misc/friedrich.html"-->
+<P>Include /misc/not_defined.html: <!--#include virtual="/misc/not_defined.html"-->
+<P>Include misc/friedrich.html:
+<!--#include file="misc/friedrich.html"-->
+<P>Include not_defined.html: <!--#include file="not_defined.html"-->
+
+<P><HR>
+
+<!-- ************* ECHO ************* -->
+
+<P>DOCUMENT_NAME: <!--#echo var="DOCUMENT_NAME"-->
+<P>DOCUMENT_URI: <!--#echo var="DOCUMENT_URI"-->
+<P>QUERY_STRING_UNESCAPED: <!--#echo var="QUERY_STRING_UNESCAPED"-->
+<P>DATE_LOCAL: <!--#echo var="DATE_LOCAL"-->
+<P>DATE_GMT: <!--#echo var="DATE_GMT"-->
+<P>LAST_MODIFIED: <!--#echo var="LAST_MODIFIED"-->
+<P>NOT_DEFINED: <!--#echo var="NOT_DEFINED"-->
+
+<P><HR>
+
+<!-- ************* FSIZE ************* -->
+
+<P>Size of index.html: <!--#fsize file="index.html"-->
+<P>Size of not_defined.html: <!--#fsize file="not_defined.html"-->
+<!--#config sizefmt="bytes"-->
+<P>Size of /misc/friedrich.html: <!--#fsize virtual="/misc/friedrich.html"-->
+<P>Size of /misc/not_defined.html: <!--#fsize virtual="/misc/not_defined.html"-->
+
+<P><HR>
+
+<!-- ************* FLASTMOD ************* -->
+
+<P>Last modification of index.html: <!--#flastmod file="index.html"-->
+<P>Last modification of not_defined.html: <!--#flastmod file="not_defined.html"-->
+<P>Last modification of /misc/friedrich.html: <!--#flastmod virtual="/misc/friedrich.html"-->
+<P>Last modification of /misc/not_defined.html: <!--#flastmod virtual="/misc/not_defined.html"-->
+
+<!--#exec cmd="ls"-->
+<!--#exec cmd="printenv"-->
+<!--#exec cmd="sunemaja"-->
+
+<!--#exec cgi="/cgi-bin/printenv.sh"-->
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_open/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_open/dummy.html
new file mode 100644
index 0000000000..a6e8a35a04
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_open/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/open/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/open/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/dummy.html
new file mode 100644
index 0000000000..016b04e540
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/secret/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/secret/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/top_secret/index.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/top_secret/index.html
new file mode 100644
index 0000000000..34db3d5d1a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/dets_secret/top_secret/index.html
@@ -0,0 +1,9 @@
+<HTML>
+<HEAD>
+<TITLE>/secret/top_secret/index.html (04-Feb-1998)</TITLE>
+<!-- Created by: Mattias Nilsson, 04-Feb-1998 -->
+</HEAD>
+<BODY>
+<H1>/secret/top_secret/index.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/echo.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/echo.shtml
new file mode 100644
index 0000000000..141db5be59
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/echo.shtml
@@ -0,0 +1,35 @@
+<HTML>
+<HEAD>
+<TITLE>/echo.shtml</TITLE>
+</HEAD>
+<BODY>
+<H1>/echo.shtml</H1>
+
+<P>DOCUMENT_NAME: <!--#echo var="DOCUMENT_NAME"-->
+
+<P>DOCUMENT_URI: <!--#echo var="DOCUMENT_URI"-->
+
+<P>QUERY_STRING_UNESCAPED: <!--#echo var="QUERY_STRING_UNESCAPED"-->
+
+<P>DATE_LOCAL: <!--#echo var="DATE_LOCAL"-->
+
+<P>DATE_GMT: <!--#echo var="DATE_GMT"-->
+
+<P>LAST_MODIFIED: <!--#echo var="LAST_MODIFIED"-->
+
+<P>NOT_DEFINED: <!--#echo var="NOT_DEFINED"-->
+
+<P>[<A HREF="ssi.html">Back</A>]
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/exec.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/exec.shtml
new file mode 100644
index 0000000000..97333da898
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/exec.shtml
@@ -0,0 +1,30 @@
+<HTML>
+<HEAD>
+<TITLE>/exec.shtml</TITLE>
+</HEAD>
+<BODY>
+<H1>/exec.shtml</H1>
+<PRE>
+<!--#exec cmd="ls"-->
+<HR>
+<!--#exec cmd="printenv"-->
+<HR>
+<!--#exec cmd="sunemaja"-->
+<HR>
+<!--#exec cgi="/cgi-bin/printenv.sh"-->
+</PRE>
+
+<P>[<A HREF="ssi.html">Back</A>]
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/flastmod.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/flastmod.shtml
new file mode 100644
index 0000000000..d54c36fe50
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/flastmod.shtml
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<TITLE>/flastmod.shtml</TITLE>
+</HEAD>
+<BODY>
+<H1>/flastmod.shtml</H1>
+
+<P>Last modification of index.html: <!--#flastmod file="index.html"-->
+
+<P>Last modification of not_defined.html: <!--#flastmod file="not_defined.html"-->
+
+<P>Last modification of /misc/friedrich.html: <!--#flastmod virtual="/misc/friedrich.html"-->
+
+<P>Last modification of /misc/not_defined.html: <!--#flastmod virtual="/misc/not_defined.html"-->
+
+<P>[<A HREF="ssi.html">Back</A>]
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/fsize.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/fsize.shtml
new file mode 100644
index 0000000000..570ee9cf6d
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/fsize.shtml
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<TITLE>/fsize.shtml</TITLE>
+</HEAD>
+<BODY>
+<H1>/fsize.shtml</H1>
+
+<P>Size of index.html: <!--#fsize file="index.html"-->
+
+<P>Size of not_defined.html: <!--#fsize file="not_defined.html"-->
+
+<P>Size of /misc/friedrich.html: <!--#fsize virtual="/misc/friedrich.html"-->
+
+<P>Size of /misc/not_defined.html: <!--#fsize virtual="/misc/not_defined.html"-->
+
+<P>[<A HREF="ssi.html">Back</A>]
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/include.shtml b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/include.shtml
new file mode 100644
index 0000000000..529aad0437
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/include.shtml
@@ -0,0 +1,33 @@
+<HTML>
+<HEAD>
+<TITLE>/include.shtml</TITLE>
+</HEAD>
+<BODY>
+<H1>/include.shtml</H1>
+
+<P>Include /misc/friedrich.html:
+<!--#include virtual="/misc/friedrich.html"-->
+
+<P>Include /misc/not_defined.html:
+<!--#include virtual="/misc/not_defined.html"-->
+
+<P>Include misc/friedrich.html:
+<!--#include file="misc/friedrich.html"-->
+
+<P>Include not_defined.html:
+<!--#include file="not_defined.html"-->
+
+<P>[<A HREF="ssi.html">Back</A>]
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/index.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/index.html
new file mode 100644
index 0000000000..cfdc9f9ab7
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/index.html
@@ -0,0 +1,25 @@
+<HTML>
+<HEAD>
+<TITLE>/index.html</TITLE>
+</HEAD>
+<BODY>
+<H1>/index.html</H1>
+
+<STRONG>Server-Side Include (SSI) commands:</STRONG><BR>
+<A HREF="config.shtml">config</A><BR>
+<A HREF="echo.shtml">echo</A><BR>
+<A HREF="exec.shtml">exec</A><BR>
+<A HREF="flastmod.shtml">flastmod</A><BR>
+<A HREF="fsize.shtml">fsize</A><BR>
+<A HREF="include.shtml">include</A><BR>
+
+<BR>
+<BR>
+
+<STRONG>ESI callback:</STRING><BR>
+<A HREF="cgi-bin/erl/httpd_example/get">cgi-bin/erl/httpd_example/get</A><BR>
+<A HREF="cgi-bin/erl/httpd_example/yahoo">cgi-bin/erl/httpd_example/yahoo</A><BR>
+<A HREF="cgi-bin/erl/httpd_example/test1">cgi-bin/erl/httpd_example/test1</A><BR>
+
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/last_modified.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/last_modified.html
new file mode 100644
index 0000000000..65c1790813
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/last_modified.html
@@ -0,0 +1,22 @@
+<HTML>
+<HEAD>
+<TITLE>/last_modified.html</TITLE>
+</HEAD>
+<BODY>
+<H1>/last_modified.html</H1>
+
+<P>This document is only used for test of illegal last-modified date.</P>
+
+
+</BODY>
+</HTML>
+
+
+
+
+
+
+
+
+
+
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/friedrich.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/friedrich.html
new file mode 100644
index 0000000000..d7953d5df4
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/friedrich.html
@@ -0,0 +1,7 @@
+<P><CITE>
+Talking much about oneself can also be a means to conceal oneself.<BR>
+-- Friedrich Nietzsche
+</CITE>
+
+<P>Nested Include:
+<!--#include file="misc/oech.html"-->
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/oech.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/oech.html
new file mode 100644
index 0000000000..506064bf04
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/oech.html
@@ -0,0 +1,4 @@
+<P><CITE>
+What excuses stand in your way? How can you eliminate them?<BR>
+-- Roger von Oech
+</CITE>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/welcome.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/welcome.html
new file mode 100644
index 0000000000..8c17451f91
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/misc/welcome.html
@@ -0,0 +1 @@
+<HTML></HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_open/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_open/dummy.html
new file mode 100644
index 0000000000..a6e8a35a04
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_open/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/open/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/open/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/dummy.html
new file mode 100644
index 0000000000..016b04e540
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/secret/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/secret/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/top_secret/index.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/top_secret/index.html
new file mode 100644
index 0000000000..2d17e8b596
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/mnesia_secret/top_secret/index.html
@@ -0,0 +1,9 @@
+<HTML>
+<HEAD>
+<TITLE>/mnesia_secret/top_secret/index.html (04-Feb-1998)</TITLE>
+<!-- Created by: Mattias Nilsson, 04-Feb-1998 -->
+</HEAD>
+<BODY>
+<H1>/mnesia_secret/top_secret/index.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/open/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/open/dummy.html
new file mode 100644
index 0000000000..a6e8a35a04
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/open/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/open/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/open/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/dummy.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/dummy.html
new file mode 100644
index 0000000000..016b04e540
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/dummy.html
@@ -0,0 +1,10 @@
+<HTML>
+<HEAD>
+<TITLE>/secret/dummy.html (17-Apr-1997)</TITLE>
+<!-- Created by: Joakim Greben�, 17-Apr-1997 -->
+<!-- Changed by: Joakim Greben�, 17-Apr-1997 -->
+</HEAD>
+<BODY>
+<H1>/secret/dummy.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/top_secret/index.html b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/top_secret/index.html
new file mode 100644
index 0000000000..34db3d5d1a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/htdocs/secret/top_secret/index.html
@@ -0,0 +1,9 @@
+<HTML>
+<HEAD>
+<TITLE>/secret/top_secret/index.html (04-Feb-1998)</TITLE>
+<!-- Created by: Mattias Nilsson, 04-Feb-1998 -->
+</HEAD>
+<BODY>
+<H1>/secret/top_secret/index.html</H1>
+</BODY>
+</HTML>
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/icons/README b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/README
index a1fc5a5a9c..a1fc5a5a9c 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/icons/README
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/README
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/a.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/a.gif
new file mode 100644
index 0000000000..bb23d971f4
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/a.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.black.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.black.gif
new file mode 100644
index 0000000000..eaecd2172a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.black.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.red.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.red.gif
new file mode 100644
index 0000000000..a423894043
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/alert.red.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/apache_pb.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/apache_pb.gif
new file mode 100644
index 0000000000..3a1c139fc4
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/apache_pb.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/back.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/back.gif
new file mode 100644
index 0000000000..a694ae1ec3
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/back.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.gray.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.gray.gif
new file mode 100644
index 0000000000..eb84268c4c
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.gray.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.red.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.red.gif
new file mode 100644
index 0000000000..a8425cb574
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ball.red.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binary.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binary.gif
new file mode 100644
index 0000000000..9a15cbae04
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binary.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binhex.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binhex.gif
new file mode 100644
index 0000000000..62d0363108
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/binhex.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/blank.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/blank.gif
new file mode 100644
index 0000000000..0ccf01e198
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/blank.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/bomb.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/bomb.gif
new file mode 100644
index 0000000000..270fdb1c06
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/bomb.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box1.gif
new file mode 100644
index 0000000000..65dcd002ea
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box2.gif
new file mode 100644
index 0000000000..c43bc4faec
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/box2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/broken.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/broken.gif
new file mode 100644
index 0000000000..9f8cbe9f76
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/broken.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/burst.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/burst.gif
new file mode 100644
index 0000000000..fbdcf575f7
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/burst.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button1.gif
new file mode 100644
index 0000000000..eb97cb7333
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button10.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button10.gif
new file mode 100644
index 0000000000..fe0c97998c
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button10.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button2.gif
new file mode 100644
index 0000000000..7698455bf9
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button3.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button3.gif
new file mode 100644
index 0000000000..a8b8319232
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button3.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button4.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button4.gif
new file mode 100644
index 0000000000..0fd15a0d7f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button4.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button5.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button5.gif
new file mode 100644
index 0000000000..64241e5c5d
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button5.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button6.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button6.gif
new file mode 100644
index 0000000000..867cfd1212
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button6.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button7.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button7.gif
new file mode 100644
index 0000000000..b3f5fb248f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button7.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button8.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button8.gif
new file mode 100644
index 0000000000..7a308be8f6
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button8.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button9.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button9.gif
new file mode 100644
index 0000000000..9acba576c0
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/button9.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonl.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonl.gif
new file mode 100644
index 0000000000..3883088e7a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonl.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonr.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonr.gif
new file mode 100644
index 0000000000..c4dc3887db
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/buttonr.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/c.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/c.gif
new file mode 100644
index 0000000000..7555b6c164
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/c.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.blue.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.blue.gif
new file mode 100644
index 0000000000..f8d76a8c23
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.blue.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.gray.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.gray.gif
new file mode 100644
index 0000000000..7664cd0364
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/comp.gray.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/compressed.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/compressed.gif
new file mode 100644
index 0000000000..39e732739f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/compressed.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/continued.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/continued.gif
new file mode 100644
index 0000000000..b0ffb7e0cc
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/continued.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dir.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dir.gif
new file mode 100644
index 0000000000..48264601ae
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dir.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/down.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/down.gif
new file mode 100644
index 0000000000..a354c871cd
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/down.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dvi.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dvi.gif
new file mode 100644
index 0000000000..791be33105
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/dvi.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/f.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/f.gif
new file mode 100644
index 0000000000..fbe353c282
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/f.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.gif
new file mode 100644
index 0000000000..48264601ae
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.open.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.open.gif
new file mode 100644
index 0000000000..30979cb528
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.open.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.sec.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.sec.gif
new file mode 100644
index 0000000000..75332d9e59
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/folder.sec.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/forward.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/forward.gif
new file mode 100644
index 0000000000..b2959b4c85
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/forward.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.gif
new file mode 100644
index 0000000000..de60b2940f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.red.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.red.gif
new file mode 100644
index 0000000000..94743981d9
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.red.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.sec.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.sec.gif
new file mode 100644
index 0000000000..88d5240c3c
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/generic.sec.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.right.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.right.gif
new file mode 100644
index 0000000000..5cdbc7206d
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.right.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.up.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.up.gif
new file mode 100644
index 0000000000..85a5d68317
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/hand.up.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/htdig.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/htdig.gif
new file mode 100644
index 0000000000..35443fb63a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/htdig.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/icon.sheet.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/icon.sheet.gif
new file mode 100644
index 0000000000..ad1686e448
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/icon.sheet.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image1.gif
new file mode 100644
index 0000000000..01e442bfa9
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image2.gif
new file mode 100644
index 0000000000..751faeea36
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image3.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image3.gif
new file mode 100644
index 0000000000..4f30484ff6
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/image3.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/index.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/index.gif
new file mode 100644
index 0000000000..162478fb3a
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/index.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/layout.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/layout.gif
new file mode 100644
index 0000000000..c96338a152
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/layout.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/left.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/left.gif
new file mode 100644
index 0000000000..279e6710d4
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/left.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/link.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/link.gif
new file mode 100644
index 0000000000..c5b6889a76
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/link.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/movie.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/movie.gif
new file mode 100644
index 0000000000..0035183774
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/movie.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/p.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/p.gif
new file mode 100644
index 0000000000..7b917b4e91
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/p.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/patch.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/patch.gif
new file mode 100644
index 0000000000..39bc90e795
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/patch.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pdf.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pdf.gif
new file mode 100644
index 0000000000..c88fd777c4
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pdf.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie0.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie0.gif
new file mode 100644
index 0000000000..6f7a0ae7a7
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie0.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie1.gif
new file mode 100644
index 0000000000..03aa6be71e
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie2.gif
new file mode 100644
index 0000000000..b04c5e0908
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie3.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie3.gif
new file mode 100644
index 0000000000..4db9d023ed
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie3.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie4.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie4.gif
new file mode 100644
index 0000000000..93471fdd88
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie4.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie5.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie5.gif
new file mode 100644
index 0000000000..57aee93f07
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie5.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie6.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie6.gif
new file mode 100644
index 0000000000..0dc327b569
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie6.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie7.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie7.gif
new file mode 100644
index 0000000000..8661337f06
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie7.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie8.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie8.gif
new file mode 100644
index 0000000000..59ddb34ce0
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/pie8.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/portal.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/portal.gif
new file mode 100644
index 0000000000..0e6e506e00
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/portal.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/poweredby.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/poweredby.gif
new file mode 100644
index 0000000000..d324ab80ea
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/poweredby.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ps.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ps.gif
new file mode 100644
index 0000000000..0f565bc1db
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/ps.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/quill.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/quill.gif
new file mode 100644
index 0000000000..818a5cdc7e
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/quill.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/right.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/right.gif
new file mode 100644
index 0000000000..b256e5f75f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/right.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw1.gif
new file mode 100644
index 0000000000..af6ba2b097
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw2.gif
new file mode 100644
index 0000000000..06dccb3e44
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/screw2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/script.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/script.gif
new file mode 100644
index 0000000000..d8a853bc58
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/script.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound1.gif
new file mode 100644
index 0000000000..8efb49f55d
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound2.gif
new file mode 100644
index 0000000000..48e6a7fb2f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sound2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere1.gif
new file mode 100644
index 0000000000..7067070da2
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere2.gif
new file mode 100644
index 0000000000..a9e462a377
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/sphere2.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star.gif
new file mode 100644
index 0000000000..4cfe0a5e0f
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star_blank.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star_blank.gif
new file mode 100644
index 0000000000..a0c83cb85b
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/star_blank.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tar.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tar.gif
new file mode 100644
index 0000000000..617e779efa
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tar.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tex.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tex.gif
new file mode 100644
index 0000000000..45e43233b8
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/tex.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/text.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/text.gif
new file mode 100644
index 0000000000..4c623909fb
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/text.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/transfer.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/transfer.gif
new file mode 100644
index 0000000000..33697dbb66
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/transfer.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/unknown.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/unknown.gif
new file mode 100644
index 0000000000..32b1ea23fb
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/unknown.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/up.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/up.gif
new file mode 100644
index 0000000000..6d6d6d1ebf
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/up.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uu.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uu.gif
new file mode 100644
index 0000000000..4387d529f6
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uu.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uuencoded.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uuencoded.gif
new file mode 100644
index 0000000000..4387d529f6
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/uuencoded.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world1.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world1.gif
new file mode 100644
index 0000000000..05b4ec2058
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world1.gif
Binary files differ
diff --git a/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world2.gif b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world2.gif
new file mode 100644
index 0000000000..e3203f7a88
--- /dev/null
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/icons/world2.gif
Binary files differ
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip b/lib/inets/test/old_httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip
index 8d1c8b69c3..8d1c8b69c3 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/logs/Dummy_File_Needed_By_WinZip
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_client.pem b/lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_client.pem
index 427447958d..427447958d 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_client.pem
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_client.pem
diff --git a/lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_server.pem b/lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_server.pem
index 4aac86db49..4aac86db49 100644
--- a/lib/inets/test/httpd_SUITE_data/server_root/ssl/ssl_server.pem
+++ b/lib/inets/test/old_httpd_SUITE_data/server_root/ssl/ssl_server.pem
diff --git a/lib/inets/vsn.mk b/lib/inets/vsn.mk
index 3c20348322..cccfb7a44f 100644
--- a/lib/inets/vsn.mk
+++ b/lib/inets/vsn.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2001-2013. All Rights Reserved.
+# Copyright Ericsson AB 2001-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -18,7 +18,7 @@
# %CopyrightEnd%
APPLICATION = inets
-INETS_VSN = 5.9.7
+INETS_VSN = 5.9.8
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(INETS_VSN)$(PRE_VSN)"
diff --git a/lib/jinterface/test/jitu.erl b/lib/jinterface/test/jitu.erl
index a029c063bc..46b8cb3ac2 100644
--- a/lib/jinterface/test/jitu.erl
+++ b/lib/jinterface/test/jitu.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2004-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2004-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -133,7 +133,7 @@ es(L,Quote,EscSpace) ->
cmd(Cmd) ->
PortOpts = [{line,80},eof,exit_status,stderr_to_stdout],
- io:format("cmd: ~s~n", [Cmd]),
+ io:format("cmd: ~ts~n", [Cmd]),
case catch open_port({spawn,Cmd}, PortOpts) of
Port when is_port(Port) ->
case erlang:port_info(Port,os_pid) of
diff --git a/lib/kernel/test/code_SUITE.erl b/lib/kernel/test/code_SUITE.erl
index 17983e972d..42b81d16b3 100644
--- a/lib/kernel/test/code_SUITE.erl
+++ b/lib/kernel/test/code_SUITE.erl
@@ -653,7 +653,7 @@ clash(Config) when is_list(Config) ->
DDir = ?config(data_dir,Config)++"clash/",
P = code:get_path(),
[TestServerPath|_] = [Path || Path <- code:get_path(),
- re:run(Path,"test_server/?$",[]) /= nomatch],
+ re:run(Path,"test_server/?$",[unicode]) /= nomatch],
%% test non-clashing entries
@@ -1527,7 +1527,10 @@ create_big_script(Config,Local) ->
Leftover <- UnloadFix,
lists:keymember(Leftover,1,InitialApplications) ],
%% Now we should have only "real" applications...
- [application:load(list_to_atom(Y)) || {match,[Y]} <- [ re:run(X,code:lib_dir()++"/"++"([^/-]*).*/ebin",[{capture,[1],list}]) || X <- code:get_path()],filter_app(Y,Local)],
+ [application:load(list_to_atom(Y))
+ || {match,[Y]} <- [re:run(X,code:lib_dir()++"/"++"([^/-]*).*/ebin",
+ [{capture,[1],list},unicode]) ||
+ X <- code:get_path()],filter_app(Y,Local)],
Apps = [ {N,V} || {N,_,V} <- application:loaded_applications()],
{ok,Fd} = file:open(Name ++ ".rel", [write]),
io:format(Fd,
diff --git a/lib/kernel/test/sendfile_SUITE.erl b/lib/kernel/test/sendfile_SUITE.erl
index 4cf4c6489d..24884bada5 100644
--- a/lib/kernel/test/sendfile_SUITE.erl
+++ b/lib/kernel/test/sendfile_SUITE.erl
@@ -33,6 +33,7 @@ all() ->
,t_sendfile_offset
,t_sendfile_sendafter
,t_sendfile_recvafter
+ ,t_sendfile_recvafter_remoteclose
,t_sendfile_sendduring
,t_sendfile_recvduring
,t_sendfile_closeduring
@@ -228,6 +229,25 @@ t_sendfile_recvafter(Config) ->
ok = sendfile_send(Send).
+%% This tests specifically for a bug fixed in 17.0
+t_sendfile_recvafter_remoteclose(Config) ->
+ Filename = proplists:get_value(small_file, Config),
+
+ Send = fun(Sock, SFServer) ->
+ {Size, _Data} = sendfile_file_info(Filename),
+ {ok, Size} = file:sendfile(Filename, Sock),
+
+ %% Make sure the remote end has been closed
+ SFServer ! stop,
+ timer:sleep(100),
+
+ %% In the bug this returned {error,ebadf}
+ {error,closed} = gen_tcp:recv(Sock, 1),
+ -1
+ end,
+
+ ok = sendfile_send({127,0,0,1},Send,0).
+
t_sendfile_sendduring(Config) ->
Filename = proplists:get_value(big_file, Config),
diff --git a/lib/kernel/test/zlib_SUITE.erl b/lib/kernel/test/zlib_SUITE.erl
index e91f6f18d4..3be6f39d95 100644
--- a/lib/kernel/test/zlib_SUITE.erl
+++ b/lib/kernel/test/zlib_SUITE.erl
@@ -178,7 +178,7 @@ api_deflateInit(Config) when is_list(Config) ->
?m(ok,zlib:close(Z))
end, lists:seq(1,8)),
- Strategies = [filtered,huffman_only,default],
+ Strategies = [filtered,huffman_only,rle,default],
lists:foreach(fun(Strategy) ->
?line Z = zlib:open(),
?m(ok, zlib:deflateInit(Z,best_speed,deflated,-15,8,Strategy)),
@@ -220,7 +220,6 @@ api_deflateParams(Config) when is_list(Config) ->
?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, none)),
?m(ok, zlib:deflateParams(Z1, best_compression, huffman_only)),
?m(_, zlib:deflate(Z1, <<1,1,1,1,1,1,1,1,1>>, sync)),
- ?m({'EXIT',_}, zlib:deflateParams(Z1,best_speed, filtered)),
?m(ok, zlib:close(Z1)).
api_deflate(doc) -> "Test deflate";
diff --git a/lib/megaco/doc/src/definitions/term.defs b/lib/megaco/doc/src/definitions/term.defs
index 57379eaa5d..16212923ea 100644
--- a/lib/megaco/doc/src/definitions/term.defs
+++ b/lib/megaco/doc/src/definitions/term.defs
@@ -1,7 +1,6 @@
[{"agent","agent","An entity that terminates a management protocol in the Network Element.","mbj"},
{"API","API","Application Programming Interface. The interface towards an application. Usually this is a set of functions available, but can also be a set of messages sent to or from an application.","mbj"},
{"application","application","A collection of resources which is required to offer a specific service.","mbj"},
-{"appmon","Application Monitor","A graphical node and application process tree viewer. See also appmon.","mbj"},
{"Appmon","Appmon","Application name for the Application Monitor within Erlang/OTP. A graphical node and process viewer.","mbj"},
{"app callback","application callback module","A module which is called when the application is started, and when it has stopped. Every application has one application callback module.","mbj"},
{"AC","application controller","A process which coordinates all operations on applications.","mbj"},
@@ -136,7 +135,6 @@ the module Erlang in the application kernel","kenneth"},
{"pattern matching","pattern matching","A basic mechanism in Erlang for assigning values to variables and for controlling the flow of a program.","kenneth"},
{"permanent child","permanent child","A supervised process which always is restarted when it dies.","mbj"},
{"Pid","Pid","Process Identifier. A data type in Erlang for storing process references. The process identity of the process displayed in the line.","kenneth"},
-{"Pman","Pman","Module and application name for the Process Trace Tool.","olin"},
{"point","point","A unit used to indicate the size of a typeface. Equal to 1/72 inches.","jocke"},
{"pointer","pointer","A pointer tells where data is stored. Memory pointers are not used in Erlang.","kent"},
{"port","port","A data type in Erlang. Ports provide the basic mechanism for communication with the external world.","peterl"},
@@ -198,7 +196,6 @@ the module Erlang in the application kernel","kenneth"},
{"Table Visualizer","Table Visualizer","A tool which enables the user to examine ETS and Mnesia tables.","olin"},
{"temporary child","temporary child","A supervised process which is never restarted when it dies.","mbj"},
{"term","term","The super type of all Erlang types.","kenneth"},
-{"Toolbar","Toolbar","A tool that provides an simplistic interface to the other various Erlang/OTP tools","olin"},
{"tools","tools","An application within Erlang/OTP which contains the tools which are not applications themselves.","olin"},
{"transaction","transaction","Transactions groups a set of database accesses into an atomic unit. All transactions has the ACID (atomicity, concistency, isolation and durability) properties.","hakan"},
{"transient child","transient child","A supervised process which is restarted if it dies non-normally.","mbj"},
diff --git a/lib/megaco/doc/src/notes.xml b/lib/megaco/doc/src/notes.xml
index a1039cbda0..f71166b1b1 100644
--- a/lib/megaco/doc/src/notes.xml
+++ b/lib/megaco/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>2000</year><year>2013</year>
+ <year>2000</year><year>2014</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -13,14 +13,14 @@
compliance with the License. You should have received a copy of the
Erlang Public License along with this software. If not, it can be
retrieved online at http://www.erlang.org/.
-
+
Software distributed under the License is distributed on an "AS IS"
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
the License for the specific language governing rights and limitations
under the License.
-
+
</legalnotice>
-
+
<title>Megaco Release Notes</title>
<prepared>Lars Thors&eacute;n, H&aring;kan Mattsson, Micael Karlberg</prepared>
<docno></docno>
@@ -29,30 +29,43 @@
<file>notes.xml</file>
</header>
<p>This document describes the changes made to the Megaco system
- from version to version. The intention of this document is to
- list all incompatibilities as well as all enhancements and
- bugfixes for every release of Megaco. Each release of Megaco
- thus constitutes one section in this document. The title of each
- section is the version number of Megaco.</p>
-
-
- <section><title>Megaco 3.17.0.2</title>
+ from version to version. The intention of this document is to
+ list all incompatibilities as well as all enhancements and
+ bugfixes for every release of Megaco. Each release of Megaco
+ thus constitutes one section in this document. The title of each
+ section is the version number of Megaco.</p>
+
+
+ <section><title>Megaco 3.17.0.3</title>
<section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Introduced functionality for inspection of system and
- build configuration.</p>
- <p>
- Own Id: OTP-11196</p>
- </item>
- </list>
+ <list>
+ <item>
+ <p>Updated doc files to utf8.</p>
+ <p>Own Id: OTP-10907</p>
+ </item>
+ </list>
</section>
+
+ </section>
-</section>
+ <section><title>Megaco 3.17.0.2</title>
-<section><title>Megaco 3.17.0.1</title>
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p>
+ Introduced functionality for inspection of system and
+ build configuration.</p>
+ <p>
+ Own Id: OTP-11196</p>
+ </item>
+ </list>
+ </section>
+
+ </section>
+
+ <section><title>Megaco 3.17.0.1</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/megaco/src/app/megaco.appup.src b/lib/megaco/src/app/megaco.appup.src
index da171e0c18..db59f55b55 100644
--- a/lib/megaco/src/app/megaco.appup.src
+++ b/lib/megaco/src/app/megaco.appup.src
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2001-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2001-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -165,11 +165,21 @@
%% | | | | |
%% v v v v v
%% 3.17 <- 3.16.1 <- 3.15.2 <- 3.14.2 <- 3.11.4
+%% |
+%% v
+%% 3.17.0.1
+%% |
+%% v
+%% 3.17.0.2
+%% |
+%% v
+%% 3.17.0.3
%%
%%
{"%VSN%",
[
+ {"3.17.0.2", []},
{"3.17.0.1", []},
{"3.17", []},
{"3.16.0.3",
@@ -180,6 +190,7 @@
}
],
[
+ {"3.17.0.2", []},
{"3.17.0.1", []},
{"3.17", []},
{"3.16.0.3",
diff --git a/lib/megaco/vsn.mk b/lib/megaco/vsn.mk
index ea4e9f2eb8..01d429d0ae 100644
--- a/lib/megaco/vsn.mk
+++ b/lib/megaco/vsn.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2013. All Rights Reserved.
+# Copyright Ericsson AB 1997-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -18,6 +18,6 @@
# %CopyrightEnd%
APPLICATION = megaco
-MEGACO_VSN = 3.17.0.2
+MEGACO_VSN = 3.17.0.3
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(MEGACO_VSN)$(PRE_VSN)"
diff --git a/lib/observer/doc/src/Makefile b/lib/observer/doc/src/Makefile
index e952808164..baeeeb1c65 100644
--- a/lib/observer/doc/src/Makefile
+++ b/lib/observer/doc/src/Makefile
@@ -69,10 +69,6 @@ ONLY_HTML_FILE =
GIF_FILES = \
et_processes.gif \
et_modsprocs.gif \
- etop_main.gif \
- etop_5.gif \
- etop_lines.gif \
- etop_opt.gif \
note.gif
# ----------------------------------------------------
diff --git a/lib/observer/doc/src/etop.xml b/lib/observer/doc/src/etop.xml
index 99d3b15811..9f3cdd6de8 100644
--- a/lib/observer/doc/src/etop.xml
+++ b/lib/observer/doc/src/etop.xml
@@ -38,21 +38,19 @@
<description>
<p><c>etop</c> should be started with the provided scripts
- <c>etop</c> and <c>getop</c> for text based and graphical
- presentation respectively. This will start a hidden erlang node
+ <c>etop</c>. This will start a hidden erlang node
which connects to the node to be measured. The measured node is
given with the <c>-node</c> option. If the measured node has a
different cookie than the default cookie for the user who
invokes the script, the cookie must be explicitly given witht
the <c>-setcookie</c> option.</p>
- <p>Under Windows the batch files <c>etop.bat</c> and
- <c>getop.bat</c> can be used.</p>
+ <p>Under Windows the batch file <c>etop.bat</c> can be used.</p>
<p>The following configuration parameters exist for the
- <c>etop</c> tool. When executing the <c>etop</c> or <c>getop</c>
- scripts, these parameters can be given as command line options,
- e.g. <c>getop -node testnode@myhost -setcookie MyCookie</c>.</p>
+ <c>etop</c> tool. When executing the <c>etop</c> script,
+ these parameters can be given as command line options,
+ e.g. <c>etop -node testnode@myhost -setcookie MyCookie</c>.</p>
<taglist>
<tag>node</tag>
<item>The measured node.
@@ -103,11 +101,6 @@ Value: <c>on | off</c> <br></br>
Default: <c>on</c></item>
</taglist>
- <p>All interaction with <c>etop</c> when running the graphical
- presentation should happen via the menus. For the text based
- presentation the functions described below can be used.
- </p>
-
<p>See the <seealso marker="etop_ug">user's guide</seealso> for
more information about the <c>etop</c> tool.</p>
@@ -118,7 +111,7 @@ Default: <c>on</c></item>
<fsummary>Start etop</fsummary>
<desc>
<p>This function starts <c>etop</c>.
- Note that etop is preferably started with the etop and getop scripts</p>
+ Note that etop is preferably started with the etop script.</p>
</desc>
</func>
<func>
diff --git a/lib/observer/doc/src/etop_5.gif b/lib/observer/doc/src/etop_5.gif
deleted file mode 100644
index 9650176366..0000000000
--- a/lib/observer/doc/src/etop_5.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/doc/src/etop_lines.gif b/lib/observer/doc/src/etop_lines.gif
deleted file mode 100644
index 10620a1155..0000000000
--- a/lib/observer/doc/src/etop_lines.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/doc/src/etop_main.gif b/lib/observer/doc/src/etop_main.gif
deleted file mode 100644
index 699cb986c8..0000000000
--- a/lib/observer/doc/src/etop_main.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/doc/src/etop_opt.gif b/lib/observer/doc/src/etop_opt.gif
deleted file mode 100644
index e420bff7f6..0000000000
--- a/lib/observer/doc/src/etop_opt.gif
+++ /dev/null
Binary files differ
diff --git a/lib/observer/doc/src/etop_ug.xml b/lib/observer/doc/src/etop_ug.xml
index 8291e417e7..c57df1d324 100644
--- a/lib/observer/doc/src/etop_ug.xml
+++ b/lib/observer/doc/src/etop_ug.xml
@@ -39,9 +39,7 @@
<section>
<title>Output</title>
- <p>The output from <c>etop</c> can be graphical or text based.
- </p>
- <p>Text based it looks like this:</p>
+ <p>The output from <c>etop</c> looks like this:</p>
<code type="none"><![CDATA[
========================================================================================
tiger@durin 13:40:32
@@ -63,10 +61,6 @@ Pid Name or Initial Func Time Reds Memory MsgQ Current Func
<127.137.0> net_kernel:do_spawn_ 0 553 5840 0 dbg:do_relay_1/1
========================================================================================
]]></code>
- <p>And graphically it looks like this:</p>
- <image file="etop_main.gif">
- <icaption>Graphical presentation of etop</icaption>
- </image>
<p>The header includes some system information:
</p>
<taglist>
@@ -102,9 +96,7 @@ Pid Name or Initial Func Time Reds Memory MsgQ Current Func
<section>
<title>Start</title>
- <p>To start etop with the graphical presentation, use the script
- <c>getop</c> or the batch file <c>getop.bat</c>, e.g. <c>getop -node tiger@durin</c></p>
- <p>To start etop with the text based presentation use the script
+ <p>To start etop use the script
<c>etop</c> or the batch file <c>etop.bat</c>, e.g. <c>etop -node tiger@durin</c>,
</p>
</section>
@@ -115,30 +107,12 @@ Pid Name or Initial Func Time Reds Memory MsgQ Current Func
<c>-OptName Value</c> to the command line, e.g. <c>etop -node tiger@durin -setcookie mycookie -lines 15</c>.
</p>
<p>The parameters <c>lines</c>, <c>interval</c>, <c>accumulate</c>
- and <c>sort</c> can be changed during runtime. Use the
- <em>Options</em> menu with the graphical presentation or the
- function <c>etop:config/2</c> with the text based presentation.
+ and <c>sort</c> can be changed during runtime by the
+ function <c>etop:config/2</c>.
</p>
<p>A list of all valid configuration parameters can be found in
the reference manual for <c>etop</c>.
</p>
- <p>Note that it is even possible to change which information to
- sort by by clicking the header line of the table in the graphical
- presentation.
- </p>
-
- <section>
- <title>Example: Change configuration with graphical presentation</title>
- <image file="etop_opt.gif">
- <icaption>Select the option to change from the Options menu.</icaption>
- </image>
- <image file="etop_lines.gif">
- <icaption>Enter the new value in the popup window and click "Ok"</icaption>
- </image>
- <image file="etop_5.gif">
- <icaption>The interface is updated with the new configuration</icaption>
- </image>
- </section>
<section>
<title>Example: Change configuration with text based presentation</title>
@@ -187,18 +161,14 @@ Pid Name or Initial Func Time Reds Memory MsgQ Current Func
<section>
<title>Print to file</title>
<p>At any time, the current <c>etop</c> display can be dumped to a
- text file. Use <em>Dump to file</em> on the <em>File</em> menu
- with the graphical presentation or the function <c>etop:dump/1</c>
- with the text based presentation.
+ text file with the function <c>etop:dump/1</c>.
</p>
</section>
<section>
<title>Stop</title>
- <p>To stop <c>etop</c>, use <em>Exit</em> on the <em>File</em>
- menu for the graphical presentation, or the function
- <c>etop:stop/0</c> with the text based presentation.
- </p>
+ <p>Use the function <c>etop:stop/0</c> to stop <c>etop</c>.
+ </p>
</section>
</chapter>
diff --git a/lib/observer/priv/bin/getop b/lib/observer/priv/bin/getop
deleted file mode 100755
index 5cd9bf3d76..0000000000
--- a/lib/observer/priv/bin/getop
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-NAME="etop"
-erl -sname $NAME -noinput -hidden -s etop -s erlang halt $@
diff --git a/lib/observer/priv/bin/getop.bat b/lib/observer/priv/bin/getop.bat
deleted file mode 100644
index 8b6f108f06..0000000000
--- a/lib/observer/priv/bin/getop.bat
+++ /dev/null
@@ -1,2 +0,0 @@
-@ECHO OFF
-CALL werl -sname etop -noinput -hidden -s etop -s erlang halt %*
diff --git a/lib/observer/priv/erlang_observer.png b/lib/observer/priv/erlang_observer.png
index 01723d210b..cf900a29e6 100644
--- a/lib/observer/priv/erlang_observer.png
+++ b/lib/observer/priv/erlang_observer.png
Binary files differ
diff --git a/lib/observer/src/Makefile b/lib/observer/src/Makefile
index fc6f51c617..c120865213 100644
--- a/lib/observer/src/Makefile
+++ b/lib/observer/src/Makefile
@@ -57,7 +57,6 @@ MODULES= \
cdv_virtual_list_wx \
cdv_wx \
etop \
- etop_gui \
etop_tr \
etop_txt \
observer \
@@ -92,13 +91,12 @@ PRIVDIR= ../priv
WEBTOOLFILES= $(PRIVDIR)/crashdump_viewer.tool $(PRIVDIR)/erlang_observer.png
BINDIR= $(PRIVDIR)/bin
ifeq ($(findstring win32,$(TARGET)),win32)
-WIN32_EXECUTABLES= $(BINDIR)/etop.bat $(BINDIR)/getop.bat $(BINDIR)/cdv.bat
+WIN32_EXECUTABLES= $(BINDIR)/etop.bat $(BINDIR)/cdv.bat
else
WIN32_EXECUTABLES=
endif
EXECUTABLES= \
$(BINDIR)/etop \
- $(BINDIR)/getop \
$(BINDIR)/cdv \
$(WIN32_EXECUTABLES)
CDVDIR= $(PRIVDIR)/crashdump_viewer
diff --git a/lib/observer/src/etop.erl b/lib/observer/src/etop.erl
index 2610060eae..96a18cf450 100644
--- a/lib/observer/src/etop.erl
+++ b/lib/observer/src/etop.erl
@@ -44,9 +44,6 @@ help() ->
" sort runtime | reductions | memory | msg_q~n"
" What information to sort by~n"
" Default: runtime (reductions if tracing=off)~n"
- " output graphical | text~n"
- " How to present results~n"
- " Default: graphical~n"
" tracing on | off etop uses the erlang trace facility, and thus~n"
" no other tracing is possible on the node while~n"
" etop is running, unless this option is set to~n"
@@ -317,7 +314,7 @@ handle_args([_| R], C) ->
handle_args([], C) ->
C.
-output(graphical) -> etop_gui;
+output(graphical) -> exit({deprecated, "Use observer instead"});
output(text) -> etop_txt.
diff --git a/lib/observer/src/etop_defs.hrl b/lib/observer/src/etop_defs.hrl
index 664de61973..720fb50b5a 100644
--- a/lib/observer/src/etop_defs.hrl
+++ b/lib/observer/src/etop_defs.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -22,8 +22,8 @@
" procs~8w processes~8w code ~8w~n"
" runq ~8w atom ~8w ets ~8w~n").
--record(opts, {node=node(), port = 8415, accum = false, intv = 5000, lines = 10,
+-record(opts, {node=node(), port = 8415, accum = false, intv = 5000, lines = 10,
width = 700, height = 340, sort = runtime, tracing = on,
%% Other state information
- out_mod=etop_gui, out_proc, server, host, tracer, store,
+ out_mod=etop_txt, out_proc, server, host, tracer, store,
accum_tab, remote}).
diff --git a/lib/observer/src/etop_gui.erl b/lib/observer/src/etop_gui.erl
deleted file mode 100644
index 3971646abc..0000000000
--- a/lib/observer/src/etop_gui.erl
+++ /dev/null
@@ -1,374 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2002-2013. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(etop_gui).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,create,4}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}}]).
-
--author('[email protected]').
-
--export([init/1,stop/1]).
--export([formatmfa/1,to_list/1]).% For etop_txt
-
--include("etop.hrl").
--include("etop_defs.hrl").
-
--import(etop, [loadinfo/1, meminfo/2, getopt/2]).
-
-%% Heights
--define(BarH, 28). % height of menubar
--define(LabelH, 90). % height of label with system info
--define(GridLineH, 21). % height of one line in the table (grid)
-
-%% Column numbers for grid - click to sort
--define(TimeCol, 3).
--define(RedsCol, 4).
--define(MemCol, 5).
--define(MsgQCol, 6).
-
-%% Font
--define(Normal, {screen,12}).
--define(Bold, {screen,bold,12}).
-
-
-%% -----------------------------------------------------------------------------
-stop(_) -> ok.
-
-init(Config) ->
- S = gs:start(),
- Width = getopt(width, Config),
- TotLines = getopt(lines,Config)+1,
-
- %% Max number of processes shown in window at startup is 10
- %% If less than 10 lines is specified, window size fits number of lines
- WinH = if TotLines > 11 -> 11*?GridLineH + ?BarH + ?LabelH;
- true -> TotLines*?GridLineH + ?BarH + ?LabelH
- end,
- Win = gs:create(window, S,
- [{title, "Erlang Top"},
- {map, true}, %% While debugging
- {configure, true},
- {width, Width}, {height, WinH}]),
- Bar = gs:create(menubar, Win, []),
-
- FileButt = gs:create(menubutton, Bar, [{label,{text, " File "}}]),
- OptionsButt = gs:create(menubutton, Bar, [{label,{text, " Options "}}]),
- File = gs:create(menu, FileButt, []),
- Options = gs:create(menu, OptionsButt, []),
- gse:named_menuitem(refresh, File,
- [{label,{text," Refresh "}}]),
- gse:named_menuitem(dump, File,
- [{label,{text," Dump to file "}}]),
- gse:named_menuitem(exit, File,
- [{label,{text," Exit "}}]),
-
- gse:named_menuitem(accum, Options,
- [{label,{text, " Accumulate "}},
- {itemtype, check}]),
- gse:named_menuitem(intv, Options,
- [{label,{text, " Update Interval "}}]),
- gse:named_menuitem(lines, Options,
- [{label,{text, " Number of Lines "}}]),
- Sort = gse:named_menuitem(sort, Options,
- [{label,{text, " Sort "}},
- {itemtype,cascade}]),
- SortMenu = gse:create(menu, Sort, []),
- gse:named_menuitem(runtime, SortMenu,
- [{label,{text, " Time "}},
- {itemtype,radio},{group,gr1}]),
- gse:named_menuitem(memory, SortMenu,
- [{label,{text, " Memory "}},
- {itemtype,radio},{group,gr1}]),
- gse:named_menuitem(reductions, SortMenu,
- [{label,{text, " Reductions "}},
- {itemtype,radio},{group,gr1}]),
- gse:named_menuitem(msg_q, SortMenu,
- [{label,{text, " Message Queue "}},
- {itemtype,radio},{group,gr1}]),
-
- SysInfo = gs:create(label,Win,[{x, 0}, {y, ?BarH},{align,sw},
- {width, Width},{height,?LabelH}]),
-
- {GridH,VScroll} = calc_grid_h(WinH,TotLines),
- Grid = gse:grid(Win,
- [{x, 0}, {y, ?BarH+?LabelH},
- {width, Width},
- {height, GridH},
- {hscroll, false},
- {vscroll, VScroll},
- {columnwidths, calc_column_w(Width)},
- {rows, {1, TotLines}},
- {font,?Normal}]),
-
- %% Header line
- GL1 = gse:gridline(Grid, [{{text, 1}, "PID"},
- {{text, 2}, "Name or Initial Function"},
- {{text, ?TimeCol}, "Time(us)"},
- {{text, ?RedsCol}, "Reds"},
- {{text, ?MemCol}, "Memory"},
- {{text, ?MsgQCol}, "MsgQ"},
- {{text, 7}, "Current Function"},
- {bg, lightblue},
- {row, 1},
- {click, true}]),
-
- config_sort(GL1,getopt(sort,Config)),
- Info = do_update(Grid, SysInfo, Config),
-
- get_event(Info, Win, Grid, GL1, SysInfo, Config).
-
-calc_column_w(W) ->
- %% W = [2x, 3x, 1x, 1x, 1x, 1x, 3x] = 12x
- RW = W-9, % just to make nice small margins on each side of grid
- X = RW div 12,
- [2*X, 3*X, X, X, X, X, 3*X + (RW - 12*X)].
-
-config_sort(GL1,Sort) ->
- gs:config(Sort,[{select,true}]),
- lists:foreach(fun(S) ->
- gs:config(GL1,[{{font,S},?Normal}])
- end,
- [?TimeCol,?MemCol,?RedsCol,?MsgQCol]),
- case Sort of
- runtime -> gs:config(GL1,{{font,?TimeCol},?Bold});
- memory -> gs:config(GL1,{{font,?MemCol},?Bold});
- reductions -> gs:config(GL1,{{font,?RedsCol},?Bold});
- msg_q -> gs:config(GL1,{{font,?MsgQCol},?Bold})
- end.
-
-config_lines(Win,Grid,TotLines) ->
- OldGridH = gs:read(Grid,height),
- NewLinesH = TotLines*?GridLineH,
- if NewLinesH =< OldGridH ->
- gs:config(Win,[{height,NewLinesH+?BarH+?LabelH}]),
- gs:config(Grid,[{rows,{1,TotLines}},
- {height,NewLinesH},
- {vscroll,false}]);
- true ->
- gs:config(Grid,[{rows,{1,TotLines}},{vscroll,right}])
- end.
-
-calc_grid_h(WinH,TotLines) ->
- LeftInWin = WinH - ?BarH - ?LabelH,
- TotGrid = TotLines * ?GridLineH,
- if LeftInWin >= TotGrid ->
- {TotGrid,false};
- true ->
- {LeftInWin,right}
- end.
-
-set_win_h(Win,OrigH,TotLines) ->
- TotH = TotLines*?GridLineH + ?BarH + ?LabelH,
- if TotH >= OrigH -> OrigH;
- true -> gs:config(Win,[{height,TotH}]),
- TotH
- end.
-
-get_event(Info, Win, Grid, GL1, SysInfo, Config) ->
- receive
- {gs, Win, configure,[],[W,H,_,_]} ->
- TotLines = getopt(lines,Config)+1,
- %% Will not make window higher than total number of lines
- RealWinH = set_win_h(Win,H,TotLines),
- {GridH,VScroll} = calc_grid_h(RealWinH,TotLines),
- gs:config(Grid, [{width, W},
- {columnwidths, calc_column_w(W)},
- {height,GridH}, {vscroll,VScroll}]),
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs, refresh, _, _, _} ->
- Info1 = do_update(Grid, SysInfo, Config),
- get_event(Info1, Win, Grid, GL1, SysInfo, Config);
- {gs, dump, _, _, _} ->
- case pop(Win,dump) of
- {ok,File} -> etop:dump(File);
- {error,cancel} -> ok
- end,
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs, Win, destroy, _, _} ->
- normal;
- {gs, exit, _, _, _} ->
- ok;
- {gs, accum, _, _, _} ->
- Old = getopt(accum,Config),
- etop:config(accumulate,not Old),
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs,intv,_,_,_} ->
- case pop(Win,interval) of
- {ok,Intv} -> etop:config(interval,list_to_integer(Intv));
- {error,cancel} -> ok
- end,
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs,lines,_,_,_} ->
- case pop(Win,lines) of
- {ok,Lines} -> etop:config(lines,list_to_integer(Lines));
- {error,cancel} -> ok
- end,
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs,Sort,_,_,_} when Sort=:=runtime;
- Sort=:=memory;
- Sort=:=reductions;
- Sort=:=msg_q ->
- etop:config(sort,Sort),
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {gs,GL1,click,_,[Col,1,_]} ->
- case Col of
- ?TimeCol -> etop:config(sort, runtime);
- ?MemCol -> etop:config(sort, memory);
- ?RedsCol -> etop:config(sort, reductions);
- ?MsgQCol -> etop:config(sort, msg_q);
- _other -> ignore
- end,
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- {config,{Key,Value},Config1} ->
- case Key of
- lines -> config_lines(Win,Grid,Value+1);
- sort -> config_sort(GL1,Value);
- accumulate -> gs:config(accum,[{select,Value}]);
- _ -> ok
- end,
- Info1 = do_update(Grid, SysInfo, Config1),
- get_event(Info1, Win, Grid, GL1, SysInfo, Config1);
- {dump,Fd} ->
- etop_txt:do_update(Fd,Info,Config),
- get_event(Info, Win, Grid, GL1, SysInfo, Config);
- Msg ->
- io:format("~p got unexpected msg ~p~n", [?MODULE, Msg]),
- get_event(Info, Win, Grid, GL1, SysInfo, Config)
- after getopt(intv,Config) ->
- Info1 = do_update(Grid, SysInfo, Config),
- get_event(Info1, Win, Grid, GL1, SysInfo, Config)
- end.
-
-do_update(Grid, SysInfo, Config) ->
- Info = etop:update(Config),
- Lines = makegridlines(Info#etop_info.procinfo, Grid, 2),
- clear_lines(Lines, getopt(lines,Config) + 1, Grid),
- makesysinfo(getopt(node,Config),Info,SysInfo),
- Info.
-
-%clear_lines(From, To, _Grid) when From > To -> ok;
-clear_lines(From, To, Grid) ->
- case gs:read(Grid, {obj_at_row, From}) of
- undefined ->
- ok;
- GridLine ->
- gs:destroy(GridLine),
- clear_lines(From + 1, To, Grid)
- end.
-
-formatmfa({M, F, A}) ->
- io_lib:format("~w:~w/~w",[M, F, A]);
-formatmfa(Other) ->
- %% E.g. when running hipe - the current_function for some
- %% processes will be 'undefined'
- io_lib:format("~w",[Other]).
-
-
-makegridlines([#etop_proc_info{pid=Pid,
- mem=Mem,
- reds=Reds,
- name=Name,
- runtime=Time,
- cf=MFA,
- mq=MQ}
- |T], Grid, Count) ->
- update_gl(Grid, Count, [{{text, 1}, pid_to_list(Pid)},
- {{text, 2}, to_list(Name)},
- {{text, ?TimeCol},
- if is_integer(Time)->integer_to_list(Time);
- true -> Time
- end},
- {{text, ?RedsCol}, integer_to_list(Reds)},
- {{text, ?MemCol}, integer_to_list(Mem)},
- {{text, ?MsgQCol}, integer_to_list(MQ)},
- {{text, 7}, formatmfa(MFA)},
- {row, Count}, {click, false}]),
- makegridlines(T, Grid, Count + 1);
-makegridlines([],_Grid,Count) ->
- Count.
-
-update_gl(Grid, Row, GL) ->
- case gs:read(Grid, {obj_at_row, Row}) of
- undefined ->
- gse:gridline(Grid,[{row, Row}|GL]);
- GridLine ->
- gs:config(GridLine,GL)
- end.
-
-to_list(Name) when is_atom(Name) -> atom_to_list(Name);
-to_list({_M,_F,_A}=MFA) -> formatmfa(MFA).
-
-
-makesysinfo(Node,Info,SysInfo) ->
- {Cpu,NProcs,RQ,Clock} = loadinfo(Info),
- case Info#etop_info.memi of
- undefined ->
- Str = "No memory information is available.";
- Memi ->
- [Tot,Procs,Atom,Bin,Code,Ets] =
- meminfo(Memi, [total,processes,atom,binary,code,ets]),
- Str = io_lib:fwrite(?SYSFORM,
- [Node,Clock,
- Cpu,Tot,Bin,
- NProcs,Procs,Code,
- RQ,Atom,Ets])
- end,
- gs:config(SysInfo,[{label,{text,Str}},{font,?Normal}]).
-
-
-pop(Win,Key) ->
- Pop = gs:create(window,Win,[{title,"Config"},
- {width,160},{height,100}]),
- gs:create(label,Pop,[{label,{text,txt(Key)}},
- {width,160}]),
- gs:create(entry,entry,Pop,[{x,10},{y,30},{width,130},
- {keypress,true}]),
- gs:create(button,ok,Pop,[{width,45},{y,60},{x,10},
- {label,{text,"Ok"}}]),
- gs:create(button,cancel,Pop,[{width,60},{y,60},{x,80},
- {label,{text,"Cancel"}}]),
- gs:config(Pop,{map,true}),
- pop_loop(Pop).
-
-pop_loop(Pop) ->
- receive
- {gs,entry,keypress,_,['Return'|_]} ->
- Str = gs:read(entry,text),
- gs:destroy(Pop),
- {ok,Str};
- {gs,entry,keypress,_,_} -> % all other keypresses
- pop_loop(Pop);
- {gs,ok,click,_,_} ->
- Str = gs:read(entry,text),
- gs:destroy(Pop),
- {ok,Str};
- {gs,cancel,click,_,_} ->
- gs:destroy(Pop),
- {error,cancel};
- X ->
- io:format("Got X=~w~n",[X]),
- pop_loop(Pop)
- end.
-
-txt(interval) -> "Enter new interval:";
-txt(lines) -> "Enter number of lines:";
-txt(dump) -> "Enter file name:".
diff --git a/lib/observer/src/etop_tr.erl b/lib/observer/src/etop_tr.erl
index dd326fe639..e6c69e4e1e 100644
--- a/lib/observer/src/etop_tr.erl
+++ b/lib/observer/src/etop_tr.erl
@@ -59,7 +59,7 @@ reader(Config) ->
Port = getopt(port, Config),
{ok, Sock} = gen_tcp:connect(Host, Port, [{active, false}]),
- spawn_link(fun() -> reader_init(Sock,getopt(store,Config),nopid) end).
+ spawn_link(fun() -> reader_init(Sock,getopt(store,Config),[]) end).
%%%%%%%%%%%%%% Socket reader %%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -73,24 +73,30 @@ reader(Sock, Store, Last) ->
New = handle_data(Last, Data, Store),
reader(Sock, Store, New).
-handle_data(_, {_, Pid, in, _, Time}, _) ->
- {Pid,Time};
-handle_data({Pid,Time1}, {_, Pid, out, _, Time2}, Store) ->
- Elapsed = elapsed(Time1, Time2),
- case ets:member(Store,Pid) of
- true -> ets:update_counter(Store, Pid, Elapsed);
- false -> ets:insert(Store,{Pid,Elapsed})
- end,
- nopid;
+handle_data(Last, {_, Pid, in, _, Time}, _) ->
+ [{Pid,Time}|Last];
+handle_data([], {_, _, out, _, _}, _Store) ->
+ %% ignore - there was probably just a 'drop'
+ [];
+handle_data(Last, {_, Pid, out, _, Time2} = G, Store) ->
+ case lists:keytake(Pid, 1, Last) of
+ {_, {_, Time1}, New} ->
+ Elapsed = elapsed(Time1, Time2),
+ case ets:member(Store,Pid) of
+ true -> ets:update_counter(Store, Pid, Elapsed);
+ false -> ets:insert(Store,{Pid,Elapsed})
+ end,
+ New;
+ false ->
+ io:format("Erlang top got garbage ~p~n", [G]),
+ Last
+ end;
handle_data(_W, {drop, D}, _) -> %% Error case we are missing data here!
io:format("Erlang top dropped data ~p~n", [D]),
- nopid;
-handle_data(nopid, {_, _, out, _, _}, _Store) ->
- %% ignore - there was probably just a 'drop'
- nopid;
-handle_data(_, G, _) ->
+ [];
+handle_data(Last, G, _) ->
io:format("Erlang top got garbage ~p~n", [G]),
- nopid.
+ Last.
elapsed({Me1, S1, Mi1}, {Me2, S2, Mi2}) ->
Me = (Me2 - Me1) * 1000000,
diff --git a/lib/observer/src/etop_txt.erl b/lib/observer/src/etop_txt.erl
index d0612f15b4..f048ff17ca 100644
--- a/lib/observer/src/etop_txt.erl
+++ b/lib/observer/src/etop_txt.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2002-2009. All Rights Reserved.
+%% Copyright Ericsson AB 2002-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -27,7 +27,6 @@
-include("etop_defs.hrl").
-import(etop,[loadinfo/1,meminfo/2]).
--import(etop_gui,[formatmfa/1,to_list/1]).
-define(PROCFORM,"~-15w~-20s~8w~8w~8w~8w ~-20s~n").
@@ -99,3 +98,13 @@ writepinfo(Fd,[#etop_proc_info{pid=Pid,
writepinfo(_Fd,[]) ->
ok.
+
+formatmfa({M, F, A}) ->
+ io_lib:format("~w:~w/~w",[M, F, A]);
+formatmfa(Other) ->
+ %% E.g. when running hipe - the current_function for some
+ %% processes will be 'undefined'
+ io_lib:format("~w",[Other]).
+
+to_list(Name) when is_atom(Name) -> atom_to_list(Name);
+to_list({_M,_F,_A}=MFA) -> formatmfa(MFA).
diff --git a/lib/observer/src/observer.app.src b/lib/observer/src/observer.app.src
index ef979681ac..f14f0ee849 100644
--- a/lib/observer/src/observer.app.src
+++ b/lib/observer/src/observer.app.src
@@ -41,7 +41,6 @@
cdv_virtual_list_wx,
cdv_wx,
etop,
- etop_gui,
etop_tr,
etop_txt,
observer,
diff --git a/lib/odbc/c_src/odbcserver.c b/lib/odbc/c_src/odbcserver.c
index 8de81a30ae..b4655ce373 100644
--- a/lib/odbc/c_src/odbcserver.c
+++ b/lib/odbc/c_src/odbcserver.c
@@ -98,6 +98,7 @@
/* ----------------------------- INCLUDES ------------------------------*/
+#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
diff --git a/lib/odbc/configure.in b/lib/odbc/configure.in
index 531ad84fb9..f86146759c 100644
--- a/lib/odbc/configure.in
+++ b/lib/odbc/configure.in
@@ -1,7 +1,7 @@
dnl
dnl %CopyrightBegin%
dnl
-dnl Copyright Ericsson AB 2005-2013. All Rights Reserved.
+dnl Copyright Ericsson AB 2005-2014. All Rights Reserved.
dnl
dnl The contents of this file are subject to the Erlang Public License,
dnl Version 1.1, (the "License"); you may not use this file except in
@@ -105,7 +105,12 @@ AC_CHECK_FUNC(gethostbyname, , AC_CHECK_LIB(nsl, main, [LIBS="$LIBS -lnsl"]))
dnl Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([fcntl.h netdb.h stdlib.h string.h sys/socket.h winsock2.h])
-AC_CHECK_HEADERS([sql.h, sqlext.h], [odbc_required_headers=yes], [odbc_required_headers=no])
+AC_CHECK_HEADERS([windows.h])
+AC_CHECK_HEADERS([sql.h sqlext.h], [odbc_required_headers=yes], [odbc_required_headers=no],
+[[#ifdef HAVE_WINDOWS_H
+ # include <windows.h>
+ #endif
+ ]])
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
@@ -131,7 +136,7 @@ AC_SUBST(THR_LIBS)
odbc_lib_link_success=no
AC_SUBST(TARGET_FLAGS)
case $host_os in
- darwin*)
+ darwin1[[0-2]].*|darwin[[0-9]].*)
TARGET_FLAGS="-DUNIX"
if test ! -d "$with_odbc" || test "$with_odbc" = "yes"; then
ODBC_LIB= -L"/usr/lib"
diff --git a/lib/odbc/doc/src/notes.xml b/lib/odbc/doc/src/notes.xml
index 2551637001..b254ca3bc9 100644
--- a/lib/odbc/doc/src/notes.xml
+++ b/lib/odbc/doc/src/notes.xml
@@ -31,7 +31,23 @@
<p>This document describes the changes made to the odbc application.
</p>
- <section><title>ODBC 2.10.18</title>
+ <section><title>ODBC 2.10.19</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Updated configure test for header files sql.h and
+ sqlext.h to function correctly on windows.</p>
+ <p>
+ Own Id: OTP-11574</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>ODBC 2.10.18</title>
<section><title>Improvements and New Features</title>
<list>
diff --git a/lib/odbc/vsn.mk b/lib/odbc/vsn.mk
index 6ac83a7718..d9e2ab26a9 100644
--- a/lib/odbc/vsn.mk
+++ b/lib/odbc/vsn.mk
@@ -1 +1 @@
-ODBC_VSN = 2.10.18
+ODBC_VSN = 2.10.19
diff --git a/lib/pman/AUTHORS b/lib/pman/AUTHORS
deleted file mode 100644
index 5a354526b4..0000000000
--- a/lib/pman/AUTHORS
+++ /dev/null
@@ -1,9 +0,0 @@
-pman was first implemented for the old X windows interface "pxw" by
-Claes Wikstr�m and has since then been rewritten a couple of times by
-among others Peter Olin.
-
-Original Authors and Contributors:
-
-Claes Wikstr�m
-Peter Olin
-Gunilla Arendt \ No newline at end of file
diff --git a/lib/pman/Makefile b/lib/pman/Makefile
deleted file mode 100644
index 3600504d07..0000000000
--- a/lib/pman/Makefile
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2009. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-SUB_DIRECTORIES = src priv doc/src
-
-SPECIAL_TARGETS =
-
-# ----------------------------------------------------
-# Default Subdir Targets
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_subdir.mk
-
diff --git a/lib/pman/doc/html/.gitignore b/lib/pman/doc/html/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/pman/doc/html/.gitignore
+++ /dev/null
diff --git a/lib/pman/doc/man3/.gitignore b/lib/pman/doc/man3/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/pman/doc/man3/.gitignore
+++ /dev/null
diff --git a/lib/pman/doc/pdf/.gitignore b/lib/pman/doc/pdf/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/pman/doc/pdf/.gitignore
+++ /dev/null
diff --git a/lib/pman/doc/src/Makefile b/lib/pman/doc/src/Makefile
deleted file mode 100644
index d9e0317f05..0000000000
--- a/lib/pman/doc/src/Makefile
+++ /dev/null
@@ -1,116 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../../vsn.mk
-VSN=$(PMAN_VSN)
-APPLICATION=pman
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
-
-# ----------------------------------------------------
-# Target Specs
-# ----------------------------------------------------
-XML_APPLICATION_FILES = ref_man.xml
-XML_REF3_FILES = pman.xml
-
-XML_PART_FILES = part.xml part_notes.xml
-XML_CHAPTER_FILES = pman_chapter.xml notes.xml
-
-BOOK_FILES = book.xml
-
-XML_FILES = \
- $(BOOK_FILES) $(XML_CHAPTER_FILES) \
- $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES)
-
-GIF_FILES = \
- main_window.gif \
- trace.gif \
- options.gif
-
-# ----------------------------------------------------
-
-HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
-
-INFO_FILE = ../../info
-
-MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
-
-HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
-
-TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
-
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-XML_FLAGS +=
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-$(HTMLDIR)/%.gif: %.gif
- $(INSTALL_DATA) $< $@
-
-docs: pdf html man
-
-$(TOP_PDF_FILE): $(XML_FILES)
-
-pdf: $(TOP_PDF_FILE)
-
-html: gifs $(HTML_REF_MAN_FILE)
-
-man: $(MAN3_FILES)
-
-gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
-
-debug opt:
-
-clean clean_docs:
- rm -rf $(HTMLDIR)/*
- rm -f $(MAN3DIR)/*
- rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
- rm -f errs core *~
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_docs_spec: docs
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DATA) $(TOP_PDF_FILE) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(HTMLDIR)/* \
- "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(INFO_FILE) "$(RELSYSDIR)"
- $(INSTALL_DIR) "$(RELEASE_PATH)/man/man3"
- $(INSTALL_DATA) $(MAN3DIR)/* "$(RELEASE_PATH)/man/man3"
-
-
-release_spec:
diff --git a/lib/pman/doc/src/book.xml b/lib/pman/doc/src/book.xml
deleted file mode 100644
index 809015016b..0000000000
--- a/lib/pman/doc/src/book.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE book SYSTEM "book.dtd">
-
-<book xmlns:xi="http://www.w3.org/2001/XInclude">
- <header titlestyle="normal">
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <pagetext>Pman</pagetext>
- <preamble>
- </preamble>
- <parts lift="no">
- <xi:include href="part.xml"/>
- </parts>
- <applications>
- <xi:include href="ref_man.xml"/>
- </applications>
- <releasenotes>
- <xi:include href="notes.xml"/>
- </releasenotes>
-</book>
-
diff --git a/lib/pman/doc/src/fascicules.xml b/lib/pman/doc/src/fascicules.xml
deleted file mode 100644
index 37feca543f..0000000000
--- a/lib/pman/doc/src/fascicules.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
-
-<fascicules>
- <fascicule file="part" href="part_frame.html" entry="no">
- User's Guide
- </fascicule>
- <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
- Reference Manual
- </fascicule>
- <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
- Release Notes
- </fascicule>
- <fascicule file="" href="../../../../doc/print.html" entry="no">
- Off-Print
- </fascicule>
-</fascicules>
-
diff --git a/lib/pman/doc/src/main_window.gif b/lib/pman/doc/src/main_window.gif
deleted file mode 100644
index e12754631c..0000000000
--- a/lib/pman/doc/src/main_window.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/doc/src/main_window.ps b/lib/pman/doc/src/main_window.ps
deleted file mode 100644
index c66620c677..0000000000
--- a/lib/pman/doc/src/main_window.ps
+++ /dev/null
@@ -1,1573 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./main_window.tmp.eps)
-%%CreationDate: (Tue Jun 12 18:03:36 2001)
-%%BoundingBox: 0 22 377 234
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 22 377 234
-userdict begin
-%%BeginData:
-DisplayImage
-0 22
-377.000000 212.000000
-12
-757 426
-1
-0
-0
-16
-ffffff
-000000
-b24d7a
-dcadc2
-57253b
-0000ff
-d9d9d9
-c3c3c3
-bebebe
-828282
-000000
-000000
-000000
-000000
-000000
-000000
-03ff03ff03ff0311040003ff03ff03b70400031c04000301021a0400030002ff02ff02b6
-04000300021a04010301021a0400030002ff02ff02b604000300021a04010301021a0400
-030002ff02ff02b604000300021a0401030102020418030004ff04ff04b7030004170202
-040103010202040003ff03ff03e902020401030102020400030002150400030002ff02ff
-029e04000300021504000300021504000300020204010301020204000300021504000300
-02ff02ff029e040003000215040003000215040003000202040103010202040003000215
-0400030002ff02ff029e0400030002150400030002150400030002020401030102020400
-030002150400030002ff02ff029e040003000215040003000202030f0202040003000202
-0401030102020400030002150400030002ff0272000302ff022704000300021504000300
-02020300020d040002020400030002020401030102020400030002150400030002d10006
-0202000102060001020600010206000102050000020a00050225000102380001021b0004
-020d00010208000102ee0400030002150400030002020300020d04000202040003000202
-0401030102020400030002150400030002d1000102020002020100020204000202050002
-0206000202040000020900010203000102240001023800010219000102040000020c0001
-0208000102ee0400030002150400030002020300020d0400020204000300020204010301
-02020400030002150400030002d100010203000102010002020400020205000002000001
-02050002020400000208000102050001025e00010218000002070000020b000102f90400
-030002150400030002020300020d04000202040003000202040103010202040003000215
-0400030002d1000102030001020100000200000002030003020500000200000102050000
-020000010203000002030001020100010207000302040000020300030203000102000003
-020400000201000102040003020100010203000002030001020700040202000102000003
-020800040202000402040004020300000203000302010000020300040201000102000003
-020300010201000102040000020200040203000402d30400030002150400030002020300
-020d04000202040003000202040103010202040003000202030f02020400030002d10001
-020300010201000002000001020200000200000102040001020000010205000002000002
-020200000203000102010001020700010200000002040000020200010201000102020002
-020200000204000002010001020300010201000102000001020200020202000002070001
-020200010201000202020001020800010203000102020001020200010202000102020000
-020100010202000002010000020200010205000202020001020200010202000002040000
-02020000020200010201000102d7040003000208030302080400030002020300020d0400
-02020400030002020401030102020400030002020300020d040002020400030002d10001
-020200010202000002000001020200000200000102040000020200010204000002010001
-020200000207000102070001020000010202000002020001020300010201000102030001
-020200000202000102020001020300010200000002020000020000000202000002060001
-020400010200000102030001020800010202000102040001020000010204000102000000
-020200000202000102010000020100010206000102030001020200010202000102020000
-020700010201000102d704000300020803000201040002080400030002020300020d0400
-02020400030002020401030102020400030002020300020d040002020400030002d10005
-020300000201000102000000020100010203000102020001020400000202000102010000
-020700010207000102000001020200000202000102030001020100010203000102020000
-020200010202000102030001020000010201000002000000020100010206000102040001
-020000010203000102080001020200010204000102000001020400010200000002010000
-020200010202000002010001020600010203000102020001020200010202000002070001
-0201000302d504000300020803000201040002080400030002020300020d040002020400
-030002020401030102020400030002020300040e02020400030002d10001020700000201
-000102000000020100010203000102020002020300000202000202000000020700010207
-000102010000020100010202000702010001020400000201000102020001020200070200
-000102000001020000000201000002070001020400010200000102030001020800010202
-000102040001020000010204000102000000020100000201000202010001020100010206
-000102030001020200010203000002010001020400040203000302d30400030002080300
-040202080400030002020300020d04000202040003000202040103010202040003000215
-0400030002d1000102070000020100010200000002010001020300070203000002030001
-020000000207000102070001020100010200000002030001020700010204000102000000
-020300010202000102070000020000000201000102000000020700010204000102000001
-020300010208000102020001020400010200000102040001020000000201000002010000
-020000000201000002020001020600010203000102020001020300010200000002030002
-020100010205000202d20400030002150400030002020300020d04000202040003000202
-0401030102020400030002150400030002d1000102070000020200010202000102020001
-020400010203000002040002020800010205000102020001020000000203000102070001
-020400010200000002030001020200010207000002000000020200000200000002070001
-020400010200000102030001020800010202000102040001020000010204000102010000
-020000020201000202030001020600010203000102020001020300010200000002030001
-020200010206000102d20400030002150400030002020300020d04000202040003000202
-0401030102020400030002150400030002d1000102070000020200010202000102020000
-020600010202000002040002020300010203000102030001020400010205000102030000
-020100010205000102040001020300010203000002010002020200010209000102020001
-020100010203000102080001020300010202000102020001020200010202000102030000
-020700010202000002010001020300010202000102040001020400010202000102010000
-0203000102d20400030002150400030002020300020d0400020204000300020204010301
-02020400030002150400030002d100010207000002070001020100010206000102020000
-020500010203000102040005020500010207000402010001020500010204000102050004
-0201000102030001020a0004020200010203000102080001020400040204000402050003
-020900040201000102030001020200010204000102050003020000010200000502d30400
-030002150400030002020300020d04000202040003000202040103010202040003000215
-0400030002ff02ff029e0400030002150400030002020300020d04000202040003000202
-0401030102020400030002150400030002ff02ff029e0400030002150400030002020300
-040e02020400030002020401030102020400030002150400030002ff02ff029e04000300
-02150400030002150400030002020401030102020400030002150400030002ff02ff029e
-0400030002150400030002150400030002020401030102020400030002150400030002ff
-02ff029e04000300021504000300021504000300020204010300040403000416030004ff
-04ff049f030004160300041603000404030500ff00ff00e80304040003010202040000ff
-00ff00e70900030002020401030102020400000106ff06ff06e409010300020204010301
-02020400000106ff06ff06e40901030002020401030102020400000106ff06ff06e40901
-030002020401030102020400000106ff06ff06e409010300020204010301020204000001
-06ff06ff06e409010300020204010301020204000001060b01040604010006030102061f
-01000602010006040100062601040633010006020100060c010006ff06ff060201000602
-010006090102061309010300020204010301020204000001060b0100060f0100061f0100
-06020100062e01000635010106010100060c010006ff06ff0602010006020100060b0100
-061309010300020204010301020204000001060b01000606010206050100060301020618
-010006020100060201020603010206020100060201000619010006030100060001010603
-010206030102060301020618010106010100060201020603010106000100060201020603
-010206ff06f501000602010006020102060501000602010006000101060c090103000202
-04010301020204000001060b010006080100060501000602010006020100061801000600
-010006050100060201000602010006010100060201000619010006030101060101000601
-010006020100060101000602010006010100060201000617010006000100060001000601
-01000602010006010100060101010601010006020100060101000602010006ff06f40100
-060201000601010006020100060401000602010106010100060b09010300020204010301
-020204000001060b01030605010006050100060201000602010006180100060001000605
-010006020100060201000601010006000100060001000619010006030100060901000601
-010006050100060201000617010006000100060001000601010006020100060101000602
-010006010100060201000601010006ff06f8010406010100060201000604010006020100
-06020100060b09010300020204010301020204000001060b010006080100060501000602
-010406180100060001000605010006020104060101000600010006000100061901000603
-010006060103060101000605010406170100060101010601010006020100060101000602
-0100060101040602010206ff06f501000602010006010104060401000602010006020100
-060b09010300020204010301020204000001060b0100060801000605010006020100061d
-010006060100060201000605010006000100060001000619010006030100060501000602
-01000601010006050100061b010006010101060101000602010006010100060201000601
-01000609010006ff06f401000602010006010100060801000602010006020100060b0901
-0300020204010301020204000001060b0100060801000605010006020100060201000619
-010006060100060201000602010006010100060001000600010006190100060301000605
-010006020100060101000602010006010100060201000617010006020100060101000602
-010006010100060101010601010006020100060101000602010006ff06f4010006020100
-0601010006020100060401000602010106010100060b0901030002020401030102020400
-0001060b0100060801000605010006030102061a01000606010006030102060301000600
-0100061a0100060301000606010306020102060301020618010006020100060201020603
-010106000100060201020603010206ff06f5010006020100060201020605010006020100
-06000101060c0901030002020401030102020400000106ff06ff06d30100060f09010300
-020204010301020204000001060a0106062a0106062a010606ff06ff06470106060e0100
-060f09010300020204010301020204000001060a0106062a0106062a010606ff06ff0647
-0106060e0100060f0901030002020401030102020400000106ff06ff06e4090103000202
-0401030102020400000106ff06ff06e40901030002020401030102020400000106ff06ff
-06e40901030002020401030102020400000109ff09ff09e6030002020401030102020400
-000009ff09ff09e703000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e803000202040103010202040006ff06ff06e803000202040103010202
-040006ff06ff06e8030002020401030102020400060005ff05ff05d40912030002020401
-030102020400060005000849050108d50501089005010858050108670501085709110000
-030002020401030102020400060005000849050108d50501089005010858050108670501
-085709010706090007060001030002020401030102020400060005000849050108d50501
-089005010858050108670501085709010705000009000706000103000202040103010202
-040006000500080105030805050008060500083405010802050208270500080a05040818
-050008060500087405010801050008020500088905010800050008030500085105010801
-0503080d0500085205010802050208050500084a09010705000009010705000103000202
-0401030102020400060005000801050008020500080c0500083405010801050008020500
-08260500080a0500081c0500087c05010801050108010500088905010800050008030500
-085105010801050008020500080c05000852050108010500080205000850090107040001
-090107050001030002020401030102020400060005000801050008020500080205020803
-050108000500083405010801050008020500080105000802050008010500080005010802
-050008000501080305020802050008000501080205040808050008050500080205000801
-050008000501080305020802050408020502080305020802050008000501086605010801
-050108010500080205020802050108000500080305020875050108000501080105010802
-0502080305010800050008020502083d0501080105000802050008020502080305010800
-050008020502084c050108010500080605020802050408020502083c0901070400010600
-090107040001030002020401030102020400060005000801050008020500080405000802
-050008010501083405010801050008050500080205000801050108010500080105010801
-05000801050008020500080105010801050008030500080a050008050500080205000801
-050108010500080105000802050008030500080605000802050008020500080105010801
-050008650501080105000800050008000500080105000802050008010500080005000800
-050008010500080205000874050108000501080105010801050008020500080105000801
-05010801050008020500083c050108010500080205000801050008020500080105000801
-05010801050008020500084b05010802050008070500080605000801050008020500083b
-090107030001060109010704000103000202040103010202040006000500080105030805
-050008020500080205000834050108010500080505000802050008010500080505000805
-050008020500080105000802050008030500080a05030802050008020500080105000802
-050008010500080705000806050008020500080205000801050008020500086505010801
-050008000500080005000805050008010500080005000800050008010500080205000874
-050108000500080005010800050008010500080505000802050008010500084005010801
-05030802050008020500080105000802050008010500084f050108030501080505000805
-05000802050008020500083b090107030001060209010703000103000202040103010202
-040006000500080105000808050008020500080205000834050108010500080505000802
-0500080105000805050008050504080105000802050008030500080a0500080505000802
-050008010500080205000801050008070500080605000802050008020500080105000802
-050008650501080105000801050108020503080105000800050008000500080105040874
-050108000500080005010800050008020502080205000802050008020502083d05010801
-05000801050008020504080105000802050008020502084c050108050500080405000804
-050008030504083b09010702000106030901070300010300020204010301020204000600
-050008010500080805000802050008020500083405010801050008020500080105000802
-0500080105000805050008050500080505000802050008030500080a0500080505000802
-050008010500080205000801050008070500080605000802050008020500080105000802
-050008650501080105000801050108010500080205000801050008000500080005000801
-050008780501080005000803050008050500080105000802050008050500083c05010801
-05000802050008010500080505000802050008050500084b050108010500080205000804
-05000803050008040500083f090107020001060409010702000103000202040103010202
-040006000500080105000808050008020500080105010834050108010500080205000801
-05000801050108010500080505000805050008020500080105000802050008030500080a
-050008050500080105010801050008020500080105000802050008030500080605000802
-050008020500080105000802050008650501080105000802050008010500080205000801
-050008000500080005000801050008020500087405010800050008030500080105000802
-050008010500080105010801050008020500083c05010801050008020500080105000802
-050008010500080105010801050008020500084b05010801050008020500080405000802
-05000805050008020500083b090107010001060509010702000103000202040103010202
-040006000500080105000808050008030501080005000834050108020502080305010800
-050008010500080505000806050208020500080205000804050108080500080605010800
-050008010500080205000802050208050501080405000803050208020500080205000865
-050108010500080205000802050308010500080005000800050008020502087505010800
-05000803050008020502080305010800050008020502083d050108010500080205000802
-0502080305010800050008020502084c050108020502080505000802050408020502083c
-0901070100010606090107010001030002020401030102020400060005000849050108d5
-050108900501081305000843050108670501085709010700000106070901070100010300
-02020401030102020400060005000849050108d5050108900501080f0500080205000843
-050108670501085709010700000106080901070000010300020204010301020204000600
-05000849050108d5050108900501081005020844050108670501085709010001090b0700
-0001030002020401030102020400060005000849050108d5050108900501085805010867
-0501085709010000090d0001030002020401030102020400060005000849050108d50501
-08900501085805010867050108570901070e000103000202040103010202040006000500
-0849050108d5050108900501085805010867050108570901001003000202040103010202
-0400060005000849050108d5050108900501085805010867050108570901000d09000001
-030002020401030102020400060005ff05ff05d409010001060a09010001030002020401
-030102020400060001ff01ff01d409010001060a09010001030002020401030102020400
-060001000849010108d50101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-085709010001060a09010001030002020401030102020400060001000805010008230100
-081d010108440100088f0101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000804010008040101080b0101080b010108020100
-081c010108040100080c010008040100080b0102081b010008030100088a010108040100
-080c01000804010008760101080301010852010108020102080301020806010008520101
-080201020803010208020104084209010001060a09010001030002020401030102020400
-060001000803010008040100080101000809010008010100080901000801010008020100
-081b010108180100080d0100081a010008030101088a0101081801000876010108020100
-080101000851010108010100080201000801010008020100080401010852010108010100
-0802010008010100080201000801010008020100084209010001060a0901000103000202
-040103010202040006000100080201000805010008010100080901000801010008090100
-0801010008030100081a0101080201020802010008000101080301020802010408030101
-0805010008030102080301020802010008000101080501000802010008000100088a0101
-080201020802010008000101080301020802010408740101080201000801010008510101
-080101000802010008010100080701000800010008520101080101000805010008020100
-08050100084209010001060a090100010300020204010301020204000600010008010100
-080601000801010008090100080101000809010008010100080401000819010108040100
-080201010801010008040100080401000805010108050100080201000802010008010100
-0802010008010101080101000803010008050100088a0101080401000802010108010100
-080401000804010008760101080201000801010008510101080101000802010008010100
-08060100080101000852010108010100080501000802010008040100084309010001060a
-090100010300020204010301020204000600010008000100080701000801010008090100
-080101000809010008010100080501000818010108040100080201000802010008040100
-08040100080d010008020100080201000801010008020100080101000802010008030100
-08050100088a010108040100080201000802010008040100080401000876010108020100
-080101000851010108020103080101030802010008020100085201010801010308030103
-08040100084309010001060a090100010300020204010301020204000600010008010100
-080601000801010008090100080101000809010008010100080401000819010108040100
-08020100080201000804010008040100080d010008020100080201000801010008020100
-08010100080201000802010008060100088a010108040100080201000802010008040100
-080401000876010108020100080101000851010108050100080101000802010008010100
-080201000852010108010100080201000805010008040100084309010001060a09010001
-030002020401030102020400060001000802010008050100080101000809010008010100
-080901000801010008030100081a01010804010008020100080201000804010008040100
-080d01000802010008020100080101000802010008010100080201000802010008060100
-088a01010804010008020100080201000804010008040100087601010802010008010100
-085101010805010008010100080201000801010508510101080101000802010008050100
-08030100084409010001060a090100010300020204010301020204000600010008030100
-080401000801010008030101080301000801010008030101080301000801010008020100
-081b01010804010008020100080201000804010008040100080501010805010008020100
-08020100080101000802010008010101080101000801010008070100088a010108040100
-080201000802010008040100080401000876010108020100080101000851010108010100
-080201000801010008020100080501000852010108010100080201000801010008020100
-08030100084409010001060a090100010300020204010301020204000600010008040100
-080401010804010108040101080401010804010108020100081c01010804010008020100
-080201000804010008050101080301010805010008030102080301020802010008000101
-080201000805010408880101080401000802010008020100080401000805010108740101
-080301010852010108020102080301020806010008520101080201020803010208040100
-084409010001060a09010001030002020401030102020400060001000805010008230100
-081d010108390100089a0101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000849010108390100089a01010890010108580101
-08670101085709010001060a090100010300020204010301020204000600010008490101
-08390100089a0101089001010858010108670101085709010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000849010108d5010108900101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-0849010108d50101089001010858010108670101085709010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001ff01ff01d409010001060a0901
-0001030002020401030102020400060001ff01ff01d409010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000849010108d5010108900101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-0805010008230100081d0101089101000842010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000804010008040101080a0102
-080b010108020100081c010108100102081a0100081101020814010008170102081b0100
-08010104083b010108100102081a01000811010208140100083501010803010108520101
-08020102080301020803010208030102084c010108030100080401020803010208060100
-083b09010001060a09010001030002020401030102020400060001000803010008040100
-080101000808010008020100080901000801010008020100081b010108120100082f0100
-0814010008190100081a010008020100083f010108120100082f01000814010008350101
-080201000801010008510101080101000802010008010100080201000801010008020100
-0801010008020100084b0101080201010803010008020100080101000802010008040101
-083b09010001060a09010001030002020401030102020400060001000802010008050100
-08010100080c0100080901000801010008030100081a0101080201020802010008000101
-0805010008090100080001010802010008000101080301020802010108000100080c0100
-080301020803010208030101080001000802010208020100080001010804010108050100
-080301020803010208020100080001010805010008020100083f01010802010208020100
-080001010805010008090100080001010802010008000101080301020802010108000100
-080c01000803010208030102080301010800010008020102080201000800010108280101
-0802010008010100085101010801010008020100080101000809010008050100084b0101
-08010100080001000803010008050100080201000803010008000100083b09010001060a
-0901000103000202040103010202040006000100080101000806010008010100080c0100
-080901000801010008040100081901010801010008020100080101010801010008040100
-0809010108010100080101010801010008040100080201000800010008000100080b0100
-080201000802010008010100080201000801010008010101080101000802010008010101
-080101000803010108050100080201000802010008010100080201000801010108010100
-0803010008030103083c0101080101000802010008010101080101000804010008090101
-08010100080101010801010008040100080201000800010008000100080b010008020100
-080201000801010008020100080101000801010108010100080201000801010108010100
-082701010802010008010100085101010801010008020100080101000809010008050100
-084b0101080301000803010008050100080201000802010008010100083b09010001060a
-0901000103000202040103010202040006000100080001000807010008010100080b0100
-080a01000801010008050100081801010801010008020100080101000808010008090100
-080201000801010008080100080201000800010008000100080b01000802010008020100
-080501000801010008020100080101000802010008010100080f01000802010008020100
-080101000802010008010100080201000803010008070100083b01010801010008020100
-080101000808010008090100080201000801010008080100080201000800010008000100
-080b01000802010008020100080501000801010008020100080101000802010008010100
-082b010108020100080101000851010108020102080201030805010008050100084c0101
-0803010008030103080301020802010008020100083b09010001060a0901000103000202
-040103010202040006000100080101000806010008010100080a0100080b010008010100
-080401000819010108010104080101000808010008090100080201000801010008080100
-080201000800010008000100080b01000802010008020100080201030801010008020100
-0801010408010100080f0100080201000802010008010100080201000801010008020100
-0802010008080100083b0101080101040801010008080100080901000802010008010100
-08080100080201000800010008000100080b010008020100080201000802010308010100
-080201000801010408010100082b01010802010008010100085101010801010008020100
-08010100080201000803010008050100084d010108030100080301000802010008010100
-080201000801010008020100083b09010001060a09010001030002020401030102020400
-0600010008020100080501000801010008090100080c01000801010008030100081a0101
-080101000805010008080100080901000802010008010100080801000802010008000100
-08000100080b010008020100080201000801010008020100080101000802010008010100
-08050100080f010008020100080201000801010008020100080101000802010008020100
-0804010008020100083b0101080101000805010008080100080901000802010008010100
-08080100080201000800010008000100080b010008020100080201000801010008020100
-08010100080201000801010008050100082b010108020100080101000851010108010100
-0802010008010100080201000802010008050100084e0101080301000803010008020100
-080101000802010008010105083a09010001060a09010001030002020401030102020400
-060001000803010008040100080101000803010108020100080701010803010008010100
-08020100081b010108010100080201000801010008080100080901010801010008010100
-08080100080201000800010008000100080b010008020100080201000801010008020100
-080101000801010108010100080201000801010008070101080501000802010008020100
-08010100080201000801010108010100080101000805010008020100083b010108010100
-080201000801010008080100080901010801010008010100080801000802010008000100
-08000100080b010008020100080201000801010008020100080101000801010108010100
-0802010008010100082b0101080201000801010008510101080101000802010008010100
-080201000801010008050100084f01010803010008030100080201000801010008020100
-08050100083b09010001060a090100010300020204010301020204000600010008040100
-080401010804010108020104080301010804010108020100081c01010802010208020100
-0808010008090100080001010802010008080100080201000800010008000100080b0100
-080301020803010308020101080001000802010208020100080701010805010008030102
-0803010208020100080001010802010008060102083c0101080201020802010008080100
-08090100080001010802010008080100080201000800010008000100080b010008030102
-0803010308020101080001000802010208020100082b0101080301010852010108020102
-080301020802010408010104084b010108010104080201020803010208060100083b0901
-0001060a09010001030002020401030102020400060001000805010008230100081d0101
-08150105080101000819010508470100084d010108150105080101000819010508510101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-08490101081d010008670100084d0101081d010008710101085801010867010108570901
-0001060a090100010300020204010301020204000600010008490101081d010008670100
-084d0101081d0100087101010858010108670101085709010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000849010108d5010108900101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-0849010108d50101089001010858010108670101085709010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001ff01ff01d409010001060a0901
-0001030002020401030102020400060001ff01ff01d409010001060a0901000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000849010108d5010108900101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-0805010008230100081d010108670100086c010108900101085801010867010108570901
-0001060a09010001030002020401030102020400060001000804010008040101080d0100
-080a010108020100081c0101083b0100080b0102081b01000805010008650101082c0102
-086001010803010108520101080301000804010208030102085301010801010408030100
-08040102084309010001060a090100010300020204010301020204000600010008030100
-0804010008010100080b0101080901000801010008020100081b0101083b0100080d0100
-081a01000805010108650101082e01000860010108020100080101000851010108020101
-080301000802010008010100080201000852010108010100080601010803010008020100
-084209010001060a09010001030002020401030102020400060001000802010008050100
-08010100080a010008000100080901000801010008030100081a01010802010108000100
-080201020802010008000101080a01020802010008020100080201020802010008000101
-080201040803010108050100080301020803010208020100080001010805010008040100
-080001000865010108020102080201000800010108020100080001010803010208020100
-08000101080c010008030102080301010800010008020101080001000802010208020100
-08000101083d010108020100080101000851010108010100080001000803010008090100
-085201010801010008050100080001000803010008020100084209010001060a09010001
-030002020401030102020400060001000801010008060100080101000809010008010100
-080901000801010008040100081901010801010008010101080101000802010008010101
-080101000808010008020100080101000802010008010100080201000801010108010100
-080301000805010108050100080201000802010008010100080201000801010108010100
-080301000804010008010100086501010801010008020100080101010801010008010101
-0801010008010100080201000801010108010100080b0100080201000802010008010100
-08010101080101000801010108010100080201000801010108010100083c010108020100
-080101000851010108030100080301000809010008520101080101030804010008030100
-08020100084209010001060a090100010300020204010301020204000600010008000100
-080701000801010008080100080201000809010008010100080501000818010108010100
-080201000801010008020100080101000802010008080100080201000801010008020100
-0801010008020100080101000802010008030100080d0100080201000802010008010100
-080201000801010008020100080301000803010008020100086501010801010008020100
-0801010008050100080501000802010008010100080f0100080201000802010008010100
-080201000801010008020100080101000802010008010100084001010802010008010100
-085101010803010008030103080501000853010108050100080301000804010308420901
-0001060a0901000103000202040103010202040006000100080101000806010008010100
-080801000802010008090100080101000804010008190101080101000802010008010104
-080101000802010008080104080201000800010008020104080101000802010008030100
-080d01000802010008020100080101000802010008010100080201000802010008040100
-0802010008650101080101040801010008050100080501000802010008010100080f0100
-080201000802010008010100080201000801010008020100080101040801010008400101
-080201000801010008510101080301000803010008020100080301000854010108050100
-0803010008070100084209010001060a0901000103000202040103010202040006000100
-08020100080501000801010008080105080801000801010008030100081a010108010100
-080201000801010008050100080201000808010008060100080001000802010008050100
-0802010008030100080d0100080201000802010008010100080201000801010008020100
-080201000804010508640101080101000805010008050100080501000802010008010100
-080f01000802010008020100080101000802010008010100080201000801010008050100
-084001010802010008010100085101010803010008030100080201000802010008550101
-08010100080201000803010008070100084209010001060a090100010300020204010301
-020204000600010008030100080401000801010008030101080601000803010108030100
-0801010008020100081b0101080101000801010108010100080201000801010008020100
-080801000802010008030100080301000802010008010100080201000803010008050101
-080501000802010008020100080101000802010008010101080101000801010008090100
-0865010108010100080201000801010008050100080501000802010008010100080f0100
-080201000802010008010100080101010801010008010101080101000802010008010100
-084001010802010008010100085101010803010008030100080201000801010008560101
-0801010008020100080301000803010008020100084209010001060a0901000103000202
-040103010202040006000100080401000804010108040101080601000803010108040101
-08020100081c010108020101080001000802010208020100080201000809010208040100
-080401020802010008020100080401010803010108050100080301020803010208020100
-080001010802010008090100086501010802010208020100080501000806010208020100
-080f01000803010208030101080001000802010108000100080201020802010008400101
-080301010852010108010104080201020802010408520101080201020802010408020102
-084309010001060a09010001030002020401030102020400060001000805010008230100
-081d010108050100080e01050840010008770101082301050813010008050100084a0101
-0858010108670101085709010001060a0901000103000202040103010202040006000100
-084901010801010008020100085501000877010108390100080201000801010008020100
-084a01010858010108670101085709010001060a09010001030002020401030102020400
-0600010008490101080201020856010008770101083a010208030102084b010108580101
-08670101085709010001060a090100010300020204010301020204000600010008490101
-08d50101089001010858010108670101085709010001060a090100010300020204010301
-02020400060001000849010108d50101089001010858010108670101085709010001060a
-09010001030002020401030102020400060001000849010108d501010890010108580101
-08670101085709010001060a090100010300020204010301020204000600010008490101
-08d50101089001010858010108670101085709010001060a090100010300020204010301
-02020400060001ff01ff01d409010001060a090100010300020204010301020204000600
-00ff00ff00d409010001060a090100010300020204010301020204000600000008490001
-08d50001089000010858000108670001085709010001060a090100010300020204010301
-02020400060000000849000108d50001089000010858000108670001085709010001060a
-09010001030002020401030102020400060000000805000008230000081d0001086e0000
-08650001089000010858000108670001085709010001060a090100010300020204010301
-0202040006000000080400000804000108090004080a000108020000081c0001084f0002
-081b000008020002085f000108170002080500000812000008060000082e000008120002
-080300020805000108030001085200010805000008020002080400010853000108030000
-080400020803000208060000083b09010001060a09010001030002020401030102020400
-0600000008030000080400000801000008080000080d00000801000008020000081b0001
-08510000081a00000802000008020000085e000108190000081900000836000008140000
-080500000805000108020000080100000851000108040001080100000802000008020000
-0801000008520001080200010803000008020000080100000802000008040001083b0901
-0001060a0901000103000202040103010202040006000000080200000805000008010000
-08080000080d00000801000008030000081a000108020001080000000802000208020000
-08000001080a000208030002080200000800000108020000080200000802000208020000
-080000010804000108050000080300020803000208020000080000010805000008020000
-086200010802000208020000080000010802000008000001080500000803000208030002
-080300020802000408020002080300020802000008000001080a00020803000208020000
-080000010802000408010000080000010803000208050000080500000803000308020000
-080100000851000108030000080000000805000008020000080100000852000108010000
-080000000803000008050000080200000803000008000000083b09010001060a09010001
-0300020204010301020204000600000008010000080600000801000008080003080a0000
-080100000804000008190001080100000801000108010000080200000801000108010000
-080800000802000008010000080200000801000108010000080100000802000008010000
-080200000801000108010000080300010805000008020000080200000801000008020000
-080100010801000008030000080300000862000108010000080200000801000108010000
-080100010801000008040000080500000802000008020000080100000802000008030000
-080600000802000008020000080100010801000008080000080200000801000008020000
-080100010801000008030000080300010801000008010000080200000804000008050000
-080200000801000108020000080100000851000108020000080100000805000008020000
-0801000008520001080300000803000008050000080200000802000008010000083b0901
-0001060a0901000103000202040103010202040006000000080000000807000008010000
-080c00000809000008010000080500000818000108010000080200000801000008020000
-080100000802000008080000080500000802000008010000080500000802000008010000
-0802000008010000080f0000080200000802000008010000080200000801000008020000
-0803000008030003085f0001080500000801000008020000080100000802000008040000
-080500000802000008090000080300000806000008020000080200000801000008020000
-080800000805000008020000080100000802000008030000080300000805000008020000
-080400000805000008020000080100010802000008010000085100010801000008020000
-080300010803000008010000085200010803000008030003080300020802000008020000
-083b09010001060a09010001030002020401030102020400060000000801000008060000
-08010000080c000008090000080100000804000008190001080100000802000008010004
-080100000802000008090002080200040801000008060000080000000802000408010000
-080f00000802000008020000080100000802000008010000080200000802000008040000
-08020000085e000108020003080100000802000008010000080200000804000008050000
-080200000806000308030000080600000802000008020000080100000802000008080000
-080500000802000008010000080200000803000008030000080500000802000008040000
-080500000802000408020000080100000851000108010000080200000805000008020000
-080100000852000108030000080300000802000008010000080200000801000008020000
-083b09010001060a09010001030002020401030102020400060000000802000008050000
-080100000808000008020000080900000801000008030000081a00010801000008020000
-080100000805000008020000080c00000801000008050000080600000800000008020000
-08050000080f000008020000080200000801000008020000080100000802000008020000
-0804000008020000085e0001080100000802000008010000080200000801000008020000
-080400000805000008020000080500000802000008030000080600000802000008020000
-080100000802000008080000080500000802000008010000080200000803000008030000
-080500000802000008040000080500000802000008010001080200000801000008510001
-080100050804000008020000080100000852000108030000080300000802000008010000
-0802000008010005083a09010001060a0901000103000202040103010202040006000000
-080300000804000008010000080300010802000008020000080300010803000008010000
-08020000081b000108010000080100010801000008020000080100000802000008080000
-080200000801000008020000080100000807000008030000080200000801000008070001
-080500000802000008020000080100000802000008010001080100000801000008050000
-08020000085e000108010000080200000801000108010000080100010801000008040000
-080500000802000008020000080100000802000008030000080600000802000008020000
-080100000802000008080000080200000801000008020000080100000802000008030000
-080300000805000008020000080400000805000008020000080100010802000008010000
-085100010805000008010000080200000802000008010000085200010803000008030000
-08020000080100000802000008050000083b09010001060a090100010300020204010301
-020204000600000008040000080400010804000108030002080400010804000108020000
-081c00010802000108000000080200020802000008020000080900020803000208020000
-080700000804000208020000080700010805000008030002080300020802000008000001
-0802000008060002085f0001080200030801000008000001080200000800000108050000
-080500000803000208030003080400010804000008030002080200000802000008090002
-080300020802000008020000080400010801000008060002080500000805000008030003
-080300010852000108050000080200020804000108530001080100040802000208030002
-08060000083b09010001060a090100010300020204010301020204000600000008050000
-08230000081d000108050000080e000508470000087000010808000008050000083c0005
-083c00010858000108670001085709010001060a09010001030002020401030102020400
-06000000084900010801000008020000085c0000087000010808000008050000087f0001
-0858000108670001085709010001060a0901000103000202040103010202040006000000
-0849000108020002085d0000087000010808000008050000087f00010858000108670001
-085709010001060a09010001030002020401030102020400060000000849000108d50001
-089000010858000108670001085709010001060a09010001030002020401030102020400
-060000000849000108d50001089000010858000108670001085709010001060a09010001
-030002020401030102020400060000000849000108d50001089000010858000108670001
-085709010001060a09010001030002020401030102020400060000000849000108d50001
-089000010858000108670001085709010001060a09010001030002020401030102020400
-060000ff00ff00d409010001060a09010001030002020401030102020400060001ff01ff
-01d409010001060a09010001030002020401030102020400060001000849010108d50101
-089001010858010108670101085709010001060a09010001030002020401030102020400
-060001000849010108d50101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000805010008230100081d010108c90100080a0101
-089001010858010108670101085709010001060a09010001030002020401030102020400
-060001000804010008040101080a0102080b010108020100081c01010817010208050100
-0812010008060100082e01000829010008110102081b0100080201020804010108900101
-08030101085201010803010008040102085a010108020102080301020804010108430901
-0001060a0901000103000202040103010202040006000100080301000804010008010100
-0808010008020100080901000801010008020100081b0101081901000819010008360100
-083e0100081a010008020100080201000803010108900101080201000801010008510101
-080201010803010008020100085901010801010008020100080101000802010008020100
-08010100084209010001060a090100010300020204010301020204000600010008020100
-080501000801010008080100080d01000801010008030100081a01010802010208020100
-080001010802010008000101080501000803010208030102080301020802010408020102
-080301020802010008000101080901010800010008030102080301020802010408020102
-080201000800010108040101080201010800010008030102080301020802010008000101
-080c01000803010208030102080201000800010108050100080601000803010108900101
-080201000801010008510101080101000800010008070100085901010805010008050100
-0802010008010100084209010001060a0901000103000202040103010202040006000100
-08010100080601000801010008080100080d010008010100080401000819010108010100
-080201000801010108010100080101010801010008040100080501000802010008020100
-080101000802010008030100080601000802010008020100080101010801010008080100
-080001000800010008010100080201000801010008020100080301000803010008020100
-080101010801010008030101080201000800010008000100080101000802010008040100
-0802010108010100080b0100080201000802010008010100080201000801010108010100
-080301000807010008030101089001010802010008010100085101010803010008070100
-0859010108050100080501000802010008010100084209010001060a0901000103000202
-04010301020204000600010008000100080701000801010008080103080a010008010100
-080501000818010108050100080101000802010008010100080201000804010008050100
-080201000809010008030100080601000802010008020100080101000802010008080100
-0800010008000100080501000801010008070100080301000802010008010100080c0100
-080001000800010008050100080401000802010008020100080b01000802010008020100
-080101000802010008010100080201000803010008060100080401010890010108020100
-08010100085101010803010008060100085a010108030101080501000803010008010100
-084209010001060a09010001030002020401030102020400060001000801010008060100
-080101000808010008020100080901000801010008040100081901010802010308010100
-080201000801010008020100080401000805010008020100080601030803010008060100
-080201000802010008010100080201000808010008000100080001000802010308020102
-080401000803010408010100080c01000800010008000100080201030804010008020100
-08020100080b010008020100080201000801010008020100080101000802010008020100
-0806010008050101089001010802010008010100085101010803010008050100085b0101
-08050100080301000804010008010100084209010001060a090100010300020204010301
-020204000600010008020100080501000801010008080100080201000809010008010100
-08030100081a010108010100080201000801010008020100080101000802010008040100
-080501000802010008050100080201000803010008060100080201000802010008010100
-080201000808010008000100080001000801010008020100080501000803010008030100
-08050100080c010008000100080001000801010008020100080401000802010008020100
-080b01000802010008020100080101000802010008010100080201000802010008050100
-08060101089001010802010008010100085101010803010008040100085c010108050100
-080201000805010008010100084209010001060a09010001030002020401030102020400
-060001000803010008040100080101000803010108020100080201000803010108030100
-0801010008020100081b0101080101000802010008010101080101000801010108010100
-080401000805010008020100080201000801010008020100080301000806010008020100
-080201000801010008020100080801000800010008000100080101000802010008010100
-080201000803010008030100080201000801010008070101080201000800010008000100
-0801010008020100080401000802010008020100080b0100080201000802010008010100
-080201000801010108010100080101000805010008070101089001010802010008010100
-085101010803010008030100085d01010801010008020100080101000806010008010100
-084209010001060a09010001030002020401030102020400060001000804010008040101
-0804010108030102080401010804010108020100081c0101080201030801010008000101
-080201000800010108050100080501000803010208030103080401010804010008030102
-080201000802010008080100080001000800010008020103080201020805010108020102
-080201000807010108020100080001000800010008020103080401000802010008020100
-080b01000803010208030102080201000800010108020100080501040803010108900101
-080301010852010108010104080101040859010108020102080201040803010108430901
-0001060a09010001030002020401030102020400060001000805010008230100081d0101
-0808010008050100083c0105084d01050816010008150101089001010858010108670101
-085709010001060a09010001030002020401030102020400060001000849010108080100
-0805010008ad010008150101089001010858010108670101085709010001060a09010001
-0300020204010301020204000600010008490101080801000805010008ad010008150101
-089001010858010108670101085709010001060a09010001030002020401030102020400
-060001000849010108d50101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-085709010001060a09010001030002020401030102020400060001000849010108d50101
-089001010858010108670101085709010001060a09010001030002020401030102020400
-060001000849010108d50101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001ff01ff01d409010001060a09010001030002020401
-030102020400060001ff01ff01d409010001060a09010001030002020401030102020400
-060001000849010108d50101089001010858010108670101085709010001060a09010001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-085709010001060a09010001030002020401030102020400060001000805010008230100
-081d010108bb010008180101089001010858010108670101085709010001060a09010001
-03000202040103010202040006000100080401000804010108090104080a010108020100
-081c010108170102080501000812010008060100082e0100081901020821010008040100
-0807010008050100081101010890010108030101085201010805010008020102085a0101
-080201020803010208030102084309010001060a09010001030002020401030102020400
-060001000803010008040100080101000808010008020100080901000801010008020100
-081b0101081901000819010008360100081b010008270100080601000805010108110101
-089001010802010008010100085101010804010108010100080201000859010108010100
-0802010008010100080201000801010008020100084209010001060a0901000103000202
-040103010202040006000100080201000805010008010100080c01000809010008010100
-08030100081a010108020102080201000800010108020100080001010805010008030102
-080301020803010208020104080201020803010208020100080001010809010108000100
-080301020803010208020104080201020802010008000101080401010805010008030102
-080301020802010008000101080a01020802010408040100080401000800010008110101
-089001010802010008010100085101010803010008000100080501000859010108050100
-080101000802010008010100084609010001060a09010001030002020401030102020400
-06000100080101000806010008010100080b0100080a0100080101000804010008190101
-080101000802010008010101080101000801010108010100080401000805010008020100
-080201000801010008020100080301000806010008020100080201000801010108010100
-080801000800010008000100080101000802010008010100080201000803010008030100
-080201000801010108010100080301010805010008020100080201000801010008020100
-0801010108010100080b0100080401000805010008040100080101000811010108900101
-080201000801010008510101080201000801010008050100085901010805010008010100
-0802010008010100084609010001090c0001030002020401030102020400060001000800
-01000807010008010100080b0100080a0100080101000805010008180101080501000801
-010008020100080101000802010008040100080501000802010008090100080301000806
-010008020100080201000801010008020100080801000800010008000100080501000801
-010008070100080301000802010008010100080f01000802010008020100080101000802
-01000801010008020100080b010008040100080501000803010008020100081101010890
-0101080201000801010008510101080101000802010008040100085a0101080401000803
-010208020103084309010000090d00010300020204010301020204000600010008010100
-0806010008010100080b0100080a01000801010008040100081901010802010308010100
-080201000801010008020100080401000805010008020100080601030803010008060100
-080201000802010008010100080201000808010008000100080001000802010308020102
-080401000803010408010100080f01000802010008020100080101000802010008010100
-08020100080b010008040100080401000804010008020100081101010890010108020100
-0801010008510101080101000802010008030100085b0101080301000803010008020100
-080101000802010008420901070e00010300020204010301020204000600010008020100
-0805010008010100080a0100080b01000801010008030100081a01010801010008020100
-080101000802010008010100080201000804010008050100080201000805010008020100
-080301000806010008020100080201000801010008020100080801000800010008000100
-080101000802010008050100080301000803010008050100080f01000802010008020100
-08010100080201000801010008020100080b010008040100080401000804010508100101
-089001010802010008010100085101010801010508010100085c01010802010008040100
-08020100080101000802010008420901070e000103000202040103010202040006000100
-080301000804010008010100080301010804010008050101080301000801010008020100
-081b01010801010008020100080101010801010008010101080101000804010008050100
-080201000802010008010100080201000803010008060100080201000802010008010100
-080201000808010008000100080001000801010008020100080101000802010008030100
-080301000802010008010100080701010805010008020100080201000801010008020100
-0801010108010100080b0100080401000803010008090100081101010890010108020100
-08010100085101010805010008010100085d010108010100080501000802010008010100
-0802010008420901070e0001030002020401030102020400060001000804010008040101
-0804010108040100080501010804010108020100081c0101080201030801010008000101
-080201000800010108050100080501000803010208030103080401010804010008030102
-080201000802010008080100080001000800010008020103080201020805010108020102
-08020100080701010805010008030102080301020802010008000101080c010008050101
-080101000809010008110101089001010803010108520101080501000801010408590101
-08010104080201020803010208430901070e000103000202040103010202040006000100
-0805010008230100081d01010808010008050100083c01050847010008040105082d0101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-084901010808010008050100088a01000838010108900101085801010867010108570901
-070e000103000202040103010202040006000100084901010808010008050100088a0100
-0838010108900101085801010867010108570901070e0001030002020401030102020400
-060001000849010108d5010108900101085801010867010108570901070e000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-070e0001030002020401030102020400060001000849010108d501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e0001030002020401030102020400060001ff
-01ff01d40901070e0001030002020401030102020400060001ff01ff01d40901070e0001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-08570901070e0001030002020401030102020400060001000849010108d5010108900101
-085801010867010108570901070e00010300020204010301020204000600010008050100
-08230100081d0101086e01000865010108900101085801010867010108570901070e0001
-030002020401030102020400060001000804010008040101080a0102080b010108020100
-081c0101084f0102081b010008020102085f010108010100082201020867010108030101
-085201010801010408030101080601000852010108030100080401020803010208060100
-083b0901070e000103000202040103010202040006000100080301000804010008010100
-0808010008020100080901000801010008020100081b010108510100081a010008020100
-08020100085e010108010100082401000867010108020100080101000851010108010100
-080601000801010008040101085201010802010108030100080201000801010008020100
-08040101083b0901070e0001030002020401030102020400060001000802010008050100
-080101000808010008020100080901000801010008030100081a01010802010108000100
-080201020802010008000101080a01020803010208020100080001010802010008020100
-080201020802010008000101080401010805010008030102080301020802010008000101
-080501000802010008620101080101000801010008030102080201000800010108020100
-080001010803010208050100080a010208020100080201000801010008000101084b0101
-080201000801010008510101080101000806010008010100080301000800010008520101
-08010100080001000803010008050100080201000803010008000100083b0901070e0001
-030002020401030102020400060001000801010008060100080101000808010008020100
-080901000801010008040100081901010801010008010101080101000802010008010101
-080101000808010008020100080101000802010008010101080101000801010008020100
-080101000802010008010101080101000803010108050100080201000802010008010100
-080201000801010108010100080301000803010008620101080101000800010008030100
-080201000801010108010100080101010801010008010100080201000804010008090100
-0802010008010100080201000801010108010100084a0101080201000801010008510101
-080101030803010008010100080201000801010008520101080301000803010008050100
-080201000802010008010100083b0901070e000103000202040103010202040006000100
-08000100080701000801010008090102080a010008010100080501000818010108010100
-080201000801010008020100080101000802010008080100080501000802010008010100
-0805010008020100080101000802010008010100080f0100080201000802010008010100
-0802010008010100080201000803010008030103085f0101080101010804010008020100
-080101000805010008020100080101000802010008040100080901000805010008020100
-0801010008020100084a0101080201000801010008510101080501000802010008010100
-0801010008020100085201010803010008030103080301020802010008020100083b0901
-070e00010300020204010301020204000600010008010100080601000801010008080100
-080201000809010008010100080401000819010108010100080201000801010408010100
-0802010008090102080201040801010008060100080001000802010408010100080f0100
-080201000802010008010100080201000801010008020100080201000804010008020100
-085e010108010101080401040801010008050100080201000801010408040100080a0102
-08020100080201000801010008020100084a010108020100080101000851010108050100
-080201000801010008010100080201000852010108030100080301000802010008010100
-080201000801010008020100083b0901070e000103000202040103010202040006000100
-0802010008050100080101000808010008020100080901000801010008030100081a0101
-0801010008020100080101000805010008020100080c0100080101000805010008060100
-080001000802010008050100080f01000802010008020100080101000802010008010100
-08020100080201000804010008020100085e010108010100080001000803010008050100
-08050100080201000801010008080100080d010008010100080201000801010008020100
-084a01010802010008010100085101010801010008020100080201000801010008010105
-08510101080301000803010008020100080101000802010008010105083a0901070e0001
-030002020401030102020400060001000803010008040100080101000803010108020100
-0802010008030101080301000801010008020100081b0101080101000801010108010100
-080201000801010008020100080801000802010008010100080201000801010008070100
-080301000802010008010100080701010805010008020100080201000801010008020100
-0801010108010100080101000805010008020100085e0101080101000801010008020100
-080201000801010008050100080201000801010008020100080401000809010008020100
-08010100080101010801010108010100084a010108020100080101000851010108010100
-080201000802010008010100080501000852010108030100080301000802010008010100
-0802010008050100083b0901070e00010300020204010301020204000600010008040100
-080401010804010108030102080401010804010108020100081c01010802010108000100
-080201020802010008020100080901020803010208020100080701000804010208020100
-0807010108050100080301020803010208020100080001010802010008060102085f0101
-0801010008020100080201020802010008050100080201000802010208050100080a0102
-08030101080001000801010008000101084b010108030101085201010802010208040101
-080601000852010108010104080201020803010208060100083b0901070e000103000202
-0401030102020400060001000805010008230100081d010108050100080e010508470100
-08700101082a0105080f0100084e0101085801010867010108570901070e000103000202
-040103010202040006000100084901010801010008020100085c01000870010108400100
-084e0101085801010867010108570901070e000103000202040103010202040006000100
-0849010108020102085d01000870010108400100084e0101085801010867010108570901
-070e0001030002020401030102020400060001000849010108d501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-02020400060001000849010108d5010108900101085801010867010108570901070e0001
-030002020401030102020400060001ff01ff01d40901070e000103000202040103010202
-0400060001ff01ff01d40901070e00010300020204010301020204000600010008490101
-08d5010108900101085801010867010108570901070e0001030002020401030102020400
-060001000849010108d5010108900101085801010867010108570901070e000103000202
-0401030102020400060001000805010008230100081d0101086e01000865010108900101
-085801010867010108570901070e00010300020204010301020204000600010008040100
-08040101080a0102080b010108020100081c0101084f0102081b010008020102085f0101
-0890010108030101085201010802010208030102085a0101080201020803010208030102
-08430901070e000103000202040103010202040006000100080301000804010008010100
-0808010008020100080901000801010008020100081b010108510100081a010008020100
-08020100085e010108900101080201000801010008510101080101000802010008010100
-080201000859010108010100080201000801010008020100080101000802010008420901
-070e00010300020204010301020204000600010008020100080501000801010008080100
-08020100080901000801010008030100081a010108020101080001000802010208020100
-08000101080a010208030102080201000800010108020100080201000802010208020100
-080001010804010108050100080301020803010208020100080001010805010008020100
-086201010801010008000101080301020802010008020100087b01010802010008010100
-085101010805010008050100085901010805010008010100080201000801010008460901
-070e00010300020204010301020204000600010008010100080601000801010008080100
-080201000809010008010100080401000819010108010100080101010801010008020100
-080101010801010008080100080201000801010008020100080101010801010008010100
-080201000801010008020100080101010801010008030101080501000802010008020100
-080101000802010008010101080101000803010008030100086201010801010108010100
-08010100080201000801010008020100087b010108020100080101000851010108050100
-08050100085901010805010008010100080201000801010008460901070e000103000202
-040103010202040006000100080001000807010008010100080901030809010008010100
-080501000818010108010100080201000801010008020100080101000802010008080100
-0805010008020100080101000805010008020100080101000802010008010100080f0100
-0802010008020100080101000802010008010100080201000803010008030103085f0101
-0801010008050100080201000802010008000100087c0101080201000801010008510101
-0804010008050100085a010108040100080301020802010308430901070e000103000202
-040103010202040006000100080101000806010008010100080c01000809010008010100
-080401000819010108010100080201000801010408010100080201000809010208020104
-0801010008060100080001000802010408010100080f0100080201000802010008010100
-080201000801010008020100080201000804010008020100085e01010801010008050104
-08030100087d01010802010008010100085101010803010008050100085b010108030100
-0803010008020100080101000802010008420901070e0001030002020401030102020400
-06000100080201000805010008010100080c0100080901000801010008030100081a0101
-0801010008020100080101000805010008020100080c0100080101000805010008060100
-080001000802010008050100080f01000802010008020100080101000802010008010100
-08020100080201000804010008020100085e010108010100080501000806010008000100
-087c01010802010008010100085101010802010008050100085c01010802010008040100
-08020100080101000802010008420901070e000103000202040103010202040006000100
-080301000804010008010100080301010802010008020100080301010803010008010100
-08020100081b010108010100080101010801010008020100080101000802010008080100
-080201000801010008020100080101000807010008030100080201000801010008070101
-080501000802010008020100080101000802010008010101080101000801010008050100
-08020100085e01010801010008050100080201000801010008020100087b010108020100
-08010100085101010801010008050100085d010108010100080501000802010008010100
-0802010008420901070e0001030002020401030102020400060001000804010008040101
-0804010108030102080401010804010108020100081c0101080201010800010008020102
-080201000802010008090102080301020802010008070100080401020802010008070101
-08050100080301020803010208020100080001010802010008060102085f010108010100
-080601020802010008020100087b01010803010108520101080101040801010408590101
-08010104080201020803010208430901070e000103000202040103010202040006000100
-0805010008230100081d010108050100080e010508470100087001010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108010100
-08020100085c01000870010108900101085801010867010108570901070e000103000202
-0401030102020400060001000849010108020102085d0100087001010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-02020400060001000849010108d5010108900101085801010867010108570901070e0001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-08570901070e0001030002020401030102020400060001ff01ff01d40901070e00010300
-02020401030102020400060001ff01ff01d40901070e0001030002020401030102020400
-060001000849010108d5010108900101085801010867010108570901070e000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-070e00010300020204010301020204000600010008050100082a010008160101086e0100
-0865010108900101085801010867010108570901070e0001030002020401030102020400
-060001000804010008040101080b010008050101080b01010802010008150101084f0102
-081b010008020102085f01010809010208090100080d0102086701010803010108520101
-0802010208030102085a010108020102080201040801010408420901070e000103000202
-040103010202040006000100080301000804010008010100080901010804010008010100
-0809010008010100080201000814010108510100081a01000802010008020100085e0101
-080b010008090100080f0100086701010802010008010100085101010801010008020100
-080101000802010008590101080101000802010008010100080201000801010008460901
-070e00010300020204010301020204000600010008020100080501000801010008080100
-080001000804010008010100080901000801010008030100081301010802010108000100
-080201020802010008000101080a01020803010208020100080001010802010008020100
-080201020802010008000101080401010805010008030102080301020802010008000101
-080501000802010008620101080201010800010008040100080301020802010008000101
-0803010208050100080901000800010108030102080201010800010008030102080a0102
-080301020802010008000101080201000802010008020102080201000800010108130101
-080201000801010008510101080101000802010008010100080201000859010108050100
-080501000801010008460901070e00010300020204010301020204000600010008010100
-0806010008010100080a0100080401000801010008090100080101000804010008120101
-080101000801010108010100080201000801010108010100080801000802010008010100
-080201000801010108010100080101000802010008010100080201000801010108010100
-080301010805010008020100080201000801010008020100080101010801010008030100
-080301000862010108010100080101010804010008020100080201000801010108010100
-080101000802010008040100080901010801010008010100080201000801010008000100
-080001000801010008020100080801000802010008010100080201000801010108010100
-080101000802010008010100080201000801010108010100081201010802010008010100
-085101010801010008020100080101000802010008590101080501000804010008020103
-08430901070e000103000202040103010202040006000100080001000807010008010100
-080a01000804010008010100080901000801010008050100081101010801010008020100
-080101000802010008010100080201000808010008050100080201000801010008050100
-08020100080101000802010008010100080f010008020100080201000801010008020100
-08010100080201000803010008030103085f010108010100080201000804010008020100
-080201000801010008020100080501000804010008090100080201000805010008010100
-080001000800010008010100080201000808010008050100080201000801010008050100
-080201000801010008020100080101000816010108020100080101000851010108020102
-08030102085a010108030101080501000806010008420901070e00010300020204010301
-0202040006000100080101000806010008010100080a0100080401000801010008090100
-080101000804010008120101080101000802010008010104080101000802010008090102
-080201040801010008060100080001000802010408010100080f01000802010008020100
-08010100080201000801010008020100080201000804010008020100085e010108010100
-080201000804010008020100080201000801010008020100080201030804010008090100
-080201000802010308010100080001000800010008010104080901020802010408010100
-080601000800010008020104080101000816010108020100080101000851010108010100
-0802010008010100080201000859010108050100080401000806010008420901070e0001
-03000202040103010202040006000100080201000805010008010100080a010008040100
-080101000809010008010100080301000813010108010100080201000801010008050100
-08020100080c0100080101000805010008060100080001000802010008050100080f0100
-080201000802010008010100080201000801010008020100080201000804010008020100
-085e01010801010008020100080401000802010008020100080101000802010008010100
-080201000804010008090100080201000801010008020100080101000800010008000100
-080101000810010008010100080501000806010008000100080201000805010008160101
-080201000801010008510101080101000802010008010100080201000859010108050100
-08030100080301000802010008420901070e000103000202040103010202040006000100
-080301000804010008010100080301010804010008040100080101000803010108030100
-080101000802010008140101080101000801010108010100080201000801010008020100
-080801000802010008010100080201000801010008070100080301000802010008010100
-080701010805010008020100080201000801010008020100080101010801010008010100
-0805010008020100085e0101080101000801010108040100080201000802010008010101
-080101000801010008020100080401000809010008020100080101000802010008010100
-080001000800010008010100080201000808010008020100080101000802010008010100
-080701000803010008020100080101000816010108020100080101000851010108010100
-080201000801010008020100085901010801010008020100080301000803010008020100
-08420901070e000103000202040103010202040006000100080401000804010108040101
-080201040803010108040101080401010802010008150101080201010800010008020102
-080201000802010008090102080301020802010008070100080401020802010008070101
-08050100080301020803010208020100080001010802010008060102085f010108020101
-080001000804010008030102080201000800010108030103080401000809010008020100
-0802010308010100080001000800010008020102080a0102080301020802010008070100
-08040102080201000816010108030101085201010802010208030102085a010108020102
-080401000804010208430901070e00010300020204010301020204000600010008050100
-082a01000816010108050100080e010508470100087001010805010008230105081c0105
-083c0101085801010867010108570901070e000103000202040103010202040006000100
-084901010801010008020100085c01000870010108010100080201000889010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108020102
-085d01000870010108020102088a0101085801010867010108570901070e000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-070e0001030002020401030102020400060001000849010108d501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
-01d40901070e0001030002020401030102020400060001000849010108d5010108900101
-085801010867010108570901070e00010300020204010301020204000600010008490101
-08d5010108900101085801010867010108570901070e0001030002020401030102020400
-0600010008050100082a010008160101086e010008650101089001010858010108670101
-08570901070e0001030002020401030102020400060001000804010008040101080b0100
-08050100080c01010802010008150101084f0102081b010008020102085f010108110100
-087d01010803010108520101080301000805010008040102085301010802010208030102
-0804010108430901070e0001030002020401030102020400060001000803010008040100
-080101000809010108040101080b010008010100080201000814010108510100081a0100
-0802010008020100085e010108110100087d010108020100080101000851010108020101
-080401010803010008020100085201010801010008020100080101000802010008020100
-0801010008420901070e0001030002020401030102020400060001000802010008050100
-0801010008080100080001000803010008000100080b0100080101000803010008130101
-0802010108000100080201020802010008000101080a0102080301020802010008000101
-080201000802010008020102080201000800010108040101080501000803010208030102
-080201000800010108050100080201000862010108010100080001010803010208020104
-080901020802010008020100080101000800010108600101080201000801010008510101
-080101000800010008030100080001000803010008560101080501000805010008020100
-0801010008420901070e0001030002020401030102020400060001000801010008060100
-08010100080a010008050100080b01000801010008040100081201010801010008010101
-080101000802010008010101080101000808010008020100080101000802010008010101
-080101000801010008020100080101000802010008010101080101000803010108050100
-080201000802010008010100080201000801010108010100080301000803010008620101
-0801010108010100080101000802010008030100080a0100080201000801010008020100
-0801010108010100085f0101080201000801010008510101080301000805010008030100
-085601010805010008050100080201000801010008420901070e00010300020204010301
-0202040006000100080001000807010008010100080a010008050100080b010008010100
-080501000811010108010100080201000801010008020100080101000802010008080100
-0805010008020100080101000805010008020100080101000802010008010100080f0100
-0802010008020100080101000802010008010100080201000803010008030103085f0101
-0801010008020100080101000802010008030100080a0100080501000802010008010100
-08020100085f010108020100080101000851010108030100080501000803010308530101
-0803010108050100080301000801010008420901070e0001030002020401030102020400
-06000100080101000806010008010100080a010008050100080b01000801010008040100
-081201010801010008020100080101040801010008020100080901020802010408010100
-08060100080001000802010408010100080f010008020100080201000801010008020100
-0801010008020100080201000804010008020100085e0101080101000802010008010104
-08030100080b010208020100080201000801010008020100085f01010802010008010100
-085101010803010008050100080301000802010008520101080501000803010008040100
-0801010008420901070e0001030002020401030102020400060001000802010008050100
-08010100080a010008050100080b01000801010008030100081301010801010008020100
-080101000805010008020100080c01000801010008050100080601000800010008020100
-08050100080f010008020100080201000801010008020100080101000802010008020100
-0804010008020100085e010108010100080201000801010008070100080e010008010100
-080201000801010008020100085f01010802010008010100085101010803010008050100
-0803010008020100085201010805010008020100080501000801010008420901070e0001
-030002020401030102020400060001000803010008040100080101000803010108040100
-080501000805010108030100080101000802010008140101080101000801010108010100
-080201000801010008020100080801000802010008010100080201000801010008070100
-080301000802010008010100080701010805010008020100080201000801010008020100
-0801010108010100080101000805010008020100085e0101080101000802010008010100
-0802010008030100080a01000802010008010100080101010801010108010100085f0101
-080201000801010008510101080301000805010008030100080201000852010108010100
-0802010008010100080601000801010008420901070e0001030002020401030102020400
-060001000804010008040101080401010802010408010104080301010804010108020100
-081501010802010108000100080201020802010008020100080901020803010208020100
-080701000804010208020100080701010805010008030102080301020802010008000101
-0802010008060102085f0101080101000802010008020102080501010809010208030101
-080001000801010008000101086001010803010108520101080101040801010408020102
-0853010108020102080201040803010108430901070e0001030002020401030102020400
-0600010008050100082a01000816010108050100080e0105084701000870010108150105
-080f010008630101085801010867010108570901070e0001030002020401030102020400
-06000100084901010801010008020100085c010008700101082b01000863010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108020102
-085d010008700101082b010008630101085801010867010108570901070e000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-070e0001030002020401030102020400060001000849010108d501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
-01d40901070e0001030002020401030102020400060001000849010108d5010108900101
-085801010867010108570901070e00010300020204010301020204000600010008490101
-08d5010108900101085801010867010108570901070e0001030002020401030102020400
-0600010008050100082a010008160101086e010008650101089001010858010108670101
-08570901070e0001030002020401030102020400060001000804010008040101080b0100
-08040102080b01010802010008150101084f0102081b010008020102085f010108110100
-080301000878010108030101085201010802010208030102085a01010802010208030102
-0804010008440901070e0001030002020401030102020400060001000803010008040100
-080101000809010108030100080201000809010008010100080201000814010108510100
-081a01000802010008020100085e01010811010008030100087801010802010008010100
-085101010801010008020100080101000802010008590101080101000802010008010100
-080201000802010108440901070e00010300020204010301020204000600010008020100
-080501000801010008080100080001000807010008090100080101000803010008130101
-0802010108000100080201020802010008000101080a0102080301020802010008000101
-080201000802010008020102080201000800010108040101080501000803010208030102
-080201000800010108050100080201000862010108020102080201000802010008010104
-080101000800010108750101080201000801010008510101080501000805010008590101
-0805010008050100080101000800010008440901070e0001030002020401030102020400
-06000100080101000806010008010100080a010008070100080901000801010008040100
-081201010801010008010101080101000802010008010101080101000808010008020100
-080101000802010008010101080101000801010008020100080101000802010008010101
-080101000803010108050100080201000802010008010100080201000801010108010100
-080301000803010008620101080101000802010008010100080201000803010008030101
-080101000874010108020100080101000851010108050100080501000859010108050100
-080501000803010008440901070e00010300020204010301020204000600010008000100
-0807010008010100080a010008060100080a010008010100080501000811010108010100
-080201000801010008020100080101000802010008080100080501000802010008010100
-0805010008020100080101000802010008010100080f0100080201000802010008010100
-0802010008010100080201000803010008030103085f0101080501000801010008020100
-080301000803010008020100087401010802010008010100085101010804010008050100
-085a010108040100080401010804010008440901070e0001030002020401030102020400
-06000100080101000806010008010100080a010008050100080b01000801010008040100
-081201010801010008020100080101040801010008020100080901020802010408010100
-08060100080001000802010408010100080f010008020100080201000801010008020100
-0801010008020100080201000804010008020100085e0101080201030801010008020100
-080301000803010008020100087401010802010008010100085101010803010008050100
-085b010108030100080701000803010008440901070e0001030002020401030102020400
-06000100080201000805010008010100080a010008040100080c01000801010008030100
-081301010801010008020100080101000805010008020100080c01000801010008050100
-08060100080001000802010008050100080f010008020100080201000801010008020100
-0801010008020100080201000804010008020100085e0101080101000802010008010100
-080201000803010008030100080201000874010108020100080101000851010108020100
-08050100085c010108020100080801000803010008440901070e00010300020204010301
-020204000600010008030100080401000801010008030101080401000803010008070101
-080301000801010008020100081401010801010008010101080101000802010008010100
-080201000808010008020100080101000802010008010100080701000803010008020100
-080101000807010108050100080201000802010008010100080201000801010108010100
-080101000805010008020100085e01010801010008020100080101000801010108030100
-0803010008020100087401010802010008010100085101010801010008050100085d0101
-0801010008050100080201000803010008440901070e0001030002020401030102020400
-060001000804010008040101080401010802010408010104080301010804010108020100
-081501010802010108000100080201020802010008020100080901020803010208020100
-080701000804010208020100080701010805010008030102080301020802010008000101
-0802010008060102085f0101080201030802010108000100080401010801010008020100
-087401010803010108520101080101040801010408590101080101040802010208020104
-08420901070e00010300020204010301020204000600010008050100082a010008160101
-08050100080e0105084701000870010108900101085801010867010108570901070e0001
-03000202040103010202040006000100084901010801010008020100085c010008700101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108020102085d01000870010108900101085801010867010108570901070e0001
-030002020401030102020400060001000849010108d50101089001010858010108670101
-08570901070e0001030002020401030102020400060001000849010108d5010108900101
-085801010867010108570901070e00010300020204010301020204000600010008490101
-08d5010108900101085801010867010108570901070e0001030002020401030102020400
-060001000849010108d5010108900101085801010867010108570901070e000103000202
-0401030102020400060001ff01ff01d40901070e00010300020204010301020204000600
-01ff01ff01d40901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-020204000600010008050100082a010008160101086e0100086501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000804010008040101
-080b010008040102080b01010802010008150101084f0102081b010008020102085f0101
-08110100080a010008220102084b01010803010108520101080101040805010008050100
-0852010108020102080201040801010408420901070e0001030002020401030102020400
-060001000803010008040100080101000809010108030100080201000809010008010100
-080201000814010108510100081a01000802010008020100085e010108110100080a0100
-08240100084b010108020100080101000851010108010100080801010804010108520101
-080101000802010008010100080201000801010008460901070e00010300020204010301
-020204000600010008020100080501000801010008080100080001000807010008090100
-0801010008030100081301010802010108000100080201020802010008000101080a0102
-080301020802010008000101080201000802010008020102080201000800010108040101
-080501000803010208030102080201000800010108050100080201000862010108010100
-080001010803010208020104080801000801010008030102080201000800010108020100
-080001010803010208050100084b01010802010008010100085101010801010008070100
-0800010008030100080001000852010108050100080501000801010008460901070e0001
-03000202040103010202040006000100080101000806010008010100080a010008070100
-080901000801010008040100081201010801010008010101080101000802010008010101
-080101000808010008020100080101000802010008010101080101000801010008020100
-080101000802010008010101080101000803010108050100080201000802010008010100
-080201000801010108010100080301000803010008620101080101010801010008010100
-0802010008030100080a0100080001000803010008020100080101010801010008010101
-08010100080101000802010008040100084b010108020100080101000851010108010103
-080301000801010008020100080101000852010108050100080401000802010308430901
-070e000103000202040103010202040006000100080001000807010008010100080a0100
-08050101080a010008010100080501000811010108010100080201000801010008020100
-080101000802010008080100080501000802010008010100080501000802010008010100
-0802010008010100080f0100080201000802010008010100080201000801010008020100
-0803010008030103085f01010801010008020100080101000802010008030100080a0101
-0804010008020100080101000805010008020100080101000802010008040100084b0101
-080201000801010008510101080501000801010008020100080101000802010008520101
-08030101080501000806010008420901070e000103000202040103010202040006000100
-080101000806010008010100080a01000807010008090100080101000804010008120101
-080101000802010008010104080101000802010008090102080201040801010008060100
-080001000802010408010100080f01000802010008020100080101000802010008010100
-08020100080201000804010008020100085e010108010100080201000801010408030100
-080a0101080401040801010008050100080201000801010408040100084b010108020100
-080101000851010108050100080101000802010008010100080201000852010108050100
-080401000806010008420901070e00010300020204010301020204000600010008020100
-0805010008010100080a0100080701000809010008010100080301000813010108010100
-08020100080101000805010008020100080c010008010100080501000806010008000100
-0802010008050100080f0100080201000802010008010100080201000801010008020100
-080201000804010008020100085e010108010100080201000801010008070100080a0100
-08000100080301000805010008050100080201000801010008080100084b010108020100
-080101000851010108010100080201000801010508000105085101010805010008030100
-080301000802010008420901070e00010300020204010301020204000600010008030100
-080401000801010008030101080401000803010008020100080301010803010008010100
-080201000814010108010100080101010801010008020100080101000802010008080100
-080201000801010008020100080101000807010008030100080201000801010008070101
-080501000802010008020100080101000802010008010101080101000801010008050100
-08020100085e01010801010008020100080101000802010008030100080a010008010100
-0802010008020100080101000805010008020100080101000802010008040100084b0101
-080201000801010008510101080101000802010008050100080501000852010108010100
-0802010008030100080301000802010008420901070e0001030002020401030102020400
-060001000804010008040101080401010802010408020102080401010804010108020100
-081501010802010108000100080201020802010008020100080901020803010208020100
-080701000804010208020100080701010805010008030102080301020802010008000101
-0802010008060102085f0101080101000802010008020102080501010808010008020100
-080201020802010008050100080201000802010208050100084b01010803010108520101
-0802010208060100080501000852010108020102080401000804010208430901070e0001
-0300020204010301020204000600010008050100082a01000816010108050100080e0105
-08470100087001010815010508740101085801010867010108570901070e000103000202
-040103010202040006000100084901010801010008020100085c01000870010108900101
-085801010867010108570901070e00010300020204010301020204000600010008490101
-08020102085d01000870010108900101085801010867010108570901070e000103000202
-0401030102020400060001000849010108d5010108900101085801010867010108570901
-070e0001030002020401030102020400060001000849010108d501010890010108580101
-0867010108570901070e0001030002020401030102020400060001000849010108d50101
-08900101085801010867010108570901070e000103000202040103010202040006000100
-0849010108d5010108900101085801010867010108570901070e00010300020204010301
-02020400060001ff01ff01d40901070e0001030002020401030102020400060001ff01ff
-01d40901070e0001030002020401030102020400060001000849010108d5010108900101
-0858010108670101085709010010030002020401030102020400060001000849010108d5
-0101089001010858010108670101085709010700000c0900000103000202040103010202
-04000600010008050100082a010008160101088301000850010108900101085801010867
-010108570901070000010608090107000001030002020401030102020400060001000804
-010008040101080b010008070100080a0101080201000815010108110100080a01000822
-0102080b01000806010008090100081501000807010008020102084a0101089001010803
-0101085201010805010008020102085a0101080201020802010408490901070100010607
-090107000001030002020401030102020400060001000803010008040100080101000809
-0101080601010809010008010100080201000814010108110100080a010008240100080b
-010008110100081401010806010008020100080201000849010108900101080201000801
-010008510101080401010801010008020100085901010801010008020100080101000802
-010008490901070100010606090107010001030002020401030102020400060001000802
-010008050100080101000808010008000100080501000800010008090100080101000803
-010008130101080101000800010108030102080201040808010008010100080301020802
-010008000101080201000800010108030102080501000804010108020104080201020803
-010208020100080101000803010208020100080001010802010008000100080601000806
-010008490101089001010802010008010100085101010803010008000100080101000802
-010008590101080101000802010008050100084909010702000106050901070100010300
-0202040103010202040006000100080101000806010008010100080a0100080401000801
-010008090100080101000804010008120101080101010801010008010100080201000803
-0100080a0100080001000803010008020100080101010801010008010101080101000801
-010008020100080401000804010108040100080601000802010008020100080101000800
-010008030100080201000801010108010100080301000805010008070100084901010890
-010108020100080101000851010108020100080101000801010008020100085901010801
-01000802010008040100084a090107020001060409010702000103000202040103010202
-040006000100080001000807010008010100080a01000803010008020100080901000801
-010008050100081101010801010008020100080101000802010008030100080a01010804
-010008020100080101000805010008020100080101000802010008040100080b01000806
-01000802010008050101080401000802010008010100080701000805010008060100084a
-010108900101080201000801010008510101080101000802010008020102085a01010802
-010208050100084a09010703000106030901070200010300020204010301020204000600
-0100080101000806010008010100080a0100080301000802010008090100080101000804
-01000812010108010100080201000801010408030100080a010108040104080101000805
-0100080201000801010408040100080b0100080601000802010008050101080401040801
-0100080701000804010008060100084b0101089001010802010008010100085101010801
-010008020100080101000802010008590101080101000802010008040100084a09010703
-000106020901070300010300020204010301020204000600010008020100080501000801
-0100080a0100080301050808010008010100080301000813010108010100080201000801
-010008070100080a01000800010008030100080501000805010008020100080101000808
-0100080b0100080601000802010008050100080001000803010008050100080701000804
-010008050100084c01010890010108020100080101000851010108010105080001000802
-010008590101080101000802010008030100084b09010704000106010901070300010300
-020204010301020204000600010008030100080401000801010008030101080401000807
-010008030101080301000801010008020100081401010801010008020100080101000802
-010008030100080a01000801010008020100080201000801010008050100080201000801
-010008020100080401000804010108040100080601000802010008020100080101000801
-0100080201000802010008010100080701000803010008050100084d0101089001010802
-010008010100085101010805010008010100080201000859010108010100080201000803
-0100084b0901070400010600090107040001030002020401030102020400060001000804
-010008040101080401010802010408050100080301010804010108020100081501010801
-010008020100080201020805010108080100080201000802010208020100080501000802
-010008020102080501000804010108050101080401000803010208020100080201000802
-010208020100080501040801010008050104084901010890010108030101085201010805
-010008020102085a01010802010208040100084b09010705000009020704000103000202
-04010301020204000600010008050100082a0100081601010815010508b9010108900101
-085801010867010108570901070500000901070500010300020204010301020204000600
-01000849010108d501010890010108580101086701010857090107060901070500010300
-02020401030102020400060001000849010108d501010890010108580101086701010857
-09010706090007060001030002020401030102020400060001000849010108d501010890
-010108580101086701010857090100100300020204010301020204000600010008490101
-08d5010108900101085801010867010108570900001103000202040103010202040009ff
-09ff09d9060e03000202040103010202040009ff09ff09d80000060e0300020204010301
-020204000901070d0000070000ff00ff00a507100001070c0001060e0300020204010301
-020204000901070b00010900070000ff00ff00a4090007100003070a0001060e03000202
-040103010202040009010709000209010700000106ff06ff06a109010710000507080001
-060e030002020401030102020400090107070003060009010700000106ff06ff06a10901
-071000010601000307060001060e03000202040103010202040009010705000306020901
-0700000106ff06ff06a10901071000010603000307040001060e03000202040103010202
-0400090107030003060409010700000106ff06ff06a10901071000010605000307020001
-060e030002020401030102020400090107010003060609010700000106ff06ff06a10901
-071000010607000307000001060e03000202040103010202040009050608090107000001
-06ff06ff06a1090107100001060809030001060e03000202040103010202040009010701
-0903060609010700000106ff06ff06a10901071000010607090307000001060e03000202
-0401030102020400090107030903060409010700000106ff06ff06a10901071000010605
-090307020001060e030002020401030102020400090107050903060209010700000106ff
-06ff06a10901071000010603090307040001060e03000202040103010202040009010707
-0903060009010700000106ff06ff06a10901071000010601090307060001060e03000202
-04010301020204000901070909040700000106ff06ff06a1090107100001090307080001
-060e0300020204010301020204000901070b09020700000109ff09ff09a3071000010901
-070a0001060e0300020204010301020204000901070d09000700000009ff09ff09a40710
-00000900070c0001060e030002020401030102020400090100ff00ff00d7060e03000202
-0401030102020400090000ff00ff00d8060e03000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff0615
-01000601010006ce030002020401030004040601000a0607010006020100060401000606
-010006100102061201000686000a06090100060c01000611010006020100060401000606
-0100060f01000602010006e0010006010100060801000602010006040100060601000605
-0100061f010106890300040403050601000909000607010006020100060c0100060f0100
-060201000611010006860009090006090100060c01000611010006020100060c0100060f
-01010601010006e00100060101000608010006020100060c010006050100061e01000601
-010006880304040003010202040006010001060609010607010006020100060201020603
-010106000100060201020609010006050100060201000602010206020104060201020602
-010106000100060901000600010106020100060001010603010206030102060301020603
-010206030102060301020603010206310001060609010608010006000100060201000602
-010006010104060201020609010006020100060201020603010106000100060201020609
-01010601010006020102060201000602010006d101050607010006020100060201020603
-010106000100060201010600010006020102060201000600010106040101060a01000601
-010006880300020204010301020204000601000106060901060701000602010006040100
-060201000601010106010100060201000609010006040100060201000601010006020100
-060301000603010006020100060101000600010006000100060801010601010006010101
-060101000601010006020100060101000602010006010100060201000601010006020100
-060101000602010006010100060201000601010006020100063000010606090106080100
-060001000602010006020100060301000603010006020100060801000602010006040100
-060201000601010106010100060201000608010006000100060001000601010006020100
-060101000602010006d20100060101000608010006020100060401000602010006010101
-06010100060101010601010006020100060101010601010006030101060a010006010100
-068803000202040103010202040006010001060609010607010406040100060201000602
-01000601010006020100060a010106030100060101000601010006070100060301000602
-010006010100060001000600010006080100060201000601010006050100060201000601
-010006050100060201000601010006050100060501000602010006010100063400010606
-090106080100060001000602010006020100060301000603010006020100060101040601
-010406040100060201000602010006010100060201000608010006000100060001000601
-01000602010006010100060001000600010006d101000601010006090104060401000602
-010006020100060101000602010006010100060201000601010006020100061001000601
-010006880300020204010301020204000601000106060901060701000602010006040100
-060201000602010006010104060c01000602010006010100060201020604010006030104
-060101000600010006000100060801000602010006010100060501000602010006010100
-060501040602010206030102060201040602010206310001060609010607010006020100
-060101000602010006030100060301000602010006080100060201000604010006020100
-060201000601010406080100060101010601010406010100060001000600010006d00105
-060801000602010006040100060201000602010006010100060201000601010406010100
-060201000610010006010100068803000202040103010202040006010001060609010607
-01000602010006040100060201000602010006010100060c010006020100060301000600
-010006050100060301000603010006050100060001000600010006080100060201000601
-010006050100060201000601010006050100060901000605010006010100060901000630
-000106060901060701040601010006020100060301000603010006020100060801000602
-010006040100060201000602010006010100060c01000601010106010100060501000600
-01000600010006d101000601010006090100060201000604010006020100060201000601
-010006020100060101000605010006020100061001000601010006880300020204010301
-020204000601000106060901060701000602010006040100060201000601010106010100
-060201000608010006020100060301010602010006020100060301000603010006020100
-060101000600010006000100060801010601010006010100060501000602010006010100
-060201000601010006020100060101000602010006010100060201000601010006020100
-060101000602010006300001060609010607010006020100060101000601010106030100
-060301000602010006080100060201000604010006020100060101010601010006020100
-0608010006020100060101000602010006010100060001000600010006d1010006010100
-060901000602010006040100060201000601010106010100060101010601010006020100
-060101000602010006030101060a01000601010006880300020204010301020204000601
-000106060901060701000602010006040100060301010600010006020102060a01020605
-010006030102060501010602010206020100060001000600010006080100060001010602
-010006060102060301020603010206030102060301020603010206030102063100010606
-090106070100060201000602010106000100060401010602010206090100060201000604
-0100060301010600010006020102060901000602010006020102060301000600010006d2
-010006010100060901000602010006040100060301010600010006020101060001000602
-0102060201000602010006030101060b0101068903000202040103010202040006010001
-09080634010006250100066c0001090806ff06ff06060300020204010301020204000601
-00000909063101000600010006260100066c0000090906ff06ff06060300020204010301
-02020400063f01000627010006ff06ff067e03000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040006ff06ff06e803000202040103010202040006ff06ff06e8
-03000202040103010202040003ff03ff03e9020204010301021a0400030002ff02ff02b6
-04000300021a04010301021a0400030002ff02ff02b604000300021a04010301021a0400
-030002ff02ff02b604000300021a04010301041b030004ff04ff04b70300041c030004ff
-04ff04f3
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 22 377 234
-%%EOF
diff --git a/lib/pman/doc/src/note.gif b/lib/pman/doc/src/note.gif
deleted file mode 100644
index 6fffe30419..0000000000
--- a/lib/pman/doc/src/note.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/doc/src/notes.xml b/lib/pman/doc/src/notes.xml
deleted file mode 100644
index 4e9663c916..0000000000
--- a/lib/pman/doc/src/notes.xml
+++ /dev/null
@@ -1,211 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman Release Notes</title>
- <prepared>otp_appnotes</prepared>
- <docno>nil</docno>
- <date>nil</date>
- <rev>nil</rev>
- <file>notes.xml</file>
- </header>
- <p>This document describes the changes made to the Pman application.</p>
-
-<section><title>Pman 2.7.1.4</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Tuple funs (deprecated in R15B) are no longer supported.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-10170</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Pman 2.7.1.3</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Misc build updates</p>
- <p>
- Own Id: OTP-10784</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Pman 2.7.1.2</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The GS applications is now deprecated and will be
- removed in the R16 release. The following GS-based
- applications have been superseded by the Observer
- application and will removed in R16: Appmon, Pman,
- Tv.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-9907</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Pman 2.7.1.1</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Miscellaneous documentation build updates</p>
- <p>
- Own Id: OTP-9813</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Pman 2.7.1</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- The documentation is now built with open source tools
- (xsltproc and fop) that exists on most platforms. One
- visible change is that the frames are removed.</p>
- <p>
- Own Id: OTP-8201</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Pman 2.7</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The copyright notices have been updated.</p>
- <p>
- Own Id: OTP-7851</p>
- </item>
- </list>
- </section>
-
-</section>
-
- <section>
- <title>Pman 2.6</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Some maintenance work to replace deprecated guard
- expressions etc. somehow grew into a larger rewrite of
- parts of the Pman code, fixing some of the more blatant
- errors and removing unused code.</p>
- <p>The default font has been changed, so now the entire text
- on buttons etc. should be visible on most platforms.</p>
- <p>Saving and restoring trace options to/from file now
- works.</p>
- <p>Selecting different sets of processes to hide/view should
- now work in a more consistent and logical way.</p>
- <p>It is now possible to select more than one module or
- process to hide/show.</p>
- <p>Own Id: OTP-6012 Aux Id: OTP-5987 </p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Pman 2.5.3</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Removed some dead code from <c>pman_process</c>.</p>
- <p>Own Id: OTP-6550</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Pman 2.5.2</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Some dead code reported by Dialyzer was eliminated.</p>
- <p>A bug in <c>dbg</c> when tracing to wrap trace files
- has been corrected. It failed to delete any already existing
- wrap trace files with the same names when starting a new
- wrap trace.</p>
- <p>Own Id: OTP-5329</p>
- </item>
- <item>
- <p>The graphic applications now search for HTML
- documentation in the correct place.</p>
- <p>Own Id: OTP-5381</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Pman 2.5.1</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>The Pman 'trace shell' functionality was broken, it has
- now been fixed. Furthermore, Pman could not correctly
- find the pid of the active shell if more than one shell
- process was running on the node. This has also been
- corrected.</p>
- <p>Own Id: OTP-5191</p>
- </item>
- </list>
- </section>
- </section>
-</chapter>
-
diff --git a/lib/pman/doc/src/options.gif b/lib/pman/doc/src/options.gif
deleted file mode 100644
index 18377fbed1..0000000000
--- a/lib/pman/doc/src/options.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/doc/src/options.ps b/lib/pman/doc/src/options.ps
deleted file mode 100644
index b5e2c6a391..0000000000
--- a/lib/pman/doc/src/options.ps
+++ /dev/null
@@ -1,829 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./options.tmp.eps)
-%%CreationDate: (Tue Jun 12 18:04:30 2001)
-%%BoundingBox: 0 53 250 318
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 53 250 318
-userdict begin
-%%BeginData:
-DisplayImage
-0 53
-250.000000 265.000000
-12
-350 371
-1
-0
-0
-8
-ffffff
-000000
-708090
-b03060
-d9d9d9
-808080
-a3a3a3
-000000
-03ff03ff03ff035f04000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400031b040c0392040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000307040c03050400030a040003080404030b0402030d
-0401030104010305040703200403030a040103010401031e040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000308040003020400030204000302
-040003050400030a0400030804010301040103090401030f040103010401030804010322
-040103010401030904010321040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070400030204000302040003020400030504000303
-040203030400030804010302040103010403030104030301040303010401030104010300
-040103000403030704010302040103000401030004030302040303020403030604010303
-04010300040103000401030104030300040103010403030104010300040103020403030a
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000308
-040003020400030204000302040003050400030204040302040003080401030204010300
-040103010401030104010301040103010401030004010301040103000401030104010308
-040103020406030104010300040103010401030004010301040103050401030304010300
-040203000401030104010301040103000401030104010300040203000401030004010301
-040103080400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030704040302040003020400030504000301040603010400030804010302
-040103000401030104010301040103050401030004010301040103000401030104010308
-040103020402030504010300040103040401030104010305040103030401030004010301
-040103010401030104010300040103010401030004010301040103000402030c04000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030804000306
-040003020400030504000301040603010400030804010302040103000405030104010302
-040403000401030104010300040103010401030804010302040103030404030004010304
-040503050401030304010300040103010401030104010301040103000401030104010300
-040103010401030204020309040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070400030604000302040003050400030104060301
-040003080401030204010300040103050401030104010301040103000401030104010300
-040103010401030804010302040103020401030104010300040103040401030904010303
-040103000401030104010301040103010401030004010301040103000401030104010303
-040203090400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003080400030604000302040003050400030204040302040003080401030104010301
-040103010401030104010301040103010401030004010300040203000401030104010300
-040003060401030204010302040103010401030004010301040103000401030104010306
-040103010401030104020300040103010401030004020300040103010401030004010301
-040103000401030104010308040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003070408030204000305040003030402030304000308
-040403030403030204010302040203000401030004010300040103000401030204010307
-040103020401030304020300040103000403030204030308040303020401030004010303
-04010300040103010403030104010301040103010403030a040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000300040003000400030004000300040003080400030a040003050400030a
-040003660401032904000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-0400030004000300040003070400030a040003050400030a040003660401032a04000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003000400030004000300040003080400030a
-04000305040c036604010329040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000307040c03a604000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-040003000400030004000300040003000400030004000300040003000400030004000300
-04000300040003000400030004000300040003ff03ff03d402ff02ff02bb00ff00ff00ba
-050000ff005b050100ff00ff000e050000ff005b050100b104a80502000204a8000504a8
-0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
-000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a80502
-000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a80005
-04a8050200020407010404080100041601000404010004360100040601000433000504a8
-0502000204090100040a0100041c010004360100043b0005040801040434010004130100
-041a010004060100042b0502000204090100040301000400010104020100040001010403
-010204020100040001010403010204020104040201020402010004000101040301020403
-0102040a0102040201000400010104020104040201020403010204020100040001010403
-01020404010104170005040a01000436010004130100041a010004330502000204090100
-040301010401010004010101040101000401010004020100040101010401010004040100
-040401000403010004020100040101010401010004010100040201000401010004020100
-040801000402010004010101040101000403010004060100040201000402010004010101
-0401010004010100040201000403010104170005040a0100040301000400010104030102
-0403010204030102040a0102040201000402010004010104040101000400010104020100
-040201000401010404090102040201000400010104020104040201020403010204020100
-040001010403010204040101040f05020002040901000403010004020100040101000402
-010004010100040201000401010004080100040401000407010004010100040201000401
-010004050100040201000408010004020100040101000402010004030100040601000402
-01000402010004010100040201000401010004210005040a010004030101040101000401
-010004020100040101000402010004010100040201000408010004020100040101000402
-0100040301000403010104010100040101000402010004030100040a0100040201000401
-010104010100040301000406010004020100040201000401010104010100040101000402
-010004030101040f05020002040901000403010004020100040101000402010004010104
-040101000408010004040100040401030401010004020100040101000405010404080100
-040201000401010004020100040301000406010004020100040201000401010004020100
-04020102041e0005040a0100040301000409010004010100040501000402010004080100
-040201000401010004020100040301000403010004020100040101000402010004030100
-040a01000402010004010100040201000403010004060100040201000402010004010100
-040201000401010004190502000204090100040301000402010004010100040201000401
-010004050100040801000404010004030100040201000401010004020100040101000405
-0100040c0100040201000401010004020100040301000406010004020100040201000401
-01000402010004050100041d0005040a0100040301000406010304010100040501040408
-010004020100040101000402010004030100040301000402010004010100040201000403
-0100040a0100040201000401010004020100040301000406010004020100040201000401
-010004020100040201020416050200020409010004030100040201000401010004020100
-040101000402010004010100040801000404010004030100040201000401010004020100
-040101000402010004010100040201000408010004020100040101010401010004030100
-040601000402010004020100040101000402010004010100040201000403010104170005
-040a01000403010004050100040201000401010004050100040c01000402010004010100
-04020100040301000403010004020100040101000402010004030100040a010004020100
-040101000402010004030100040601000402010004020100040101000402010004050100
-041505020002040701040401010004020100040101000402010004020102040201000408
-0100040501010402010304010100040201000402010204030102040a0102040201000400
-01010405010104040100040301020402010004020100040201020404010104170005040a
-010004030100040501000402010004010100040201000401010004020100040801000402
-01000401010004010101040301000403010104010100040101000401010104030100040a
-010004020100040101010401010004030100040601000402010004020100040101000402
-0100040101000402010004030101040f050200020462010004440005040a010004030100
-040601030402010204030102040a01020403010104000100040401010401010004000101
-040301010400010004040101040901020402010004000101040501010404010004030102
-04020100040201000402010204040101040f050200020462010004440005044701000421
-0100043c0502000204620100044400050447010004210100043c0502000204a800050447
-010004210100043c0502000204a8000504a80502000204a8000504a80502000204a80005
-04a80502000204a8000504a80502000204a8000504a80502000204a8000504a805020002
-04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
-0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
-000504a8050200020408050a04070104040801000416010004040100045f000504a80502
-000204080509000004090100040a0100041c0100045f000504a805020002040805010306
-000104090100040301000400010104020100040001010403010204020100040001010403
-010204020104040901020402010004000101040a01020402010004000101040301020402
-0100040201000401010004000101041f000504a805020002040805010306000104090100
-040301010401010004010101040101000401010004020100040101010401010004040100
-04040100040a010004020100040101010401010004080100040201000401010104010100
-040101000402010004010100040201000401010104010100041e00050409050a04070104
-043d01000447050200020408050103060001040901000403010004020100040101000402
-01000401010004020100040101000408010004040100040a010004020100040101000402
-010004080100040501000402010004050100040101000400010004000100040101000402
-0100041e000504090509000004090100043f010004470502000204080501030600010409
-01000403010004020100040101000402010004010104040101000408010004040100040a
-010004020100040101000402010004090102040201000402010004020103040101000400
-0100040001000401010004020100041e0005040905010306000104090100040301000400
-0101040301020403010204030102040a0102040301020402010004000101040301010400
-010004470502000204080501030600010409010004030100040201000401010004020100
-04010100040501000408010004040100040a0100040201000401010004020100040c0100
-040101000402010004010100040201000401010004000100040001000401010004020100
-041e00050409050103060001040901000403010104010100040101000402010004010100
-040201000401010004020100040801000402010004010100040201000401010104010100
-040101000401010104470502000204080501030600010409010004030100040201000401
-0100040201000401010004020100040101000408010004040100040a0100040201000401
-010004020100040801000402010004010101040101000401010004020100040101000400
-0100040001000401010004020100041e0005040905010306000104090100040301000409
-010004010100040501000402010004080100040501000402010004010100040201000401
-010004020100044705020002040805010306000104070104040101000402010004010100
-040201000402010204020100040801000405010104090102040201000402010004090102
-04020100040001010403010304020100040001000402010004020100041e000504090501
-030600010409010004030100040601030401010004050104040901020402010404010100
-040201000401010004020100044705020002040805010008045b01000437000504090501
-030600010409010004030100040501000402010004010100040501000410010004010100
-04050100040201000401010004020100044705020002040805000009045b010004370005
-040905010306000104090100040301000405010004020100040101000402010004010100
-040201000408010004020100040101000402010004010100040201000401010004010101
-044705020002046f01000437000504090501030600010409010004030100040601030402
-010204030102040a01020403010204020100040201000402010104000100044705020002
-04a8000504090501000804930502000204a8000504090500000904930502000204a80005
-04a80502000204a8000504a805020002041b0501048a000504a805020002041a0503040e
-01000404010204030102046a000504a80502000204190505040d01000406010004050100
-046a000504a8050200020418050203010502040b0100040001000405010004050100040a
-010204020100040001010403010204020100040201000401010004000101040301020439
-000504a8050200020417050203030502040a010004000100040501000405010004090100
-040201000401010104010100040101000402010004010100040201000401010104010100
-04010100040201000438000504a805020002041605020305050204090100040001000405
-010004050100040901000405010004020100040501000401010004000100040001000401
-01000402010004010100043c000504a80502000204150002030700020407010004020100
-0404010004050100040a0102040201000402010004020103040101000400010004000100
-0401010004020100040201020439000504a8050200020416000203050002040801040404
-010004050100040d01000401010004020100040101000402010004010100040001000400
-0100040101000402010004050100043800050409050a0407010404430100044105020002
-041700020303000204090100040201000404010004050100040901000402010004010101
-040101000401010004020100040101000400010004000100040101000402010004010100
-0402010004380005040905090000040901000488050200020418000203010002040a0100
-040201000404010004050100040a01020402010004000101040301030402010004000100
-040201000402010004020102043900050409050103060001040901000403010004000101
-040301020403010204030102040901000400010104030102040301020403010204030102
-04020100040201000402010204330502000204190005042e010004580005040905010306
-000104090100040301010401010004010100040201000401010004020100040101000402
-010004080101040101000401010004020100040101000402010004010100040201000404
-010004020100040201000401010004020100043205020002041a0003042f010004580005
-040905010306000104090100040301000409010004010100040501000402010004080100
-040501000402010004010100040501000402010004040100040201000402010004010100
-04020100043205020002041b000104300100045800050409050103060001040901000403
-010004060103040101000405010404080100040501040401010004050104040401000403
-0100040001000402010404320502000204a8000504090501030600010409010004030100
-04050100040201000401010004050100040c010004050100040501000405010004080100
-04030100040001000402010004360502000204a800050409050103060001040901000403
-010004050100040201000401010004020100040101000402010004080100040501000402
-010004010100040201000401010004020100040401000404010004030100040201000432
-0502000204a8000504090501030600010409010004030100040601030402010204030102
-0409010004060102040301020403010204050100040401000404010204330502000204a8
-000504090501000804930502000204a80005040905000009049305020002041b0001048a
-000504a805020002041a0003040c01040404010004120100044301020416000504a80502
-000204190005040b0100041c0100044501000416000504a8050200020418000204010002
-040a01000406010204020100040001010403010204020104040901020402010004000101
-0403010204020100040201000401010004000101040a0102040201000400010104050100
-0402010004020100040e000504a805020002041700020403000204090100040801000402
-010104010100040101000402010004030100040a01000402010004010101040101000401
-010004020100040101000402010004010101040101000408010004020100040101010401
-0100040401000402010004020100040e000504a805020002041600020405000204080103
-04050100040201000405010004070100040a010004050100040201000405010004010100
-040001000400010004010100040201000408010004020100040101000402010004040100
-0403010004010100040e000504a805020002041505020407050204070100040801000402
-01000406010204040100040b010204020100040201000402010304010100040001000400
-010004010100040201000408010004020100040101000402010004040100040301000401
-0100040e000504a805020002041605020405050204080100040801000402010004090100
-04030100040e010004010100040201000401010004020100040101000400010004000100
-040101000402010004080100040201000401010004020100040401000404010004000100
-040e000504a8050200020417050204030502040901000408010004020100040501000402
-010004030100040a01000402010004010101040101000401010004020100040101000400
-010004000100040101000402010004080100040201000401010004020100040401000404
-0101040f00050409000a04070104042701010418010004060100043a0502000204180502
-04010502040a010004080100040201000406010204050101040901020402010004000101
-040301030402010004000100040201000402010004090102040201000402010004040100
-04050100040f00050409000905000409010004280100041a010004420502000204190505
-043c010004390100040f0005040900010406050104090100040301000400010104030102
-0403010204030102040b0100040301000402010004010100040001010403010204020104
-0402010204030102040201000400010104030102042505020002041a0503043d01000436
-010004000100041000050409000104060501040901000403010104010100040101000402
-010004010100040201000401010004020100040801040401010004020100040101010401
-010004010100040201000403010004060100040201000402010004010101040101000401
-010004020100042405020002041b0501043e010004370100041100050409000104060501
-040901000403010004090100040101000405010004020100040a01000403010004020100
-040101000402010004010100040701000406010004020100040201000401010004020100
-0401010004280502000204a8000504090001040605010409010004030100040601030401
-010004050104040a01000403010004020100040101000402010004010100040701000406
-0100040201000402010004010100040201000402010204250502000204a8000504090001
-04060501040901000403010004050100040201000401010004050100040e010004030100
-040201000401010004020100040101000407010004060100040201000402010004010100
-040201000405010004240502000204a80005040900010406050104090100040301000405
-01000402010004010100040201000401010004020100040a010004030100040101010401
-010004020100040101000402010004030100040601000402010004020100040101000402
-0100040101000402010004240502000204a8000504090001040605010409010004030100
-040601030402010204030102040b01000404010104000100040101000402010004020102
-04050101040401000403010204020100040201000402010204250502000204a800050409
-0001050804930502000204a8000504090000050904930502000204a8000504a805020002
-04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
-0502000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a8
-000504a80502000204a800050409000a040701040442010004420502000204a800050409
-00090500040901000444010004420502000204a800050409000104060501040901000403
-010004000101040301020403010204030102040a01020402010004020100040201020402
-0100040001010402010404020102043a0502000204a80005040900010406050104090100
-040301010401010004010100040201000401010004020100040101000402010004080100
-040201000401010004020100040101000402010004010101040101000403010004030100
-0402010004390502000204a8000504090001040605010409010004030100040901000401
-010004050100040201000408010004020100040101000402010004010100040201000401
-0100040201000403010004030100043d0502000204a80005040900010406050104090100
-040301000406010304010100040501040408010404020100040001000402010404010100
-040201000403010004040102043a0502000204a800050409000104060501040901000403
-010004050100040201000401010004050100040c01000406010004000100040201000405
-010004020100040301000407010004390502000204a80005040900010406050104090100
-040301000405010004020100040101000402010004010100040201000408010004020100
-040301000403010004020100040101000402010004030100040301000402010004390502
-00020408050a040701040408010004160100040401000420010204050100040901000429
-000504090001040605010409010004030100040601030402010204030102040a01020404
-01000404010204020100040201000404010104020102043a050200020408050900000409
-0100040a0100041c01000422010004100100042900050409000105080493050200020408
-050103060001040901000403010004000101040201000400010104030102040201000400
-01010403010204020104040901020402010004000101040c010004030102040201000400
-010104020100040101000426000504090000050904930502000204080501030600010409
-010004030101040101000401010104010100040101000402010004010101040101000404
-010004040100040a0100040201000401010104010100040b010004050100040201010401
-010004010100040001000427000504a80502000204080501030600010409010004030100
-0402010004010100040201000401010004020100040101000408010004040100040a0100
-040201000401010004020100040b01000405010004020100040201000401010104280005
-04a805020002040805010306000104090100040301000402010004010100040201000401
-0104040101000408010004040100040a0100040201000401010004020100040b01000405
-01000402010004020100040101010428000504a805020002040805010306000104090100
-0403010004020100040101000402010004010100040501000408010004040100040a0100
-040201000401010004020100040b01000405010004020100040201000401010004000100
-0427000504a8050200020408050103060001040901000403010004020100040101000402
-01000401010004020100040101000408010004040100040a010004020100040101000402
-0100040b010004050100040201000402010004010100040101000426000504a805020002
-040805010306000104070104040101000402010004010100040201000402010204020100
-0408010004050101040901020402010004020100040b0100040501000402010004020100
-04010100040201000425000504a8050200020408050100080494000504a8050200020408
-050000090494000504a80502000204a8000504a80502000204a8000504a80502000204a8
-000504a80502000204a8000504a80502000204a8000504a805020002041b0501048a0005
-04a805020002041a0503040e01000404010204030102040a01020405010004090100044a
-000504a80502000204190505040d01000406010004050100040c010004100100044a0005
-04a8050200020418050203010502040b0100040001000405010004050100040c01000403
-010204020100040001010402010004010100040301020440000504a80502000204170502
-03030502040a0100040001000405010004050100040c0100040501000402010104010100
-04010100040001000403010004020100043f000504a80502000204160502030505020409
-0100040001000405010004050100040c0100040501000402010004020100040101010404
-01000443000504a805020002041500020307000204070100040201000404010004050100
-040c010004050100040201000402010004010101040501020440000504a8050200020416
-000203050002040801040404010004050100040c01000405010004020100040201000401
-01000400010004070100043f000504a80502000204170002030300020409010004020100
-0404010004050100040c0100040501000402010004020100040101000401010004020100
-04020100043f000504a8050200020418000203010002040a010004020100040401000405
-0100040c01000405010004020100040201000401010004020100040201020440000504a8
-05020002041900050488000504a805020002041a00030489000504a805020002041b0001
-048a000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
-0502000204a8000504a80502000204a8000504a805020002041b0001048a000504a80502
-0002041a0003040c01040404010004120100040b01020405010004090100041b0102041d
-000504a80502000204190005040b0100041c0100040d010004100100041d0100041d0005
-04a8050200020418000204010002040a0100040601020402010004000101040301020402
-0104040b01000403010204020100040001010402010004010100040a0102040201000400
-01010405010004020100040201000415000504a805020002041700020403000204090100
-040801000402010104010100040101000402010004030100040d01000405010004020101
-040101000401010004000100040a01000402010004010101040101000404010004020100
-040201000415000504a80502000204160002040500020408010304050100040201000405
-010004070100040d010004050100040201000402010004010101040b0100040201000401
-0100040201000404010004030100040101000415000504a8050200020415050204070502
-0407010004080100040201000406010204040100040d0100040501000402010004020100
-04010101040b010004020100040101000402010004040100040301000401010004150005
-04a80502000204160502040505020408010004080100040201000409010004030100040d
-01000405010004020100040201000401010004000100040a010004020100040101000402
-01000404010004040100040001000415000504a805020002041705020403050204090100
-0408010004020100040501000402010004030100040d0100040501000402010004020100
-040101000401010004090100040201000401010004020100040401000404010104160005
-04a8050200020418050204010502040a010004080100040201000406010204050101040b
-010004050100040201000402010004010100040201000409010204020100040201000404
-0100040501000416000504a80502000204190505047001000416000504a805020002041a
-0503046e0100040001000417000504a805020002041b0501047001000418000504a80502
-000204a8000504a80502000204a8000504a80502000204a8000504a80502000204a80005
-04a80502000204a8000504a80502000204a8000504a80502000204a8000504a805020002
-04a8000504a80502000204a8000504a80502000204a8000504a80502000204a8000504a8
-0502000204a8000504a80502000204a8000505ab000205a8000405ac000105a9000305ad
-000005aa00ff00ff00ff00ff001f04ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff04570005040f01040434010004130100041a01000406010004d3
-0005041101000436010004130100041a010004db00050411010004030100040001010403
-01020403010204030102040a010204020100040201000401010404010100040001010402
-010004020100040101040409010204020100040001010402010404020102040301020402
-010004000101040301020404010104b70005041101000403010104010100040101000402
-010004010100040201000401010004020100040801000402010004010100040201000403
-01000403010104010100040101000402010004030100040a010004020100040101010401
-010004030100040601000402010004020100040101010401010004010100040201000403
-010104b70005041101000403010004090100040101000405010004020100040801000402
-01000401010004020100040301000403010004020100040101000402010004030100040a
-010004020100040101000402010004030100040601000402010004020100040101000402
-01000401010004c100050411010004030100040601030401010004050104040801000402
-01000401010004020100040301000403010004020100040101000402010004030100040a
-010004020100040101000402010004030100040601000402010004020100040101000402
-01000402010204be0005041101000403010004050100040201000401010004050100040c
-010004020100040101000402010004030100040301000402010004010100040201000403
-0100040a0100040201000401010004020100040301000406010004020100040201000401
-0100040201000405010004bd000504110100040301000405010004020100040101000402
-010004010100040201000408010004020100040101000401010104030100040301010401
-0100040101000401010104030100040a0100040201000401010104010100040301000406
-01000402010004020100040101000402010004010100040201000403010104b700050411
-010004030100040601030402010204030102040a01020403010104000100040401010401
-010004000101040301010400010004040101040901020402010004000101040501010404
-0100040301020402010004020100040201020404010104b70005044e01000421010004e4
-0005044e01000421010004e40005044e01000421010004e4000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff045700050416050104ff043e000504150503040c010404190100
-040d010004ff0401000504140505040d0100042a010004ff040100050413050203010502
-040c01000403010004000101040901000402010004020102040201000400010104030101
-0400010004020102040201000402010004f300050412050203030502040b010004030101
-040101000408010004020100040401000402010104010100040101000401010104010100
-04020100040101000402010004f300050411050203050502040a01000403010004020100
-040801000400010004000100040401000402010004020100040101000402010004010100
-0402010004010100040001000400010004f3000504100002030700020409010004030100
-040201000408010004000100040001000404010004020100040201000401010004020100
-040101000402010004010100040001000400010004f300050411000203050002040a0100
-040301000402010004080100040001000400010004040100040201000402010004010100
-04020100040101000402010004010100040001000400010004f300050412000203030002
-040b01000403010004020100040801000400010004000100040401000402010004020100
-0401010004010101040101000402010004010100040001000400010004f3000504130002
-03010002040a010404010100040201000409010004000100040501000402010004020100
-040201010400010004020102040301000400010004f400050414000504ff043c00050415
-000304ff043d00050416000104ff043e000504ff0457000504ff0457000504ff04570005
-04ff0457000504ff0457000504ff040600470408000504ff040600460500040800050467
-058d0410000104430501040800050467058c000004100001044305010408000504670501
-048900010410000104430501040800050467050104890001041000010443050104080005
-04160001044e0501048900010410000104070602043805010408000504150003040c0104
-041201010404010004030102041905010489000104100001040706000401060004370501
-0408000504140005040d010004130100040d010004190501048900010410000104070600
-040106000402060004000601040306020402060004020600040206020403060204140501
-040800050413000204010002040c010004040102040b0100040401020405010004030102
-041205010489000104100001040706000401060004020601040106000401060004020600
-040106000402060004010600040206000401060004020600041305010408000504120002
-04030002040b010004030100040201000408010404040100040501000402010004020100
-041105010489000104100001040706030402060004050600040206000401060004000600
-0400060004010600040506000402060004130501040800050411000204050002040a0100
-0403010004020100040a0100040601000405010004020100040201000411050104890001
-041000010407060004020600040106000405060004020600040106000400060004000600
-040206020402060404130501040800050410050204070502040901000403010004020100
-040a01000406010004050100040201040411050104890001041000010407060004020600
-040106000405060004020600040106000400060004000600040506000401060004170501
-040800050411050204050502040a01000403010004020100040a01000406010004050100
-040201000415050104890001041000010407060004020600040106000405060004020600
-040106000400060004000600040106000402060004010600040206000403060104040601
-040406010501040800050412050204030502040b01000403010004020100040a01000406
-010004050100040201000402010004110501048900010410000104070603040206000406
-060204030600040006000403060204030602040406010404060104040601050104080005
-0413050204010502040c010004040102040b010004060100040501000403010204120501
-0489000104100001044305010408000504140505044c0501048900010410000104430501
-0408000504150503044d05010489000104100001044305010408000504160501044e0501
-048900010410000104430501040800050467050104890001041000010443050104080005
-04670501008b04100001044305010408000504670500008c041000010443050104080005
-04ff0406000105450408000504ff0406000005460408000504ff0457000504ff04570005
-04ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff04570005
-04ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff04570005
-04ff0457000504ff0457000504ff0457000505ff0557000405ff0558000305ff055900ff
-00ff00ff00ff001f04ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff04570005044c003b044b003b04460005044c003a
-0500044b003a050004460005044c000104370501044b00010437050104460005044c0001
-04370501044b00010437050104460005044c000104370501044b00010437050104460005
-044c000104370501044b00010437050104460005044c000104370501044b000104370501
-04460005044c000104370501044b00010437050104460005044c000104370501044b0001
-0437050104460005044c000104150102040201000402010004160501044b000104070102
-041f01020409050104460005044c00010414010004020100040101000401010004170501
-044b00010406010004020100042001000409050104460005044c00010414010004020100
-040101000400010004180501044b00010406010004020100040201020402010004000101
-0403010204030102040501000409050104460005044c0001041401000402010004010101
-04190501044b000104060100040501000402010004010101040101000401010004020100
-0401010004020100040401000409050104460005044c0001041401000402010004010100
-0400010004180501044b0001040601000409010004010100040201000401010004050100
-04020100040401000409050104460005044c000104140100040201000401010004010100
-04170501044b000104060100040601030401010004020100040101000405010404040100
-0409050104460005044c00010414010004020100040101000401010004170501044b0001
-040601000402010004010100040201000401010004020100040101000405010004080100
-0409050104460005044c00010414010004020100040101000402010004160501044b0001
-040601000402010004010100040201000401010004020100040101000402010004010100
-04020100040401000409050104460005044c000104150102040201000402010004160501
-044b00010407010204030103040101000402010004020102040301020405010004090501
-04460005044c000104370501044b00010437050104460005044c000104370501044b0001
-0437050104460005044c000104370501044b00010437050104460005044c000104370501
-044b00010437050104460005044c000104370501044b00010437050104460005044c0001
-04370501044b00010437050104460005044c000104370501044b00010437050104460005
-044c000104370501044b00010437050104460005044c000104370501044b000104370501
-04460005044c000104370501044b00010437050104460005044c00010539044b00010539
-04460005044c0000053a044b0000053a0446000504ff0457000504ff0457000504ff0457
-000504ff0457000504ff0457000504ff045700010500000204ff045700000501000204ff
-0457
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 53 250 318
-%%EOF
diff --git a/lib/pman/doc/src/part.xml b/lib/pman/doc/src/part.xml
deleted file mode 100644
index 140d7bc3c8..0000000000
--- a/lib/pman/doc/src/part.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman User's Guide</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <description>
- <p>The process manager <em>Pman</em> is a graphical tool used to
- inspect the Erlang processes executing either locally or on remote
- nodes. It is also possible to trace events in the individual processes.</p>
- </description>
- <xi:include href="pman_chapter.xml"/>
-</part>
-
diff --git a/lib/pman/doc/src/part_notes.xml b/lib/pman/doc/src/part_notes.xml
deleted file mode 100644
index e9465d7502..0000000000
--- a/lib/pman/doc/src/part_notes.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman Release Notes</title>
- <prepared></prepared>
- <docno></docno>
- <date>2004-09-07</date>
- <rev>1.0</rev>
- <file>part_notes.sgml</file>
- </header>
- <description>
- <p>The process manager <em>Pman</em> is a graphical tool used to
- inspect the Erlang processes executing either locally or on remote
- nodes. It is also possible to trace events in the individual
- processes.</p>
- </description>
- <xi:include href="notes.xml"/>
-</part>
-
diff --git a/lib/pman/doc/src/pman.xml b/lib/pman/doc/src/pman.xml
deleted file mode 100644
index db1a43065c..0000000000
--- a/lib/pman/doc/src/pman.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE erlref SYSTEM "erlref.dtd">
-
-<erlref>
- <header>
- <copyright>
- <year>1996</year>
- <year>2013</year>
- <holder>Ericsson AB, All Rights Reserved</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- The Initial Developer of the Original Code is Ericsson AB.
- </legalnotice>
-
- <title>pman</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <module>pman</module>
- <modulesummary>A graphical process manager.</modulesummary>
- <description>
- <warning>
- <p>
- The Pman application has been superseded by the Observer application.
- Pman will be removed in R16.
- </p>
- </warning>
- <p>A graphical tool used to inspect the Erlang processes executing either
- locally or on remote nodes. It is also possible to trace events in
- the individual processes.</p>
- </description>
- <funcs>
- <func>
- <name>start()</name>
- <name>start(Excluded)</name>
- <name>start_notimeout()</name>
- <name>start_notimeout(Excluded)</name>
- <fsummary>Start Pman.</fsummary>
- <type>
- <v>Excluded = [Module]</v>
- <v>&nbsp;Module = atom()</v>
- </type>
- <desc>
- <p>Starts Pman. It will use the previously saved trace settings
- in <c>HOME/.erlang_tools/pman.opts</c>, where <c>HOME</c> is
- the user's home directory, if such a file exists. Otherwise
- standard trace settings will be used. The return value should
- be ignored.</p>
- <p><c>Excluded</c> is a list of module names. If the argument is
- present, processes currently executing in any of these modules
- will not be shown by Pman.</p>
- <p><c>start/0,1</c> will fail unless the start-up succeeds
- within 20 seconds, whereas <c>start_notimeout/0,1</c> will
- wait indefinitely.</p>
- </desc>
- </func>
- <func>
- <name>proc(Process)</name>
- <name>proc(A, B, C)</name>
- <fsummary>Start a Pman trace window.</fsummary>
- <type>
- <v>Process = pid() | atom()</v>
- <v>A = B = C = integer()</v>
- </type>
- <desc>
- <p>Starts a Pman trace window for the specified process.
- The return value should be ignored.</p>
- <p>The process to trace is given either by its pid or by its
- registered name. It is also possible to use <c>proc/3</c>
- to trace the pid represented as <c><![CDATA[<A,B,C>]]></c>.</p>
- </desc>
- </func>
- </funcs>
-</erlref>
-
diff --git a/lib/pman/doc/src/pman_chapter.xml b/lib/pman/doc/src/pman_chapter.xml
deleted file mode 100644
index d0b50c58f8..0000000000
--- a/lib/pman/doc/src/pman_chapter.xml
+++ /dev/null
@@ -1,377 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- <file>pman_chapter.xml</file>
- </header>
- <marker id="here"></marker>
-
- <section>
- <title>Introduction</title>
- <warning>
- <p>
- The Pman application has been superseded by the Observer application.
- Pman will be removed in R16.
- </p>
- </warning>
- <p>The process manager Pman is a tool for viewing processes executing
- locally or on remote nodes. Its main purpose is to locate
- erroneous code by inspecting the state of the processes and by tracing
- events. Bottlenecks, unread messages, and bad memory handling are
- some of the problems that can be solved with Pman.</p>
- <p>Processes may be inspected individually in a process trace
- window. There the user may dynamically follow the execution of a
- process by getting trace output for sent and received messages
- as well as for called functions and some other process
- events. Information about source code modules executed by the
- processes is also accessible. Note that Pman has some effect on
- the real time behavior of a running system.</p>
- </section>
-
- <section>
- <title>Getting Started with Pman</title>
- <p>Start Pman by calling <c>pman:start()</c>. It will start
- the <seealso marker="#main_win">Main Window</seealso>, showing an
- overview of all processes running at the current node.</p>
- <p>To trace a certain process, select it by clicking on its line and
- then chose Trace-&gt;Selected Process, or simply double-click it. This
- will open a <seealso marker="#trace_win">Trace Window</seealso>.
- In the Trace Window, there is some information about the process
- and traced events are added dynamically.</p>
- <p>Which events to trace are selected in
- the <seealso marker="#options_win">Options Window</seealso> which
- is opened by choosing File-&gt;Options... in the Main Window or in a
- Trace Window. Currently supported trace events are message sending,
- message receiving, function calls and process events.</p>
- <p>It is possible to by-pass the Main Window and open a Trace
- Window directly for the process <c>Pid</c> by calling
- <c>pman:proc(Pid)</c>.</p>
- </section>
-
- <section>
- <marker id="main_win"></marker>
- <title>The Main Window</title>
- <p>The Main Window shows all processes running at the displayed node.
- The window is automatically updated every 5 seconds.
- Select which node to display in the window by choosing the node name
- from the Nodes menu.</p>
- <image file="main_window.gif">
- <icaption>The Main Window.</icaption>
- </image>
- <p>A process can be selected by clicking on its line. The selected
- process is highlighted. Use the arrow keys to move up and down in
- the process overview.</p>
- <p>The following information is displayed for each process:</p>
- <list type="bulleted">
- <item>Pid - process identifier.</item>
- <item>Current Function - the function (<c>Module:Function/Arity</c>)
- the process is currently executing.</item>
- <item>Name - registered name of the process, if any.</item>
- <item>Msgs - number of messages in the process' mailbox.</item>
- <item>Reds - number of reductions performed. Gives a rough estimate
- of the process' work load.</item>
- <item>Size - estimated size of the process, in words, calculated by
- adding the stack size and the heap size.</item>
- </list>
- <p>At the bottom of the window the following functions and
- information can be found:</p>
- <taglist>
- <tag><em>Hide System Processes</em></tag>
- <item>This check button controls the display of what Pman consider
- <em>system processes</em>, that is, processes Pman knows are part
- of Erlang/OTP rather than the user's application.
- If the button is selected, these system processes will not be
- shown.</item>
- <tag><em>Auto-Hide New</em></tag>
- <item>This check button controls the treatment of newly created
- processes. If it is selected, new processes will not be shown.</item>
- <tag><em># Hidden</em></tag>
- <item>This label displays the number of processes currently
- executing that are not shown in the process overview.</item>
- </taglist>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Options...</em></tag>
- <item>Open the <seealso marker="#options_win">Options Window</seealso>
- which allows the user to set the trace options to use.</item>
- <tag><em>Save Options</em></tag>
- <item>Save the options set using the Options Window. The options are
- stored to the file <c>HOME/.erlang_tools/pman.opts</c>, where
- <c>HOME</c> is the user's home directory, and are automatically
- loaded the next time Pman is started.</item>
- <tag><em>Exit</em></tag>
- <item>Stop Pman.</item>
- </taglist>
- </section>
-
- <section>
- <title>The View Menu</title>
- <p>This menu mainly contains buttons for controlling what to
- display in the Main Window. Note that the View Menu overrides
- the settings of the check buttons (Hide System processes, Auto-Hide
- new) in the Main Window.</p>
- <taglist>
- <tag><em>Hide All Processes</em></tag>
- <item>Hide all processes.</item>
- <tag><em>Hide Modules...</em></tag>
- <item>Opens a dialog window with all loaded modules. If the user
- selects a window and clicks OK, the process overview will not
- show any processes running code from those modules.</item>
- <tag><em>Hide Selected Processs</em></tag>
- <item>Hide the selected process.</item>
- <tag><em>Module Info...</em></tag>
- <item>Given a selected process currently executing a function in
- the module <c>Module</c>, this menu button opens a window
- showing information about the module as returned from
- <c>Module:module_info()</c>.</item>
- <tag><em>Refresh</em></tag>
- <item>Updates the process overview.</item>
- <tag><em>Show All Processes</em></tag>
- <item>Show all processes, except system processes and/or new
- processes if <em>Hide System Processes</em> and/or
- <em>Auto-Hide New</em> is selected.</item>
- <tag><em>Show Processes...</em></tag>
- <item>Opens a dialog window with all hidden processes. If
- the user selects a process and clicks OK, the process
- overview will show that process.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Trace Menu</title>
- <taglist>
- <tag><em>Kill</em></tag>
- <item>Terminates the selected process by calling
- <c>exit(Pid,kill)</c>.</item>
- <tag><em>Trace Selected Process</em></tag>
- <item>Opens a Trace Window for the selected process. Tracing
- will start immediately with the default trace flags set from
- the Main Window.</item>
- <tag><em>Shell Process</em></tag>
- <item>Opens a Trace Window for the shell process of node Pman
- was started at (not the displayed node). If the shell process
- dies, the opened Trace Window will find the pid of
- the automatically started new shell process, and continue to
- trace that process.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Nodes Menu</title>
- <p>The Nodes menu contains one entry for each known node.
- By selecting a node from the Nodes menu, the process overview
- window will change its view, and display the processes running
- on that node.</p>
- </section>
-
- <section>
- <title>The Help Menu</title>
- <taglist>
- <tag><em>Help</em></tag>
- <item>Selecting Help from the Help menu will cause the HTML
- version of the Pman User's Guide (this document) to be
- displayed. Currently this function requires Netscape to be up
- and running.</item>
- </taglist>
- </section>
- </section>
-
- <section>
- <marker id="trace_win"></marker>
- <title>The Trace Window</title>
- <p>A Trace Window outputs trace information for a traced process.
- A Trace Window automatically uses the trace options set in
- the Main Window, but it is also possible to change the options for
- each Trace Window individually.</p>
- <image file="trace.gif">
- <icaption>The Trace Window.</icaption>
- </image>
- <p>There is no limit to how many Trace Windows can be open at the same
- time. However, notice that if more processes are traced,
- the performance degradation of the system will be more noticeable.</p>
- <p>The following information is displayed, where applicable:</p>
- <list type="bulleted">
- <item>initial call - the function (<c>Module:Function/Arity</c>)
- the process started executing in.</item>
- <item>current function - the function (<c>Module:Function/Arity</c>)
- the process is currently executing.</item>
- <item>messages - the messages in the mailbox.</item>
- <item>dictionary - the contents of the process dictionary.</item>
- <item>heap size - heap size in words.</item>
- <item>stack size - stack size in words.</item>
- <item>reductions - number of reductions performed. Gives a rough
- estimate of the process' work load.</item>
- <item>links - list of pids the process is linked to.</item>
- <item>trap_exit - <c>true</c> if the process trap exit signals,
- <c>false</c> otherwise.</item>
- </list>
- <p>In the Trace Window, trace output is continuously added. First in
- each trace message is the pid of the traced process.
- Note that if the inheritance flags for tracing are set, the trace
- output for the spawned/linked processes will be shown in the same
- window as the spawning/linking process.</p>
- <p>Each trace message also has a mnemonic tag:</p>
- <taglist>
- <tag><em>!</em></tag>
- <item>This tag indicates that a message has been sent. Following
- the <c>To:</c> tag will be a pid/name of the receiver. Next,
- following the <c>Msg:</c> tag will be the sent message.</item>
- <tag><em>rec</em></tag>
- <item>This tag indicates that a message has been received.
- Following this will be the received message.</item>
- <tag><em>call</em></tag>
- <item>This tag indicates a call to a function. Following this will be
- the actual call, with all the arguments.</item>
- <tag><em>link</em></tag>
- <item>This tag indicates that a link between the traced process and
- another process has been created. Following this will be the pid
- of the other process.</item>
- <tag><em>spawn</em></tag>
- <item>This tag indicates that the traced process has spawned another
- process. Following this will be the pid of the spawned process.</item>
- <tag><em>exit</em></tag>
- <item>This tag indicates that traced process has exited. Following
- this will be the exit reason.</item>
- </taglist>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Options...</em></tag>
- <item>Opens the <seealso marker="#options_win">Options Window</seealso>
- which allows the user to set the trace options to use for this
- specific Trace Window.</item>
- <tag><em>Save Buffer...</em></tag>
- <item>Opens a dialog that prompts the user for a file name to
- save the current Trace Window contents in.</item>
- <tag><em>Close</em></tag>
- <item>Stops tracing of the process, and closes the Trace Window.</item>
- </taglist>
- </section>
-
- <section>
- <title>The View Menu</title>
- <taglist>
- <tag><em>Clear Buffer</em></tag>
- <item>Clears the contents of the Trace Window.</item>
- <tag><em>Module Info</em></tag>
- <item>Opens a window showing information about the module
- the process is currently executing code from, as returned from
- <c>Module:module_info()</c>.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Trace Menu</title>
- <taglist>
- <tag><em>All Linked Processes</em></tag>
- <item>Opens a Trace Window for each of the processes linked to the
- process being traced in the current Trace Window.</item>
- <tag><em>Linked Process -></em></tag>
- <item>The Linked Process submenu has one entry for each process
- linked to the process being traced in the current Trace Window.
- Select one of the processes to open a new Trace Window for that
- process.</item>
- <tag><em>Kill</em></tag>
- <item>Terminates the process being traced in the current Trace
- Window by calling <c>exit(Pid,kill)</c>.</item>
- </taglist>
- </section>
-
- <section>
- <title>The Help Menu</title>
- <taglist>
- <tag><em>Help</em></tag>
- <item>Selecting Help from the Help menu will cause the HTML version
- of the Pman User's Guide (this document) to be displayed.
- Currently this function requires Netscape to be up and running.</item>
- </taglist>
- </section>
- </section>
-
- <section>
- <marker id="options_win"></marker>
- <title>The Options Window</title>
- <p>The Options Window allows the user to specify the amount of output,
- and the destination of output for traced processes.</p>
- <image file="options.gif">
- <icaption>The Options Window.</icaption>
- </image>
- <p>In the upper left corner of the Options Window, there are check
- buttons for determining what to output in the Trace Window:</p>
- <taglist>
- <tag><em>Trace send</em></tag>
- <item>Select this check button to display information about sent
- messages.</item>
- <tag><em>Trace receive</em></tag>
- <item>Select this check button to display information about received
- messages.</item>
- <tag><em>Trace functions</em></tag>
- <item>Select this check button to display information about
- function calls.</item>
- <tag><em>Trace events</em></tag>
- <item>Select this check button to display information about process
- events, such as spawn, link and exit.</item>
- </taglist>
- <p>In the upper right corner of the dialog, there are options for
- controlling the behaviour of spawned or linked processes:</p>
- <taglist>
- <tag><em>Inherit on spawn</em></tag>
- <item>
- <p>The user may select if spawned processes shall also be traced.
- And if so, if all spawned processes should be traced, or just
- the first spawned process.</p>
- <p>If a spawned process is traced, it will get the same trace
- options that are set for the spawning process. And the output
- will be shown in the same Trace Window as that of the spawning
- process.</p>
- <p>.</p>
- </item>
- <tag><em>Inherit on link</em></tag>
- <item>
- <p>The user may select if a process that is being linked to
- shall be traced. And if so, if all linked processes shall be
- traced, or just the first one linked to.</p>
- <p>If a linked process is traced, it will get the same trace
- options that are set for the linking process. And the output
- will be shown in the same Trace Window as that of the linked
- process.</p>
- </item>
- </taglist>
- <p>In the lower part of the Options Dialog, the user may select
- whether the trace information shall be output to a file, or appear in
- the trace window.</p>
- <p>Sending trace information to a file is more efficient than displaying
- it in the Trace Window. Furthermore, if the amount of trace data is
- large, it will not be lost if tracing to a file. The trace information
- in the Trace Window has an upper limit (approx. 10,000 lines), after
- which the output buffer will be cleared.</p>
- </section>
-</chapter>
-
diff --git a/lib/pman/doc/src/ref_man.xml b/lib/pman/doc/src/ref_man.xml
deleted file mode 100644
index 3b526d86ef..0000000000
--- a/lib/pman/doc/src/ref_man.xml
+++ /dev/null
@@ -1,37 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE application SYSTEM "application.dtd">
-
-<application xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Pman Reference Manual</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev></rev>
- </header>
- <description>
- <p>The process manager <em>Pman</em> is a graphical tool used to
- inspect the Erlang processes executing either locally or on remote
- nodes. It is also possible to trace events in the individual processes.</p>
- </description>
- <xi:include href="pman.xml"/>
-</application>
-
diff --git a/lib/pman/doc/src/toolbar.gif b/lib/pman/doc/src/toolbar.gif
deleted file mode 100644
index 116e32ace8..0000000000
--- a/lib/pman/doc/src/toolbar.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/doc/src/trace.gif b/lib/pman/doc/src/trace.gif
deleted file mode 100644
index 8b34ec7ea0..0000000000
--- a/lib/pman/doc/src/trace.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/doc/src/trace.ps b/lib/pman/doc/src/trace.ps
deleted file mode 100644
index 0828d4ade1..0000000000
--- a/lib/pman/doc/src/trace.ps
+++ /dev/null
@@ -1,1312 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./trace.tmp.eps)
-%%CreationDate: (Tue Jun 12 18:05:00 2001)
-%%BoundingBox: 0 17 377 309
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 17 377 309
-userdict begin
-%%BeginData:
-DisplayImage
-0 17
-377.000000 292.000000
-12
-562 436
-1
-0
-0
-8
-ffffff
-000000
-b24d7a
-dcadc2
-57253b
-d9d9d9
-c3c3c3
-828282
-03ff03ff034e040003ff03f40400031c04000301021a0400030002ff02f304000300021a
-04010301021a0400030002ff02f304000300021a04010301021a0400030002ff02f30400
-0300021a0401030102020418030004ff04f4030004170202040103010202040003ff03ff
-032602020401030102020400030002150400030002ff02db040003000215040003000215
-0400030002020401030102020400030002150400030002ff02db04000300021504000300
-02150400030002020401030102020400030002150400030002ff02db0400030002150400
-030002150400030002020401030102020400030002150400030002ff02db040003000215
-040003000202030f02020400030002020401030102020400030002150400030002ff0263
-000302730400030002150400030002020300020d04000202040003000202040103010202
-04000300021504000300021f000602020001020600010206000102060001020500000209
-0004020100010211000102020001025a0002020a000502040004020c0002022f00010205
-00000212000102110001021b0004020d000102080001023a040003000215040003000202
-0300020d0400020204000300020204010301020204000300021504000300021f00010202
-000202010002020400020205000202060002020400000207000202020000020100010211
-000102020001025800010202000102080000020200020203000002020001020900010202
-0001022d00020204000002120001021100010219000102040000020c000102080001023a
-0400030002150400030002020300020d0400020204000300020204010301020204000300
-021504000300021f00010203000102010002020400020205000002000001020500020204
-0000020700010206000102110001020200010258000102020001020d0001020800010208
-000102020001022d00020204000002120001021100010218000002070000020b00010245
-0400030002150400030002020300020d0400020204000300020204010301020204000300
-021504000300021f00010203000102010000020000000203000302050000020000010205
-000002000001020300000203000102010001020600010200000302050003020200010202
-000102080001020000020204000102000001020200040204000402030003020300040203
-0004020f00000201000102040001020c0001020800010207000102040001020000000211
-000402020001020000030209000002000001020300000204000402040002020000010204
-000302070004020200040204000402030000020300030201000002030004020100010200
-00030203000102010001020400000202000402030004021f040003000215040003000202
-0300020d04000202040003000202040103010202040003000202030f020204000300021f
-000102030001020100000200000102020000020000010204000102000001020500000200
-000202020000020300010201000302040002020200010203000102010001020100010202
-000102080002020100010203000202030001020200010202000102060001020100010201
-000102060001021100010202000102040001020b00010209000102070001020400010201
-0001020e0001020200010201000202020001020800000200000202020000020300010202
-000102020001020100020203000102010001020700010203000102020001020200010202
-000102020000020100010202000002010000020200010205000202020001020200010202
-000002040000020200000202000102010001022304000300020803030208040003000202
-0300020d040002020400030002020401030102020400030002020300020d040002020400
-0300021f0001020200010202000002000001020200000200000102040000020200010204
-000002010001020200000208000402020001020300010202000102030001020000010202
-000102080001020300010202000102030001020400010200000102060001020300010200
-000102060001020f0001020400010204000102080002020a000102080001020400010203
-0001020b0001020400010200000102030001020800000201000102020000020200010204
-000102000001020300010202000102030001020600010202000102040001020000010204
-000102000000020200000202000102010000020100010206000102030001020200010202
-000102020000020700010201000102230400030002080300020104000208040003000202
-0300020d040002020400030002020401030102020400030002020300020d040002020400
-0300021f0005020300000201000102000000020100010203000102020001020400000202
-000102010000020a00030201000102030001020200010203000102000001020200010208
-000102030001020200010203000102040001020000010206000102030001020000030204
-0003020a00020206000102040001020b0001020800000209000102040001020500020208
-000102040001020000010203000102080000020200010201000002020001020400010200
-000102030001020200010203000102060001020200010204000102000001020400010200
-000002010000020200010202000002010001020600010203000102020001020200010202
-00000207000102010003022104000300020803000201040002080400030002020300020d
-040002020400030002020401030102020400030002020300040e020204000300021f0001
-020700000201000102000000020100010203000102020002020300000202000202000000
-020c00020200000102030001020200070200000102020001020800010203000102020001
-020300010204000102000001020600070202000302040003020600020208000102040001
-020c000102060000020a0001020400010207000202060001020400010200000102030001
-020800000202000202000000020200010204000102000001020300010202000702060001
-020200010204000102000001020400010200000002010000020100020201000102010001
-02060001020300010202000102030000020100010204000402030003021f040003000208
-0300040202080400030002020300020d0400020204000300020204010301020204000300
-021504000300021f00010207000002010001020000000201000102030007020300000203
-000102000000020d00010200000102030001020200010206000102020001020800010203
-00010202000102030001020400010200000102060001020a000202050002020700020206
-000102040001020c000102050000020b0001020400010205000202080001020400010200
-000102030001020800000203000102000000020200010204000102000001020300010202
-0001020c0001020200010204000102000001020400010200000002010000020100000200
-000002010000020200010206000102030001020200010203000102000000020300020201
-000102050002021e0400030002150400030002020300020d040002020400030002020401
-0301020204000300021504000300021f0001020700000202000102020001020200010204
-00010203000002040002020d000102000001020300010202000102060001020200010208
-0001020300010202000102030001020400010200000102060001020b000102060001020a
-00010205000102020001020d000102040000020d00010202000102040001020b00010204
-000102000001020300010208000002040002020200010204000102000001020300010202
-0001020c0001020200010204000102000001020400010201000002000002020100020203
-00010206000102030001020200010203000102000000020300010202000102060001021e
-0400030002150400030002020300020d0400020204000300020204010301020204000300
-021504000300021f00010207000002020001020200010202000002060001020200000204
-000202030001020100000203000102010001020300010203000102030000020000010202
-000102080002020100010203000102040001020200010202000102020000020200010203
-000002000000020300010201000002030001020c00010203000102020001020300010202
-0000020200010204000102080001020200010202000102020001020e0001020200010201
-000102030001020800000204000202030001020200010202000102010002020300010203
-000002060001020300010202000102020001020200010202000102030000020700010202
-00000201000102030001020200010204000102040001020200010201000002030001021e
-0400030002150400030002020300020d0400020204000300020204010301020204000300
-021504000300021f00010207000002070001020100010206000102020000020500010203
-000102010005020200010203000102050004020000010202000102080001020000020204
-00010205000402040004020400040200000502020005020f000002040002020500010202
-000402050006020300010204000202030000021100040202000102030001020800000205
-000102040004020400020200000102050004020600010204000402040004020500030209
-000402010001020300010202000102040001020500030200000102000005021f04000300
-02150400030002020300020d040002020400030002020401030102020400030002150400
-03000282000102ff02560400030002150400030002020300020d04000202040003000202
-040103010202040003000215040003000282000102ff0256040003000215040003000202
-0300040e0202040003000202040103010202040003000215040003000282000102ff0256
-0400030002150400030002150400030002020401030102020400030002150400030002ff
-02db04000300021504000300021504000300020204010301020204000300021504000300
-02ff02db04000300021504000300021504000300020204010300040403000416030004ff
-04dc030004160300041603000404030500ff00ff00250304040003010202040000ff00ff
-00240700030002020401030102020400000105ff05ff0521070103000202040103010202
-0400000105ff05ff05210701030002020401030102020400000105ff05ff052107010300
-02020401030102020400000105ff05ff05210701030002020401030102020400000105ff
-05ff052107010300020204010301020204000001050b01040504010005030102051f0100
-05020100050401000526010405ff05860100050201000509010205130701030002020401
-0301020204000001050b0100050f0100051f010005020100052e010005ff058801000502
-0100050b0100051307010300020204010301020204000001050b01000506010205050100
-050301020518010005020100050201020503010205020100050201000519010005030100
-0500010105030102050301020503010205ff056b01000502010005020102050501000502
-010005000101050c07010300020204010301020204000001050b01000508010005050100
-050201000502010005180100050001000505010005020100050201000501010005020100
-051901000503010105010100050101000502010005010100050201000501010005020100
-05ff056a0100050201000501010005020100050401000502010105010100050b07010300
-020204010301020204000001050b01030505010005050100050201000502010005180100
-050001000505010005020100050201000501010005000100050001000519010005030100
-0509010005010100050501000502010005ff056a01040501010005020100050401000502
-010005020100050b07010300020204010301020204000001050b01000508010005050100
-050201040518010005000100050501000502010405010100050001000500010005190100
-0503010005060103050101000505010405ff056a01000502010005010104050401000502
-010005020100050b07010300020204010301020204000001050b01000508010005050100
-05020100051d010005060100050201000505010005000100050001000519010005030100
-0505010005020100050101000505010005ff056e01000502010005010100050801000502
-010005020100050b07010300020204010301020204000001050b01000508010005050100
-050201000502010005190100050601000502010005020100050101000500010005000100
-051901000503010005050100050201000501010005020100050101000502010005ff056a
-0100050201000501010005020100050401000502010105010100050b0701030002020401
-0301020204000001050b0100050801000505010005030102051a01000506010005030102
-0503010005000100051a01000503010005060103050201020503010205ff056b01000502
-010005020102050501000502010005000101050c07010300020204010301020204000001
-05ff05ff05100100050f07010300020204010301020204000001050a0106052a0106052a
-010605ff05840106050e0100050f07010300020204010301020204000001050a0106052a
-0106052a010605ff05840106050e0100050f0701030002020401030102020400000105ff
-05ff05210701030002020401030102020400000105ff05ff052107010300020204010301
-02020400000105ff05ff05210701030002020401030102020400000107ff07ff07230300
-02020401030102020400000007ff07ff072403000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0525
-03000202040103010202040005ff05ff052503000202040103010202040005ff05ff0515
-070f03000202040103010202040005ff05ff0515070f0300020204010301020204000504
-07ff07ff070e05010701060607000605030002020401030102020400050407ff07ff070d
-00000501070106050000070006050300020204010301020204000504070105ff05ff050a
-00010501070106050000070106040300020204010301020204000504070105cf010005ff
-053900010501070106040001070106040300020204010301020204000504070105030100
-050c01000504010005060100050a0102051801020503010205170100050d010205030102
-051f010205120100051501000502010205ff053300010501070106040001050007010603
-030002020401030102020400050407010517010005140100051a01000505010005170100
-050f010005050100052101000512010005140100050201000502010005ff053200010501
-070106030001050107010603030002020401030102020400050407010501010205020100
-050001010503010205020104050201020503010205050100050a01020503010205050100
-0505010005040101050a0102050201000500010105030102050501000505010005040101
-050301020502010005020100050201020505010005020100050201000502010205020104
-050201020502010005000101050501000506010005ff0532000105010701060300010502
-070106020300020204010301020204000504070105030100050201010501010005040100
-050401000506010005020100050201000504010005090100050201000501010005020100
-050401000505010005040101050901000502010005010101050101000501010005020100
-050401000505010005040101050201000502010005010100050201000501010005020100
-050401000502010005020100050101000502010005030100050301000502010005010101
-05010100050301000507010005ff05320001050107010602000105030701060203000202
-040103010202040005040701050301000502010005020100050401000504010005060100
-050601000504010005090100050901000504010005050100051001000505010005020100
-050101000502010005040100050501000509010005020100050101000502010005050100
-050401000502010005020100050501000503010005030100050201000501010005070100
-0505010105ff053300010501070106020001050407010601030002020401030102020400
-050407010503010005020100050201000504010005040100050601000503010305040100
-050901000506010305040100050501000511010205020100050201000501010405040100
-050501000509010405020100050001000503010305040100050201000502010005020103
-05030100050301000502010005010100050601000508010005ff05320001050107010601
-000105050701060103000202040103010202040005040701050301000502010005020100
-050401000504010005060100050201000502010005040100050901000505010005020100
-050401000505010005140100050101000502010005010100050801000505010005090100
-050601000500010005020100050201000504010005020100050201000501010005020100
-05030100050301000502010005010100050601000508010005ff05320001050107010601
-000105060701060003000202040103010202040005040701050301000502010005020100
-050401000504010005060100050201000502010005040100050901000502010005010100
-050201000504010005050100050401010509010005020100050101000502010005010100
-050201000504010005050100050401010502010005020100050301000503010005020100
-050401000502010005010101050101000502010005030100050301000502010005010100
-05050100050501000502010005ff05320001050107010600000105070701060003000202
-040103010202040005040701050301000502010005020100050401000505010105040100
-0503010305040100050a010205030103050401000505010005040101050a010205020100
-050201000502010205050100050501000504010105030102050401000504010305040100
-050301010500010005020103050401010502010205020100050501000506010205ff0533
-0001050107010600000105080701030002020401030102020400050407010530010505ff
-05d30001050107010001070b0300020204010301020204000504070105ff05ff050a0001
-050107010000070c0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701000d03000202
-04010301020204000504070105ff05ff050a000105010701000d03000202040103010202
-04000504070105ff05ff050a0001050107010001050a0700030002020401030102020400
-0504070105ff05ff050a0001050107010001050a07000300020204010301020204000504
-070105ff05ff050a0001050107010001050a070003000202040103010202040005040701
-05ff05ff050a0001050107010001050a07000300020204010301020204000504070105ff
-05ff050a0001050107010001050a07000300020204010301020204000504070105ff05ff
-050a0001050107010001050a07000300020204010301020204000504070105ff05ff050a
-0001050107010001050a07000300020204010301020204000504070105ff05ff050a0001
-050107010001050a07000300020204010301020204000504070105ff05ff050a00010501
-07010001050a07000300020204010301020204000504070105ff05ff050a000105010701
-0001050a07000300020204010301020204000504070105ff05ff050a0001050107010001
-070b0300020204010301020204000504070105ff05ff050a0001050107010000070c0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105eb010005ff051d000105010701060d030002020401030102020400
-05040701052c0100050d0101051801000506010005250100050d010205030102051f0102
-050a0102051b01000502010205ff0517000105010701060d030002020401030102020400
-05040701052c0100050c0100051a0100052d0100050f01000505010005210100050c0100
-051a0100050201000502010005ff0516000105010701060d030002020401030102020400
-050407010501010205020100050201000501010005000101050201000500010105030102
-050201000500010105020104050a01000503010005020100050101000500010105030102
-050201040502010205030102050201000500010105040101050a01020502010005000101
-050301020505010005050100050401010503010205020100050201000502010205050100
-050c010005030102050301020502010005000101050501000506010005ff051600010501
-0701060d0300020204010301020204000504070105000100050201000501010005020100
-050101010501010005010101050101000501010005020100050101010501010005030100
-050a01040501010005020100050101010501010005010100050201000503010005060100
-050201000502010005010101050101000503010105090100050201000501010105010100
-050101000502010005040100050501000504010105020100050201000501010005020100
-050101000502010005040100050c01000502010005020100050101000502010005010101
-05010100050301000507010005ff0516000105010701060d030002020401030102020400
-050407010500010005050100050201000501010005050100050501000502010005010100
-0502010005030100050c0100050301000502010005010100050201000501010005070100
-0506010005020100050201000501010005020100050f0100050501000502010005010100
-050201000504010005050100050901000502010005010100050201000505010005040100
-050c01000502010005020100050101000502010005010100050201000503010005060100
-05ff0517000105010701060d030002020401030102020400050407010500010005050100
-05020100050101000505010005050104050101000502010005030100050c010005030100
-050201000501010005020100050101000507010005060100050201000502010005010100
-050201000510010205020100050201000501010405040100050501000509010405020100
-050001000503010305040100050c01000502010005020100050101000502010005010100
-05020100050201000506010005ff0518000105010701060d030002020401030102020400
-050407010500010005050100050201000501010005050100050501000505010005020100
-05030100050c010005030100050201000501010005020100050101000507010005060100
-050201000502010005010100050201000513010005010100050201000501010005080100
-05050100050901000506010005000100050201000502010005040100050c010005020100
-0502010005010100050201000501010005020100050201000505010005ff051900010501
-0701060d0300020204010301020204000504070105000100050201000501010005010101
-05010100050501000505010005020100050101000502010005030100050c010005030100
-050101010501010005020100050101000502010005030100050601000502010005020100
-050101000502010005030101050901000502010005010100050201000501010005020100
-050401000505010005040101050201000502010005030100050301000502010005040100
-050c01000502010005020100050101000502010005010101050101000501010005050100
-05ff051a000105010701060d030002020401030102020400050407010501010205030101
-05000100050101000505010005060102050201000502010005040101050a010005040101
-050001000501010005020100050201020505010105040100050301020502010005020100
-05030101050a010205020100050201000502010205050100050501000504010105030102
-050401000504010305040100050c01000503010205030102050201000500010105020100
-0505010405ff0516000105010701060d0300020204010301020204000504070105300105
-058c01050516010005ff0528000105010701060d03000202040103010202040005040701
-05e0010005ff0528000105010701060d0300020204010301020204000504070105e00100
-05ff0528000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
-05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
-05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-0504070105000100052b0100051f01020503010205ff05b1000105010701060d03000202
-04010301020204000504070105000100054b010005020100050101000502010005ff05b0
-000105010701060d03000202040103010202040005040701050001000500010105030102
-050301020502010005000101050a01020503010205020104050201020504010105090100
-05020100050101000502010005ff05b0000105010701060d030002020401030102020400
-050407010500010105010100050101000502010005010100050201000501010105010100
-050801000502010005040100050601000501010005020100050301010509010005020100
-050101000502010005ff05b0000105010701060d03000202040103010202040005040701
-050001000502010005010100050201000505010005010100050201000508010005080100
-050501000502010005020100051001020503010305ff05b0000105010701060d03000202
-040103010202040005040701050001000502010005010104050201030501010005020100
-05090102050501000504010005030104050f0100050201000505010005ff05b000010501
-0701060d0300020204010301020204000504070105000100050201000501010005050100
-050201000501010005020100050c01000504010005030100050401000513010005020100
-0505010005ff05b0000105010701060d0300020204010301020204000504070105000100
-050201000501010005020100050101000502010005010101050101000508010005020100
-050401000502010005050100050201000503010105090100050201000501010005020100
-05ff05b0000105010701060d030002020401030102020400050407010500010005020100
-05020102050301030501010005000101050a010205050100050201040502010205040101
-050a01020503010205ff05b1000105010701060d03000202040103010202040005040701
-051501000504010505ff05e8000105010701060d03000202040103010202040005040701
-0515010005ff05f3000105010701060d0300020204010301020204000504070105150100
-05ff05f3000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
-05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-0504070105ff05ff050a000105010701060d0300020204010301020204000504070105ff
-05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105ff05ff050a000105010701060d030002020401030102020400
-05040701050901000511010005160100051e01040502010205ff05aa000105010701060d
-030002020401030102020400050407010509010005110100053601000505010005020100
-05ff05a9000105010701060d030002020401030102020400050407010501010205020104
-05020102050301020502010005010100050a010205030102050201040502010205040101
-050901000509010005ff05a9000105010701060d03000202040103010202040005040701
-050001000502010005030100050301000502010005010100050201000501010005000100
-050a01000502010005040100050601000501010005020100050301010509010305060100
-05ff05a9000105010701060d030002020401030102020400050407010500010005070100
-050701000501010005050101050b01000508010005050100050201000502010005130100
-0503010105ff05aa000105010701060d0300020204010301020204000504070105010102
-05040100050401030501010005050101050c010205050100050401000503010405130100
-0505010005ff05a9000105010701060d0300020204010301020204000504070105040100
-050301000503010005020100050101000505010005000100050e01000504010005030100
-0504010005130100050201000505010005ff05a9000105010701060d0300020204010301
-020204000504070105000100050201000503010005030100050201000501010005020100
-050101000501010005090100050201000504010005020100050501000502010005030101
-0509010005020100050101000502010005ff05a9000105010701060d0300020204010301
-020204000504070105010102050501010502010305020102050201000502010005090102
-05050100050201040502010205040101050a01020503010205ff05aa000105010701060d
-030002020401030102020400050407010522010505ff05e1000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-040103010202040005040701051201000511010005060100052601020503010205ff05aa
-000105010701060d030002020401030102020400050407010512010005110100052d0100
-05020100050101000502010005ff05a9000105010701060d030002020401030102020400
-050407010500010005000101050301020503010105000100050101000502010005020102
-05020104050201020503010205020100050001010503010205040101050d010005010100
-05ff05ad000105010701060d030002020401030102020400050407010500010105010100
-050101000502010005010100050101010501010005020100050101000502010005030100
-0506010005020100050201000501010105010100050101000502010005030101050d0100
-0501010005ff05ad000105010701060d0300020204010301020204000504070105000100
-050501000502010005010100050201000501010005020100050101000507010005060100
-0502010005020100050101000502010005010100051601000502010305ff05aa00010501
-0701060d0300020204010301020204000504070105000100050501040501010005020100
-050101000502010005010100050701000506010005020100050201000501010005020100
-0502010205120100050301000502010005ff05a9000105010701060d0300020204010301
-020204000504070105000100050501000505010005020100050101000502010005010100
-050701000506010005020100050201000501010005020100050501000510010005040100
-0502010005ff05a9000105010701060d0300020204010301020204000504070105000100
-050501000502010005010100050101010501010005010101050101000502010005030100
-050601000502010005020100050101000502010005010100050201000503010105090100
-050501000502010005ff05a9000105010701060d03000202040103010202040005040701
-050001000506010205030101050001000502010105000100050201020505010105040100
-0503010205020100050201000502010205040101050901040502010205ff05aa00010501
-0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
-050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
-050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
-050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d030002020401030102020400050407010532010305ff05d3000105010701060d
-03000202040103010202040005040701050101020505010005090100051b010005ff05d6
-000105010701060d030002020401030102020400050407010503010005100100051b0100
-05ff05d6000105010701060d030002020401030102020400050407010503010005030102
-050201000500010105020100050101000503010205040101050a010005ff05d600010501
-0701060d0300020204010301020204000504070105030100050501000502010105010100
-0501010005000100050301000502010005030101050a010005ff05d6000105010701060d
-030002020401030102020400050407010503010005050100050201000502010005010101
-050401000514010005ff05d6000105010701060d03000202040103010202040005040701
-0503010005050100050201000502010005010101050501020511010005ff05d600010501
-0701060d0300020204010301020204000504070105030100050501000502010005020100
-0501010005000100050701000510010005ff05d6000105010701060d0300020204010301
-020204000504070105030100050501000502010005020100050101000501010005020100
-0502010005030101050a010005ff05d6000105010701060d030002020401030102020400
-050407010503010005050100050201000502010005010100050201000502010205040101
-050a010005ff05d6000105010701060d0300020204010301020204000504070105320103
-05ff05d3000105010701060d0300020204010301020204000504070105ff05ff050a0001
-05010701060d0300020204010301020204000504070105ff05ff050a000105010701060d
-0300020204010301020204000504070105ff05ff050a000105010701060d030002020401
-0301020204000504070105120100052a01000506010305ff05bf000105010701060d0300
-02020401030102020400050407010511010005040101050a010205030102050b01010502
-01000508010005ff05bf000105010701060d030002020401030102020400050407010510
-010005040100050101000508010005020100050101000502010005090100050101000502
-01000507010005ff05bf000105010701060d03000202040103010202040005040701050f
-01000505010005010100050c0100050501000509010005010100050301000506010005ff
-05bf000105010701060d03000202040103010202040005040701050e0100050601000501
-0100050c0100050501000509010005010100050401000505010005ff05bf000105010701
-060d03000202040103010202040005040701050d01000507010005010100050b01000504
-0101050a010005010100050501000504010005ff05bf000105010701060d030002020401
-03010202040005040701050e01000506010005010100050a010005070100050901000501
-0100050401000505010005ff05bf000105010701060d0300020204010301020204000504
-0701050f0100050501000501010005090100050801000509010005010100050301000506
-010005ff05bf000105010701060d03000202040103010202040005040701051001000504
-010005010100050301010502010005050100050201000503010105030100050101000502
-01000507010005ff05bf000105010701060d030002020401030102020400050407010511
-0100050401010504010105020104050201020504010105040101050201000508010005ff
-05bf000105010701060d0300020204010301020204000504070105120100052a01000506
-010305ff05bf000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05ff050a000105010701
-060d0300020204010301020204000504070105ff05ff050a000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701060d03000202040103010202040005040701
-05ff05ff050a000105010701060d03000202040103010202040005040701050201000530
-010005040100051401010509010205ff05aa000105010701060d03000202040103010202
-040005040701050201000536010005130100050d010005ff05aa000105010701060d0300
-020204010301020204000504070105000104050101000500010105030102050201000500
-0101050a01020502010005020100050201020502010405030101050b0100050401020505
-0100050301020503010205ff059c000105010701060d0300020204010301020204000504
-070105020100050301010501010005010100050201000501010105010100050801000502
-010005010100050201000504010005040100050501010509010405010100050201000504
-01000502010005020100050101000502010005ff059b000105010701060d030002020401
-030102020400050407010502010005030100050901000501010005020100050801000502
-010005020100050001000505010005040100051301000507010005040100050201000505
-01000502010005ff059b000105010701060d030002020401030102020400050407010502
-010005030100050601030501010005020100050801040503010005060100050401000513
-01000504010305040100050301020502010405ff059b000105010701060d030002020401
-030102020400050407010502010005030100050501000502010005010100050201000508
-010005060100050001000505010005040100051301000503010005020100050401000506
-01000501010005ff059f000105010701060d030002020401030102020400050407010502
-010005030100050501000502010005010101050101000508010005020100050101000502
-0100050401000504010005050101050b0100050301000502010005040100050201000502
-0100050101000502010005ff059b000105010701060d0300020204010301020204000504
-07010503010105010100050601030501010005000101050a010205020100050201000504
-01000505010105030101050b01000504010305040100050301020503010205ff059c0001
-05010701060d03000202040103010202040005040701051501000504010505ff05e80001
-05010701060d030002020401030102020400050407010515010005ff05f3000105010701
-060d030002020401030102020400050407010515010005ff05f3000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
-050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff05ff
-050a000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d0300020204010301020204000504070105ff05ff050a000105010701060d0300
-020204010301020204000504070105ff05ff050a000105010701060d0300020204010301
-020204000504070105ff05ff050a000105010701060d0300020204010301020204000504
-0701057301010597010105350101053501010540010105190101050b0101050401010516
-000105010701060d0300020204010301020204000504070105040100052a010005400100
-05540100052a010005160100052e0103050301000536010005440100050b010305010103
-050401000503010305040100050501000515000105010701060d03000202040103010202
-0400050407010503010005040101050a010205030102050b010105020100053f0100050a
-0100050d010205030102051b01000512010005040101050a010205030102050b01010502
-0100051501000519010205110100050601000512010205030102050b0100050c0100050c
-0100051a0100050b0102050b0100050b0100050701000504010005060100050401000505
-01000515000105010701060d030002020401030102020400050407010502010005040100
-0501010005080100050201000501010005020100050901000501010005020100053e0100
-050a0100050f010005050100051b01000511010005040100050101000508010005020100
-050101000502010005090100050101000502010005140100051b01000511010005060100
-0514010005050100050a0101050c0100050c010005190101050d0100050b0100050b0100
-05070100050401000506010005040100050501000515000105010701060d030002020401
-03010202040005040701050101000505010005010100050c010005050100050901000501
-010005030100050501010509010005000101050301020503010205190100050401020502
-010005000101050301020505010005050100050a01020502010105000100050301010500
-0100051001000505010005010100050c0100050501000509010005010100050301000513
-010005040102050201000502010005020102050501000511010005060100050401020503
-010205050100050501000509010005000100050c01000504010205020104050201020502
-0101050001000509010005000100050d01000503010205040100050b0100050701000504
-01000506010005040100050501000515000105010701060d030002020401030102020400
-05040701050001000506010005010100050c010005050100050901000501010005040100
-050401010509010105010100050101000502010005010100050201000518010005030100
-050201000501010105010100050101000502010005040100050501000509010005020100
-0501010005000100050001000501010005010101050f01000506010005010100050c0100
-050501000509010005010100050401000512010005030100050201000501010005020100
-050101000502010005040100051101000506010005030100050201000501010005020100
-0504010005050100050b0100050c01000503010005020100050301000503010005020100
-050101000500010005000100050a0100050d0100050201000502010005030100050b0100
-05070100050401000506010005040100050501000515000105010701060d030002020401
-0301020204000504070101000507010005010100050a010105050100050a010005010100
-05050100050f0100050501000502010005010100051a0101050401000505010005020100
-050101000502010005040100050501000509010005050100050001000500010005010100
-05020100050e01000507010005010100050b010005040101050a01000501010005050100
-050f01010504010005020100050101000502010005050100050401000511010005040101
-05040100050901000504010005050100050b0100050a0101050801000503010005030100
-05020100050101000500010005000100050a0100050d0100050201000508010105090100
-05070100050501010504010005050101050401010513000105010701060d030002020401
-03010202040005040701050001000506010005010100050c010005030100050b01000501
-010005040100051001000505010405010100051c01000504010205020100050201000501
-01040504010005050100050901000505010005000100050001000501010005020100050f
-01000506010005010100050a010005070100050901000501010005040100051201000503
-010405020100050001000503010305040100051101000506010005030100050601030504
-010005050100050b0100050c010005040103050301000503010005020100050101000500
-010005000100050a0100050d01000503010205040100050b010005070100050401000506
-010005040100050501000515000105010701060d03000202040103010202040005040701
-050101000505010005010100050c010005020100050c0100050101000503010005110100
-0505010005050100051c0100050701000501010005020100050101000508010005050100
-050901000505010005000100050001000501010005020100051001000505010005010100
-050901000508010005090100050101000503010005130100050301000506010005000100
-050201000502010005040100051101000506010005030100050501000502010005040100
-05050100050b0100050c0100050301000502010005030100050301000502010005010100
-0500010005000100050a0100050d01000506010005030100050b01000507010005040100
-0506010005040100050501000515000105010701060d0300020204010301020204000504
-070105020100050401000501010005030101050201000502010005010100050701010503
-010005010100050201000506010105090100050501000502010005010100050201000518
-010005030100050201000501010005020100050101000502010005040100050501000509
-010005020100050101000500010005000100050101000501010105030101050b01000504
-010005010100050301010502010005050100050201000503010105030100050101000502
-010005060101050b01000503010005020100050301000503010005020100050401000504
-0101050a0100050601000503010005020100050101000502010005040100050501000504
-010105040100050501010504010005030100050201000503010005030100050201000501
-010005000100050001000503010105040100050501010505010005020100050201000503
-010005050101050301000507010005040100050601000504010005050100051500010501
-0701060d0300020204010301020204000504070105030100050401010504010105030102
-050201040503010105040101050201000507010105090100050601020503010205190100
-050401020502010005020100050201020505010005050100050a01020502010005000100
-05000100050201010500010005030101050c010005040101050401010502010405020102
-05040101050401010502010005070101050b010005040102050401000504010305040100
-05040101050a010005060100050401020503010305040100050501000504010105020104
-050301010504010005040103050401010502010205020100050001000500010005030101
-050201040503010105050100050301020504010005050101050301000507010005040100
-0506010005040100050501000515000105010701060d0300020204010301020204000504
-070105040100052a0100054001000525010505190100050d0100052a010005090100050b
-010005220100050a01030503010005220100050c01000504010005220100050c01000512
-010005060100050301030501010305040100050301030504010005050100051500010501
-0701060d03000202040103010202040005040701057301010541010105430101050d0101
-051e010105140101051e0101050b010105060101051e0101050b01010511010105050101
-05110101050b0101050401010516000105010701060d0300020204010301020204000504
-070105ff05ff050a000105010701060d0300020204010301020204000504070105ff0506
-0101055f010105630101051501010521000105010701060d030002020401030102020400
-0504070105040100052a0100051d010005b401000506010005040100053e010005120100
-05070100052a0100051501000501010005180100051301000523000105010701060d0300
-02020401030102020400050407010503010005040101050a010205030102050b01010502
-0100051c0100051f010405280100053f010005030100051f01000506010005030102052d
-01020503010205050100051201000506010005040101050a010205030102050b01010502
-0100051401000501010005010103050c010105030100051301000523000105010701060d
-030002020401030102020400050407010502010005040100050101000508010005020100
-0501010005020100050901000501010005020100051b010005210100052a0100053f0100
-05030100051f010005050100050301000500010005000100052e01000505010005040100
-051301000505010005040100050101000508010005020100050101000502010005090100
-050101000502010005130100050101000501010005020100050a01000505010005130100
-0523000105010701060d0300020204010301020204000504070105010100050501000501
-0100050c0100050501000509010005010100050301000505010105120100052101000504
-010205040101050a010205030102050301010500010005020102050a0102050301020502
-010005000101050201000502010005020102050201000500010105080101050101010502
-0102050301010500010005030101050b0100050401000504010005000100050401010500
-0100050201020502010005000101050a0102050301020505010005050100050301000514
-0100050401000505010005010100050c0100050501000509010005010100050301000511
-010505000100050201000502010205040100050501000513010005040102050201000500
-01010503010205020100050201000501010005000101000105010701060d030002020401
-03010202040005040701050001000506010005010100050c010005050100050901000501
-010005040100050401010512010005210100050301000502010005030101050901000502
-010005010100050201000501010005010101050101000502010005080100050201000501
-010005020100050101010501010005010100050201000501010005020100050101010501
-010005070101050101010501010005020100050101000501010105030101050b0100050a
-010005000100050301000501010105010100050201000501010105010100050801000502
-01000501010005020100050401000505010005190100050301000506010005010100050c
-010005050100050901000501010005040100051101000501010005010100050201000501
-010005020100050101040503010005130100050301000502010005010101050101000501
-0100050201000501010005020100050101010501000105010701060d0300020204010301
-020204000504070101000507010005010100050a010105050100050a0100050101000505
-010005180100052101000503010005020100050f01000505010005020100050101000502
-010005010100050201000508010005050100050201000501010005050100050201000501
-01000502010005010100050b01000500010105000100050101000505010005020100050f
-0101050c0102050201000502010005010100050201000501010005020100050801000509
-0100050401000505010005170101050301000507010005010100050a010105050100050a
-01000501010005050100050f010005010100050201030502010005020100050301000506
-0101050f0101050401000502010005010100050201000501010005050100050201000501
-01000502000105010701060d030002020401030102020400050407010500010005060100
-05010100050c010005030100050b01000501010005040100051901000521010005030100
-05020100050f010005050100050201000501010005020100050101040509010205020104
-0501010005060100050001000502010405010100050b0100050001010500010005020102
-050201000502010005110100050c01000500010005010100050201000501010405010100
-050201000508010005060103050401000505010005190100050301000506010005010100
-050c010005030100050b01000501010005040100050f0105050101000501010005020104
-050301000505010005130100050301040501010005020100050201020502010005020100
-050101000502000105010701060d03000202040103010202040005040701050101000505
-010005010100050c010005020100050c01000501010005030100053d0100050301000502
-0100050f0100050501000502010005010100050201000501010005100100050101000505
-010005060100050001000502010005050100050b01000503010005050100050101000502
-010005110100050c01000500010005010100050201000501010005050100050201000508
-01000505010005020100050401000505010005190100050401000505010005010100050c
-010005020100050c01000501010005030100051101000501010005020100050201000501
-010005070100050501000513010005030100050501000502010005050100050101000502
-0100050101000502000105010701060d0300020204010301020204000504070105020100
-050401000501010005030101050201000502010005010100050701010503010005010100
-050201000506010105350100050301000502010005030101050901000502010005010100
-050201000501010005010101050101000502010005080100050201000501010005020100
-0501010005070100050301000502010005010100050b0100050301000501010005020100
-050101000501010105030101050b0100050a010005000100050001000501010005010101
-050101000502010005010100050201000508010005020100050101000502010005040100
-05050100050b0101050b0100050501000504010005010100050301010502010005020100
-050101000507010105030100050101000502010005060101050901000501010005020100
-050201000501010005020100050301000505010005050101050b01000503010005020100
-050101000502010005010100050201000501010005010101050101000502000105010701
-060d03000202040103010202040005040701050301000504010105040101050301020502
-01040503010105040101050201000507010105120100052101000504010205040101050a
-010205030102050301010500010005020102050a01020503010205020100050701000504
-010205020100050b01000503010005020102050301010500010005030101050b0100050b
-010205030101050001000502010205020100050201000509010205030103050401000505
-0100050b0101050b01000506010005040101050401010503010205020104050301010504
-010105020100050701010509010005010100050201000502010005020102050401000505
-010005050101050b01000504010205020100050201000502010205030101050001000501
-01000502000105010701060d0300020204010301020204000504070105040100052a0100
-057501050544010005110100050c010005070100050e010505270100050b010005070100
-052a0100050901000527010005060100050b01000523000105010701060d030002020401
-0301020204000504070105ee01000502010005120101050f010005020100053a0101050d
-0101053a01010526010105050101050d01010521000105010701060d0300020204010301
-020204000504070105ef01020526010205ed000105010701060d03000202040103010202
-04000504070105730101052e0101058d01010504010105cc000105010701060d03000202
-04010301020204000504070105040100052a010005400100050401000501010005260100
-059101000505010005cb000105010701060d030002020401030102020400050407010503
-010005040101050a010205030102050b010105020100053f010005040100050101000501
-0103050c010105110100051501000509010205260102050c0100050b0100052001020504
-01000505010005cb000105010701060d0300020204010301020204000504070105020100
-050401000501010005080100050201000501010005020100050901000501010005020100
-053e010005040100050101000501010005020100050a01000513010005150100050b0100
-052801000519010005220100050401000505010005cb000105010701060d030002020401
-03010202040005040701050101000505010005010100050c010005050100050901000501
-010005030100050501010509010005000101050301020503010205190100050301050500
-010005020100050201020504010005130100050301010500010005030102050301010500
-01000501010005020100050401000503010205110102050201000500010105050100050a
-010205020100050001010502010405020102050201000500010105020100050001010503
-010205050100050401000505010005cb000105010701060d030002020401030102020400
-05040701050001000506010005010100050c010005050100050901000501010005040100
-050401010509010105010100050101000502010005010100050201000518010005040100
-050101000501010005020100050101000502010005010104051101000503010005000100
-050001000501010005020100050101000501010105010100050201000504010005020100
-05020100050f010005020100050101010501010005040100050c01000502010105010100
-050301000503010005020100050101010501010005010101050101000501010005020100
-05040100050401000505010005cb000105010701060d0300020204010301020204000504
-070101000507010005010100050a010105050100050a01000501010005050100050f0100
-050501000502010005010100051a01010504010005010100050201030502010005020100
-050301000511010105040100050001000500010005010100050201000501010005020100
-0501010005020100050401000502010005020100050f0100050201000501010005080100
-050c01000502010005020100050301000503010005020100050101000505010005020100
-0505010005040100050501010504010105c9000105010701060d03000202040103010202
-040005040701050001000506010005010100050c010005030100050b0100050101000504
-0100051001000505010405010100051c0100050201050501010005010100050201040503
-010005130100050301000500010005000100050101000502010005010100050201000501
-0100050201000504010005020104050f01040501010005080100050c0100050201000502
-010005030100050301040501010005050100050201000502010305040100050401000505
-010005cb000105010701060d030002020401030102020400050407010501010005050100
-05010100050c010005020100050c01000501010005030100051101000505010005050100
-051c01000503010005010100050201000502010005010100050701000513010005030100
-050001000500010005010100050201000501010005020100050101000502010005040100
-05020100051301000505010005080100050c010005020100050201000503010005030100
-050501000505010005020100050101000502010005040100050401000505010005cb0001
-05010701060d030002020401030102020400050407010502010005040100050101000503
-010105020100050201000501010005070101050301000501010005020100050601010509
-010005050100050201000501010005020100051801000503010005010100050201000502
-010005010100050201000503010005050101050b01000503010005000100050001000501
-010005020100050101000501010105010100050101010504010005020100050201000503
-010105090100050201000501010005080100050c01000502010005020100050301000503
-010005020100050101000505010005020100050101000502010005040100050401000505
-010005cb000105010701060d030002020401030102020400050407010503010005040101
-050401010503010205020104050301010504010105020100050701010509010005060102
-050301020519010005030100050101000502010005020100050201020504010005050101
-050b01000503010005000100050001000502010205030101050001000502010105000100
-050401000503010205040101050a01020502010005080100050c01000502010005020100
-050401010502010205020100050501000502010005020103050401000504010005050100
-05cb000105010701060d0300020204010301020204000504070105040100052a01000540
-010005220100050b010005300100051d0105053b01000505010005cb000105010701060d
-0300020204010301020204000504070105730101051e0101050d0101052c0101055e0101
-0504010105cc000105010701060d0300020204010301020204000504070105ff05ff050a
-000105010701060d0300020204010301020204000504070105ff05060101055f01010563
-0101051501010521000105010701060d0300020204010301020204000504070105040100
-052a0100051d010005b401000506010005040100053e01000512010005070100052a0100
-051501000501010005180100051301000523000105010701060d03000202040103010202
-0400050407010503010005040101050a010205030102050b010105020100051c0100051f
-010405280100053f010005030100051f01000506010005030102052d0102050301020505
-0100051201000506010005040101050a010205030102050b010105020100051401000501
-010005010103050c010105030100051301000523000105010701060d0300020204010301
-020204000504070105020100050401000501010005080100050201000501010005020100
-050901000501010005020100051b010005210100052a0100053f010005030100051f0100
-05050100050301000500010005000100052e010005050100050401000513010005050100
-050401000501010005080100050201000501010005020100050901000501010005020100
-05130100050101000501010005020100050a010005050100051301000523000105010701
-060d03000202040103010202040005040701050101000505010005010100050c01000505
-01000509010005010100050301000505010105120100052101000504010205040101050a
-010205030102050301010500010005020102050a01020503010205020100050001010502
-010005020100050201020502010005000101050801010501010105020102050301010500
-010005030101050b01000504010005040100050001000504010105000100050201020502
-010005000101050a01020503010205050100050501000503010005140100050401000505
-010005010100050c01000505010005090100050101000503010005110105050001000502
-010005020102050401000505010005130100050401020502010005000101050301020502
-0100050201000501010005000101000105010701060d0300020204010301020204000504
-0701050001000506010005010100050c0100050501000509010005010100050401000504
-010105120100052101000503010005020100050301010509010005020100050101000502
-010005010100050101010501010005020100050801000502010005010100050201000501
-010105010100050101000502010005010100050201000501010105010100050701010501
-01010501010005020100050101000501010105030101050b0100050a0100050001000503
-010005010101050101000502010005010101050101000508010005020100050101000502
-0100050401000505010005190100050301000506010005010100050c0100050501000509
-010005010100050401000511010005010100050101000502010005010100050201000501
-010405030100051301000503010005020100050101010501010005010100050201000501
-010005020100050101010501000105010701060d03000202040103010202040005040701
-01000507010005010100050a010105050100050a01000501010005050100051801000521
-01000503010005020100050f010005050100050201000501010005020100050101000502
-010005080100050501000502010005010100050501000502010005010100050201000501
-0100050b01000500010105000100050101000505010005020100050f0101050c01020502
-010005020100050101000502010005010100050201000508010005090100050401000505
-010005170101050301000507010005010100050a010105050100050a0100050101000505
-0100050f0100050101000502010305020100050201000503010005060101050f01010504
-010005020100050101000502010005010100050501000502010005010100050200010501
-0701060d03000202040103010202040005040701050001000506010005010100050c0100
-05030100050b0100050101000504010005190100052101000503010005020100050f0100
-050501000502010005010100050201000501010405090102050201040501010005060100
-050001000502010405010100050b01000500010105000100050201020502010005020100
-05110100050c010005000100050101000502010005010104050101000502010005080100
-05060103050401000505010005190100050301000506010005010100050c010005030100
-050b01000501010005040100050f01050501010005010100050201040503010005050100
-051301000503010405010100050201000502010205020100050201000501010005020001
-05010701060d03000202040103010202040005040701050101000505010005010100050c
-010005020100050c01000501010005030100053d01000503010005020100050f01000505
-010005020100050101000502010005010100051001000501010005050100050601000500
-01000502010005050100050b01000503010005050100050101000502010005110100050c
-010005000100050101000502010005010100050501000502010005080100050501000502
-0100050401000505010005190100050401000505010005010100050c010005020100050c
-010005010100050301000511010005010100050201000502010005010100050701000505
-010005130100050301000505010005020100050501000501010005020100050101000502
-000105010701060d03000202040103010202040005040701050201000504010005010100
-050301010502010005020100050101000507010105030100050101000502010005060101
-053501000503010005020100050301010509010005020100050101000502010005010100
-050101010501010005020100050801000502010005010100050201000501010005070100
-050301000502010005010100050b01000503010005010100050201000501010005010101
-05030101050b0100050a0100050001000500010005010100050101010501010005020100
-0501010005020100050801000502010005010100050201000504010005050100050b0101
-050b01000505010005040100050101000503010105020100050201000501010005070101
-050301000501010005020100050601010509010005010100050201000502010005010100
-05020100050301000505010005050101050b010005030100050201000501010005020100
-05010100050201000501010005010101050101000502000105010701060d030002020401
-030102020400050407010503010005040101050401010503010205020104050301010504
-0101050201000507010105120100052101000504010205040101050a0102050301020503
-01010500010005020102050a01020503010205020100050701000504010205020100050b
-01000503010005020102050301010500010005030101050b0100050b0102050301010500
-010005020102050201000502010005090102050301030504010005050100050b0101050b
-010005060100050401010504010105030102050201040503010105040101050201000507
-01010509010005010100050201000502010005020102050401000505010005050101050b
-010005040102050201000502010005020102050301010500010005010100050200010501
-0701060d0300020204010301020204000504070105040100052a01000575010505440100
-05110100050c010005070100050e010505270100050b010005070100052a010005090100
-0527010005060100050b01000523000105010701060d0300020204010301020204000504
-070105ee01000502010005120101050f010005020100053a0101050d0101053a01010526
-010105050101050d01010521000105010701060d03000202040103010202040005040701
-05ef01020526010205ed000105010701060d030002020401030102020400050407010573
-0101052e0101059401010504010105c5000105010701060d030002020401030102020400
-0504070105040100052a0100054001000504010005010100052601000598010005050100
-05c4000105010701060d030002020401030102020400050407010503010005040101050a
-010205030102050b010105020100053f0100050401000501010005010103050c01010511
-01000515010005090102051e0100050d010205030102050d0100050b0101051001020504
-0100050501000505010005c4000105010701060d03000202040103010202040005040701
-050201000504010005010100050801000502010005010100050201000509010005010100
-05020100053e010005040100050101000501010005020100050a01000513010005150100
-050b0100051e0100050f010005050100050d0100050a0100051401000504010005050100
-0505010005c4000105010701060d03000202040103010202040005040701050101000505
-010005010100050c01000505010005090100050101000503010005050101050901000500
-010105030102050301020519010005030105050001000502010005020102050401000513
-010005030101050001000503010205030101050001000501010005020100050401000503
-0102051101020502010005000101050301020505010005050100050a0101050001000502
-0102050401000504010205020100050201000504010005020104050301000505010005c4
-000105010701060d03000202040103010202040005040701050001000506010005010100
-050c01000505010005090100050101000504010005040101050901010501010005010100
-050201000501010005020100051801000504010005010100050101000502010005010100
-050201000501010405110100050301000500010005000100050101000502010005010100
-050101010501010005020100050401000502010005020100050f01000502010005010101
-050101000501010005020100050401000505010005090100050101010501010005020100
-050101040501010005020100050101000502010005040100050401000505010005050100
-05c4000105010701060d0300020204010301020204000504070101000507010005010100
-050a010105050100050a01000501010005050100050f0100050501000502010005010100
-051a01010504010005010100050201030502010005020100050301000511010105040100
-050001000500010005010100050201000501010005020100050101000502010005040100
-0502010005020100050f0100050501000502010005010100050201000504010005050100
-050901000502010005010100050201000503010005070100050101000502010005040100
-05040100050601010504010105c2000105010701060d0300020204010301020204000504
-0701050001000506010005010100050c010005030100050b010005010100050401000510
-01000505010405010100051c010005020105050101000501010005020104050301000513
-010005030100050001000500010005010100050201000501010005020100050101000502
-010005040100050201040510010205020100050201000501010405040100050501000509
-010005020100050101040503010005040103050101000502010005040100050401000505
-01000505010005c4000105010701060d0300020204010301020204000504070105010100
-0505010005010100050c010005020100050c010005010100050301000511010005050100
-05050100051c010005030100050101000502010005020100050101000507010005130100
-050301000500010005000100050101000502010005010100050201000501010005020100
-050401000502010005170100050101000502010005010100050801000505010005090100
-050201000501010005070100050301000502010005010100050201000504010005040100
-050501000505010005c4000105010701060d030002020401030102020400050407010502
-010005040100050101000503010105020100050201000501010005070101050301000501
-010005020100050601010509010005050100050201000501010005020100051801000503
-010005010100050201000502010005010100050201000503010005050101050b01000503
-010005000100050001000501010005020100050101000501010105010100050101010504
-010005020100050201000503010105090100050201000501010005020100050101000502
-010005040100050501000509010005010101050101000502010005030100050301000502
-010005010100050101010504010005040100050501000505010005c4000105010701060d
-030002020401030102020400050407010503010005040101050401010503010205020104
-050301010504010105020100050701010509010005060102050301020519010005030100
-050101000502010005020100050201020504010005050101050b01000503010005000100
-050001000502010205030101050001000502010105000100050401000503010205040101
-050a01020502010005020100050201020505010005050100050a01010500010005020102
-050401000504010305020101050001000504010005050101050301000505010005c40001
-05010701060d0300020204010301020204000504070105040100052a0100054001000522
-0100050b010005300100052b0105053401000505010005c4000105010701060d03000202
-04010301020204000504070105730101051e0101050d0101052c01010565010105040101
-05c5000105010701060d0300020204010301020204000504070105ff05ff050a00010501
-0701060d0300020204010301020204000504070105ff05060101055f0101056301010515
-01010521000105010701060d0300020204010301020204000504070105040100052a0100
-051d010005b401000506010005040100053e01000512010005070100052a010005150100
-0501010005180100051301000523000105010701060d0300020204010301020204000504
-07010503010005040101050a010205030102050b010105020100051c0100051f01040519
-010105040100050301020540010005030100051f01000506010005030102052d01020503
-010205050100051201000506010005040101050a010205030102050b0101050201000514
-01000501010005010103050c010105030100051301000504010205050100050b01000507
-000105010701060d03000202040103010202040005040701050201000504010005010100
-05080100050201000501010005020100050901000501010005020100051b010005210100
-051a0100050d01000540010005030100051f010005050100050301000500010005000100
-052e01000505010005040100051301000505010005040100050101000508010005020100
-050101000502010005090100050101000502010005130100050101000501010005020100
-050a0100050501000513010005060100051201000507000105010701060d030002020401
-03010202040005040701050101000505010005010100050c010005050100050901000501
-0100050301000505010105120100052101000504010205040101050b0100050401020505
-010005030102050a01020503010205020100050001010502010005020100050201020502
-010005000101050801010501010105020102050301010500010005030101050b01000504
-010005040100050001000504010105000100050201020502010005000101050a01020503
-010205050100050501000503010005140100050401000505010005010100050c01000505
-010005090100050101000503010005110105050001000502010005020102050401000505
-010005130100050601000503010205030102050201040505000105010701060d03000202
-040103010202040005040701050001000506010005010100050c01000505010005090100
-050101000504010005040101051201000521010005030100050201000503010105090104
-050401000505010005020100050201000508010005020100050101000502010005010101
-050101000501010005020100050101000502010005010101050101000507010105010101
-0501010005020100050101000501010105030101050b0100050a01000500010005030100
-050101010501010005020100050101010501010005080100050201000501010005020100
-050401000505010005190100050301000506010005010100050c01000505010005090100
-050101000504010005110100050101000501010005020100050101000502010005010104
-050301000513010005060100050501000502010005020100050301000507000105010701
-060d0300020204010301020204000504070101000507010005010100050a010105050100
-050a01000501010005050100051801000521010005030100050201000511010005060100
-050501000502010005020100050801000505010005020100050101000505010005020100
-050101000502010005010100050b01000500010105000100050101000505010005020100
-050f0101050c010205020100050201000501010005020100050101000502010005080100
-05090100050401000505010005170101050301000507010005010100050a010105050100
-050a01000501010005050100050f01000501010005020103050201000502010005030100
-05060101050f0101050701000505010005020100050701000507000105010701060d0300
-0202040103010202040005040701050001000506010005010100050c010005030100050b
-010005010100050401000519010005210100050301000502010005110100050601000505
-01000502010405090102050201040501010005060100050001000502010405010100050b
-0100050001010500010005020102050201000502010005110100050c0100050001000501
-010005020100050101040501010005020100050801000506010305040100050501000519
-0100050301000506010005010100050c010005030100050b01000501010005040100050f
-010505010100050101000502010405030100050501000513010005060100050501000503
-0102050401000507000105010701060d0300020204010301020204000504070105010100
-0505010005010100050c010005020100050c01000501010005030100053d010005030100
-050201000511010005060100050501000502010005100100050101000505010005060100
-050001000502010005050100050b01000503010005050100050101000502010005110100
-050c01000500010005010100050201000501010005050100050201000508010005050100
-05020100050401000505010005190100050401000505010005010100050c010005020100
-050c01000501010005030100051101000501010005020100050201000501010005070100
-0505010005130100050601000505010005060100050301000507000105010701060d0300
-020204010301020204000504070105020100050401000501010005030101050201000502
-010005010100050701010503010005010100050201000506010105350100050301000502
-010005030101050b01000506010005050100050201000502010005080100050201000501
-0100050201000501010005070100050301000502010005010100050b0100050301000501
-010005020100050101000501010105030101050b0100050a010005000100050001000501
-010005010101050101000502010005010100050201000508010005020100050101000502
-01000504010005050100050b0101050b0100050501000504010005010100050301010502
-010005020100050101000507010105030100050101000502010005060101050901000501
-010005020100050201000501010005020100050301000505010005050101050b01000506
-0100050501000502010005020100050301000507000105010701060d0300020204010301
-020204000504070105030100050401010504010105030102050201040503010105040101
-050201000507010105120100052101000504010205040101050b01000506010005050100
-05030102050a01020503010205020100050701000504010205020100050b010005030100
-05020102050301010500010005030101050b0100050b0102050301010500010005020102
-050201000502010005090102050301030504010005050100050b0101050b010005060100
-050401010504010105030102050201040503010105040101050201000507010105090100
-05010100050201000502010005020102050401000505010005050101050b010005060100
-0505010005030102050501010505000105010701060d0300020204010301020204000504
-070105040100052a0100057501050544010005110100050c010005070100050e01050527
-0100050b010005070100052a0100050901000527010005060100050b0100051e01040001
-05010701060d0300020204010301020204000504070105ee01000502010005120101050f
-010005020100053a0101050d0101053a01010526010105050101050d0101052100010501
-0701060d0300020204010301020204000504070105ef01020526010205ed000105010701
-060d0300020204010301020204000504070105730101052e010105ff0563000105010701
-060d0300020204010301020204000504070105040100052a010005400100050401000501
-010005260100052001030501010005010100058701000501010005ae000105010701060d
-030002020401030102020400050407010503010005040101050a010205030102050b0101
-05020100053f0100050401000501010005010103050c010105110100050a010005140100
-050401000501010005340102050401000503010405020102051001000508010005180100
-05010100050101000501010005ae000105010701060d0300020204010301020204000504
-070105020100050401000501010005080100050201000501010005020100050901000501
-010005020100053e010005040100050101000501010005020100050a010005130100050a
-010005140100050401000501010005330100050201000502010105030100050501000502
-0100050f0100052101000500010005000100050101000501010005ae000105010701060d
-03000202040103010202040005040701050101000505010005010100050c010005050100
-050901000501010005030100050501010509010005000101050301020503010205190100
-050301050500010005020100050201020504010005130100050401020502010005010100
-051101000504010005010100050a01020503010205020100050201000502010205030102
-050901000505010005000100050301000505010005020100050901020502010005000101
-050301020502010005020100050201020503010205020100050101000502010005010100
-05ae000105010701060d0300020204010301020204000504070105000100050601000501
-0100050c0100050501000509010005010100050401000504010105090101050101000501
-010005020100050101000502010005180100050401000501010005010100050201000501
-010005020100050101040511010005030100050201000501010005000100051201000512
-010005020100050101000502010005010100050201000501010005020100050101000502
-010005080100050701000503010305020100050201000508010005020100050101010501
-01000504010005020100050201000501010005020100050101000502010005bb00010501
-0701060d0300020204010301020204000504070101000507010005010100050a01010505
-0100050a01000501010005050100050f0100050501000502010005010100051a01010504
-010005010100050201030502010005020100050301000511010105040100050201000501
-010105130100051201000509010005010100050201000501010005020100050101000505
-010405010103050401000507010005020103050101040501010005050100050201000504
-01000502010005020100050501000501010005bf000105010701060d0300020204010301
-0202040005040701050001000506010005010100050c010005030100050b010005010100
-05040100051001000505010405010100051c010005020105050101000501010005020104
-050301000513010005030100050201000501010105130100051301020503010305020100
-050001000502010405020102050901000502010005030100050701000505010005080100
-0505010005020100050401000503010005000100050301030502010205bc000105010701
-060d03000202040103010202040005040701050101000505010005010100050c01000502
-0100050c01000501010005030100051101000505010005050100051c0100050301000501
-010005020100050201000501010005070100051301000503010005020100050101000500
-010005120100051601000501010005020100050201000500010005020100050901000508
-010005020100050301000503010005020100050501000508010005050100050201000504
-0100050301000500010005020100050201000505010005bb000105010701060d03000202
-040103010202040005040701050201000504010005010100050301010502010005020100
-050101000507010105030100050101000502010005060101050901000505010005020100
-050101000502010005180100050301000501010005020100050201000501010005020100
-0503010005050101050b01000503010005020100050101000501010005040101050a0100
-050d01010502010005020100050101000502010005030100050301000502010005010100
-050201000508010005020100050301000503010005020100050101000502010005080100
-050201000501010005020100050401000504010005030100050201000501010005020100
-0511010105a7000105010701060d03000202040103010202040005040701050301000504
-010105040101050301020502010405030101050401010502010005070101050901000506
-010205030102051901000503010005010100050201000502010005020102050401000505
-0101050b010005040102050201000502010005030101050a0100050d0101050301020503
-0103050301000504010205030102050a0102050201040502010205030102050a01020502
-010005020100050401000504010005040103050201020512010105a7000105010701060d
-0300020204010301020204000504070105040100052a01000540010005220100050b0100
-05140100050a01030597010005a7000105010701060d0300020204010301020204000504
-070105730101051e0101050d01010510010105a5010105a8000105010701060d03000202
-04010301020204000504070105ff05ff050a000105010701060d03000202040103010202
-04000504070105ff05ff050a000105010701000d03000202040103010202040005040701
-0507010005010100056401000501010005ff05950001050107010600000c030002020401
-03010202040005040701050701000501010005040100051201020521010105050100050b
-0100051001000501010005ff059500010501070106000001050807010300020204010301
-0202040005040701050701000501010005040100051401000520010005070100051d0100
-0501010005ff059500010501070106010001050707010300020204010301020204000504
-0701050701000501010005020104050201020503010205050100050a0101050001000502
-010205020100050001010504010005040101050001000509010205030102050201010500
-0100050201000501010005ff059500010501070106010001050607010600030002020401
-030102020400050407010510010005030100050201000501010005020100050401000509
-01000501010105010100050201000501010105010100050101040501010005010101050b
-0100050201000502010005010100050001000500010005ff059b00010501070106020001
-050507010600030002020401030102020400050407010510010005030100050201000501
-010005020100050401000509010005020100050101000502010005010100050201000503
-01000503010005020100050b01000506010005010100050001000500010005ff059b0001
-050107010602000105040701060103000202040103010202040005040701051001000503
-010005020100050101000502010005040100050901000502010005010104050101000502
-0100050301000503010005020100050b01000503010305010100050001000500010005ff
-059b00010501070106030001050307010601030002020401030102020400050407010510
-010005030100050201000501010005020100050401000509010005020100050101000505
-010005020100050301000503010005020100050b01000502010005020100050101000500
-01000500010005ff059b0001050107010603000105020701060203000202040103010202
-040005040701051001000503010005020100050101000502010005040100050901000501
-010105010100050201000501010005020100050301000503010005010101050301010505
-01000502010005020100050101000500010005000100050a010105ff058e000105010701
-060400010501070106020300020204010301020204000504070105110101050201020503
-010205050100050a01010500010005020102050201000502010005030100050401010500
-0100050301010505010005030103050101000500010005000100050a010105ff058e0001
-050107010604000105000701060303000202040103010202040005040701052901050505
-010005270100051a010005ff058e00010501070106050000070206030300020204010301
-0202040005040701053101000502010005240100050101000518010105ff058f00010501
-070106050000070106040300020204010301020204000504070100ff00ff000c05010701
-0606070106040300020204010301020204000504070000ff00ff000d0501070106060700
-060503000202040103010202040005ff05ff05150701000d030002020401030102020400
-05ff05ff05150700000e030002020401030102020400050207ff07ff0716050b03000202
-0401030102020400050207ff07ff07150000050b03000202040103010202040005020701
-060d0000060000ff0073067f0001060c0001050b03000202040103010202040005020701
-060b00010700060000ff00720700067f0003060a0001050b030002020401030102020400
-050207010609000207010600000105ff056f0701067f000506080001050b030002020401
-0301020204000502070106070003050007010600000105ff056f0701067f000105010003
-06060001050b030002020401030004040502070106050003050207010600000105ff056f
-0701067f00010503000306040001050b0300040403050502070106030003050407010600
-000105ff056f0701067f00010505000306020001050b0304040003010202040005020701
-06010003050607010600000105ff056f0701067f00010507000306000001050b03000202
-040103010202040005020705050807010600000105ff056f0701067f0001050807030001
-050b0300020204010301020204000502070106010703050607010600000105ff056f0701
-067f00010507070306000001050b03000202040103010202040005020701060307030504
-07010600000105ff056f0701067f00010505070306020001050b03000202040103010202
-04000502070106050703050207010600000105ff056f0701067f00010503070306040001
-050b0300020204010301020204000502070106070703050007010600000105ff056f0701
-067f00010501070306060001050b03000202040103010202040005020701060907040600
-000105ff056f0701067f0001070306080001050b03000202040103010202040005020701
-060b07020600000107ff0771067f00010701060a0001050b030002020401030102020400
-05020701060d07000600000007ff0772067f00000700060c0001050b0300020204010301
-020204000502070100ff00ff0014050b0300020204010301020204000502070000ff00ff
-0015050b03000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040005ff05ff052503000202040103010202040005ff
-05ff052503000202040103010202040003ff03ff0326020204010301021a0400030002ff
-02f304000300021a04010301021a0400030002ff02f304000300021a04010301021a0400
-030002ff02f304000300021a04010301041b030004ff04f40300041c030004ff04ff0430
-
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 17 377 309
-%%EOF
diff --git a/lib/pman/doc/src/warning.gif b/lib/pman/doc/src/warning.gif
deleted file mode 100644
index 96af52360e..0000000000
--- a/lib/pman/doc/src/warning.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/ebin/.gitignore b/lib/pman/ebin/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/pman/ebin/.gitignore
+++ /dev/null
diff --git a/lib/pman/info b/lib/pman/info
deleted file mode 100644
index 22003edcea..0000000000
--- a/lib/pman/info
+++ /dev/null
@@ -1,2 +0,0 @@
-group: tools
-short: A graphical process manager used to inspect Erlang processes.
diff --git a/lib/pman/priv/Makefile b/lib/pman/priv/Makefile
deleted file mode 100644
index a89278fd3a..0000000000
--- a/lib/pman/priv/Makefile
+++ /dev/null
@@ -1,58 +0,0 @@
-# ``The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved via the world wide web at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# The Initial Developer of the Original Code is Ericsson Utvecklings AB.
-# Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings
-# AB. All Rights Reserved.''
-#
-# $Id$
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-include ../vsn.mk
-VSN = $(PMAN_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/pman-$(VSN)
-
-#
-# Macros
-#
-TOOLBAR_FILES = \
- pman.tool \
- pman.gif
-
-#
-# Rules
-#
-
-debug opt:
-
-docs:
-
-clean:
-
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/priv"
- $(INSTALL_DATA) $(TOOLBAR_FILES) "$(RELSYSDIR)/priv"
-
-release_docs_spec:
-
-FORCE:
diff --git a/lib/pman/priv/pman.gif b/lib/pman/priv/pman.gif
deleted file mode 100644
index 4575a397d8..0000000000
--- a/lib/pman/priv/pman.gif
+++ /dev/null
Binary files differ
diff --git a/lib/pman/priv/pman.tool b/lib/pman/priv/pman.tool
deleted file mode 100644
index c04b7d00eb..0000000000
--- a/lib/pman/priv/pman.tool
+++ /dev/null
@@ -1,6 +0,0 @@
-{version,"0.1"}.
-{{tool,"Pman"},
- {start,{pman,start,[]}},
- {icon,"pman.gif"},
- {message,"Process Manager"},
- {html,"../doc/html/index.html"}}.
diff --git a/lib/pman/src/Makefile b/lib/pman/src/Makefile
deleted file mode 100644
index eb0413bdbc..0000000000
--- a/lib/pman/src/Makefile
+++ /dev/null
@@ -1,112 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../vsn.mk
-VSN=$(PMAN_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/pman-$(VSN)
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-MODULES= \
- pman \
- pman_main \
- pman_shell \
- pman_relay \
- pman_relay_server \
- pman_module_info \
- pman_win \
- pman_buf \
- pman_buf_utils \
- pman_buf_buffer \
- pman_buf_converter \
- pman_buf_printer \
- pman_options \
- pman_process \
- pman_tool
-
-HRL_FILES= \
- assert.hrl \
- pman_buf.hrl \
- pman_options.hrl \
- pman_win.hrl
-
-ERL_FILES= $(MODULES:%=%.erl)
-
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
-
-APP_FILE = pman.app
-APP_SRC = $(APP_FILE).src
-APP_TARGET = $(EBIN)/$(APP_FILE)
-
-APPUP_FILE = pman.appup
-APPUP_SRC = $(APPUP_FILE).src
-APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-
-debug opt: $(TARGET_FILES)
-
-clean:
- rm -f $(TARGET_FILES)
- rm -f errs core *~
-
-$(APP_TARGET): $(APP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-docs:
-
-# ----------------------------------------------------
-# Special Targets
-# ----------------------------------------------------
-
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) $(TOOLBOX_FILES) "$(RELSYSDIR)/src"
- $(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) $(TARGET_TOOLBOX_FILES) "$(RELSYSDIR)/ebin"
-
-release_docs_spec:
-
diff --git a/lib/pman/src/assert.hrl b/lib/pman/src/assert.hrl
deleted file mode 100644
index ea3b68cd7c..0000000000
--- a/lib/pman/src/assert.hrl
+++ /dev/null
@@ -1,81 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%% Purpose : Assert macro
-
-
-%% ?ASSERT/2 - will simply return true if the first argument evaluates to true
-%% otherwise it will exit and output (via the error logger) the
-%% second string
-%%
-%% Arguments:
-%% Flag Expression that should evalueate to true or false
-%% String String to return as a part of the exit reason as well
-%% be to be sent to the error logger.
-%%
-%% Returns:
-%% true If the Flag expression evaluates to true
-%%
-%% Exits:
-%% {'EXIT', {assertion_failed, String}}
-%% If the Flag expression evaluates to something other than
-%% true.
-%%
-%% Usage notes:
-%% Please note that the Flag argument must be a valid expression that
-%% evaluates to true.
-%%
-%% Also, avoid any side effects in the Flag, as everything performed
-%% within the scope of the ?ASSERT macro will not be present when
-%% the code is not compiled with the debug_on flag.
-%%
-%% Side effects include the binding of a variable, sending of a
-%% message, etc.
-%%
-
--ifdef(debug_on).
--define(ASSERT(Flag, String),
- case Flag of
- true ->
- true;
- _ ->
- S2 =
- lists:flatten(
- io_lib:format(
- "=ASSERT====~nPid:~p, Module:~p, Line:~p~nTermination because assertion failed:~n~p",
- [self(),?MODULE, ?LINE,String])),
- error_logger:error_report(S2),
- exit({assertion_failed, String})
- end
- ).
-
--define(ALWAYS_ASSERT(String),
- S2 = lists:flatten(
- io_lib:format(
- "=ASSERT====~nPid:~p, Module:~p, Line:~p~nTermination because of unconditional assert:~n~p",
- [self(),?MODULE, ?LINE, String])),
- error_logger:error_report(S2),
- exit({always_assert, String})
- ).
--else.
--define(ASSERT(_Flag,_String), true).
--define(ALWAYS_ASSERT(_String), true).
--endif.
-
-
-
diff --git a/lib/pman/src/pman.app.src b/lib/pman/src/pman.app.src
deleted file mode 100644
index cc32a17296..0000000000
--- a/lib/pman/src/pman.app.src
+++ /dev/null
@@ -1,40 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-{application, pman,
- [{description, "pman The Process Manager"},
- {vsn, "%VSN%"},
- {modules, [
- pman,
- pman_buf,
- pman_buf_buffer,
- pman_buf_converter,
- pman_buf_printer,
- pman_buf_utils,
- pman_main,
- pman_module_info,
- pman_options,
- pman_process,
- pman_relay,
- pman_relay_server,
- pman_shell,
- pman_tool,
- pman_win
- ]},
- {registered, []},
- {applications, [kernel, stdlib]}]}.
diff --git a/lib/pman/src/pman.appup.src b/lib/pman/src/pman.appup.src
deleted file mode 100644
index 7a435e9b22..0000000000
--- a/lib/pman/src/pman.appup.src
+++ /dev/null
@@ -1,19 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-{"%VSN%",[],[]}.
diff --git a/lib/pman/src/pman.erl b/lib/pman/src/pman.erl
deleted file mode 100644
index c8ea34b6b7..0000000000
--- a/lib/pman/src/pman.erl
+++ /dev/null
@@ -1,132 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%%% Purpose : Exported API to the Pman graphical tool
-%%----------------------------------------------------------------------
-
--module(pman).
-
-
-%% ---------------------------------------------------------------
-%% The user interface exports
-%% ---------------------------------------------------------------
--export([start/0,
- start_notimeout/0,
- start/1,
- start_notimeout/1,
- proc/1,
- proc/3]).
-
-%% ---------------------------------------------------------------
-
-%% Timeout for the startup function.
-%% If no {initialization_complete, Pid} message has been received
-%% from the spawned init-function within ?STARTUP_TIMEOUT ms
-%% the start-function will call exit(Reason).
--define(STARTUP_TIMEOUT, 20000).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start/0
-
-start() ->
- start([], ?STARTUP_TIMEOUT). %Start w/o excluded modules
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start_notimeout/0
-
-start_notimeout() ->
- start([],infinity). %Start w/o excluded modules
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start/1
-
-start(LIModuleExcluded) ->
- start(LIModuleExcluded, ?STARTUP_TIMEOUT).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start_notimeout/1
-
-start_notimeout(LIModuleExcluded) ->
- start(LIModuleExcluded, infinity).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start/2 - Spawns the main Pman process, that will supervise
-%% all processes except those running code from the modules
-%% specified in LIModuleExcluded
-%%
-
-start(LIModuleExcluded, Timeout) ->
-
- OSModuleExcluded = ordsets:from_list(LIModuleExcluded),
-
- PidInit = spawn(pman_main, init, [self(), OSModuleExcluded]),
-
- %% Wait for a initialization completion message from
- %% the spawned process before returning its Pid.
- %%
-
- receive
- {initialization_complete, PidInit} ->
- PidInit
-
- %% (Conditional) Failure to start within the time limit will
- %% result in termination
-
- after
- Timeout ->
- exit(PidInit, kill),
- exit({startup_timeout, ?MODULE})
- end.
-
-
-
-%% ---------------------------------------------------------------
-%% If we want to trace just one process, we can call proc, giving it
-%% either the Pid, or the registered name, (Global or local).
-%%
-%% (???)
-%% Note that this function must not be used internally to create a
-%% trace window, since it is assumed that it is started from any
-%% process (esp. the shell) it will not have any supervisor process
-%% that shall be notified about it's exit/death.
-%%
-%% Returns: Trace loop Pid|udefined
-
-%% ---------------------------------------------------------------
-
-
-proc(undefined) ->
- exit(undefined);
-
-proc({shell,P}) when is_pid(P) ->
- pman_shell:start({{shell,P},self()});
-
-proc(P) when is_atom(P) ->
- proc(whereis(P));
-
-proc({global, N}) ->
- proc(global:whereis_name(N));
-
-proc(P) when is_pid(P) ->
- pman_shell:start({P,self()}).
-
-proc(X,Y,Z) ->
- proc(c:pid(X,Y,Z)).
-
diff --git a/lib/pman/src/pman_buf.erl b/lib/pman/src/pman_buf.erl
deleted file mode 100644
index d56ce184fa..0000000000
--- a/lib/pman/src/pman_buf.erl
+++ /dev/null
@@ -1,117 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%%----------------------------------------------------------------------
-%%% Purpose : This module is the exported interface to the buffering mechanism
-%%% used in PMAN to prevent the trace output to congest
-%%% the system.
-%%%
-%%% This module depends on the modules (direct or indirectly):
-%%% pman_buf.hrl
-%%% pman_buf_utils.erl
-%%% pman_buf_buffer.erl
-%%% pman_buf_converter.erl
-%%% pman_buf_printer.erl
-%%%
-%%%----------------------------------------------------------------------
-
--module(pman_buf).
-
-%%-compile(export_all).
--export([start/2,clear/3]).
-
-
--include("pman_buf.hrl").
-
-
-%% The buffering mechanism consists of three processes that
-%% work in a chain to prevent the process monitor from congesting
-%% output mechanism.
-%%
-%% Messages are buffered in the CONVERTER process before they are sent to
-%% to the BUFFER process where they are formatted before they are finally
-%% sent to either a file or the PRINTER process. The printer process
-%% outputs the messages in the graphical user interface.
-%%
-%%
-%%
-%% --> CONVERTER --> BUFFER --> PRINTER --> gui
-%% |
-%% |
-%% |
-%% V
-%%
-%% file
-%%
-
-
-
-
-
-%% ----------------------------------------------------------------
-%% The amount of data produced by a trace message may be large, and
-%% cause the run time system to run out of memory. To avoid this,
-%% the task of storing, cutting buffers, formating data and printing
-%% it is performed by three processes: The buffer, the converter and
-%% the printer.
-%%
-%% The converter accepts the raw data, a list
-%% of {trace,Msg} tuples. Having max priority, it assures that the
-%% amount of raw data stored never excedes ?BUFF_SIZE messages.
-%% (With the exception of the last batch received, which assures that
-%% the last trace message printed is never a buffer cut message.)
-%% Whenever there is space available in the buffer process, (The
-%% Buffer process stores max. ?BUFF_SIZE converted messages),
-%% the buffer asks for more unconverted messages, and ?PRINT_LEN messages
-%% are sent. They are converted by the buffer, and added to the list
-%% of messages to be sent.
-
-%% The printer process requests formatted messages from the buffer,
-%% and in chuncs of ?MAX_OUTPUT sends them to the buffer. If traces
-%% are to be dumped on file, due to the max priority, such is handled
-%% in the converter, and buffers are not cut.
-%%
-
-
-%% ---------------------------------------------------------------
-%% Initializes the buffering mechanism, which consist of three
-%% processes, each involved with a phase of the formattation and
-%% output of data to the process windows.
-
-start(Editor, FileName) ->
- Buffer_Pid = spawn_link(pman_buf_buffer,init,[Editor]),
- Converter_Pid =
- spawn_link(pman_buf_converter,init,[Buffer_Pid, FileName]),
- Buffer_Pid!{converter_pid, Converter_Pid},
- #buffer{converter=Converter_Pid,buffer=Buffer_Pid}.
-
-
-
-%% ---------------------------------------------------------------
-%% Kills the converter and the clears the buffer with formated data
-%% starting a new converter.
-
-clear(Buff,String, FileName) ->
- exit(Buff#buffer.converter,win_killed),
- Converter_Pid=spawn_link(pman_buf_converter,init,[Buff#buffer.buffer,
- FileName]),
- Buff#buffer.buffer!{clear,String,Converter_Pid },
- Buff#buffer{converter = Converter_Pid}.
-
-
-
diff --git a/lib/pman/src/pman_buf.hrl b/lib/pman/src/pman_buf.hrl
deleted file mode 100644
index 3f25dcc5f0..0000000000
--- a/lib/pman/src/pman_buf.hrl
+++ /dev/null
@@ -1,29 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%-compile(export_all).
-%%-export([Function/Arity, ...]).
-
--define(BUFF_SIZE,1000).
--define(EDITOR_MAX,10000).
--define(PRINT_LEN,50).
--define(MAX_OUTPUT,5000).
-
-
--record(buffer,{buffer,converter}).
diff --git a/lib/pman/src/pman_buf_buffer.erl b/lib/pman/src/pman_buf_buffer.erl
deleted file mode 100644
index ad92eb1f3e..0000000000
--- a/lib/pman/src/pman_buf_buffer.erl
+++ /dev/null
@@ -1,102 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%%----------------------------------------------------------------------
-%%% Purpose : The purpouse of the buffer process is to take
-%%% care of the data that is received by the converter
-%%% process and pass it on to the printer process in chunks
-%%% that can be handled.
-%%%
-%%% This module is a part of the buffering system, and
-%%% should not be used except through the API defined
-%%% in the pman_buf module.
-%%%
-%%%----------------------------------------------------------------------
-
--module(pman_buf_buffer).
-
-%%-compile(export_all).
--export([init/1]).
-
--include("pman_buf.hrl").
-
-
-
-%%
-%% Initialization function for the buffer process.
-%% To be started with spawn from the calling process.
-%%
-
-init(Editor) ->
- Printer_pid = spawn_link(pman_buf_printer,init,[Editor,self()]),
- receive
- {converter_pid,Pid} ->
- Pid!{buffer,accept},
- buffer_loop([],0,0,Printer_pid,Pid)
- end.
-
-
-
-%%
-%% Receive loop for the buffer process.
-%%
-
-buffer_loop(Buffer,Size,Acc,Printer,Converter) ->
- receive
- {save_buffer,Name} ->
- Printer!{save_buffer,Name},
- buffer_loop(Buffer,Size,Acc,Printer,Converter);
- {raw,Raw,Length} -> %%output to editor
- New_Size = Size + Length,
- if New_Size < ?BUFF_SIZE ->
- Converter!{buffer,accept};
- true -> ok
- end,
- Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
- New_Buff = lists:append(Buffer,Print),
- buffer_loop(New_Buff,New_Size,Acc,Printer,Converter);
- {clear,Text,N_Converter} ->
- Converter!{buffer,accept},
- Printer!clear,
- buffer_loop([Text],1,1,Printer,N_Converter);
- {printer,send} when Buffer /= [] ->
- if
- Acc > ?EDITOR_MAX ->
- Printer!clear,
- Printer !{buffer,"Cleared Buffer due to Size\n\n"},
- buffer_loop(Buffer,Size,1,Printer,Converter);
- true ->
- {Length,Rest,Print} = pman_buf_utils:split(Buffer,
- ?PRINT_LEN,
- 0,
- []),
- Printer ! {buffer,Print},
- New_Size = Size - Length,
- if New_Size < ?BUFF_SIZE ->
- Converter!{buffer,accept};
- true -> ok
- end,
- buffer_loop(Rest,New_Size,Acc+Length,Printer,Converter)
- end;
- {converter,file} ->
- Converter!{buffer,Buffer},
- self()!{raw,[to_file],1},
- buffer_loop([],0,Acc,Printer,Converter)
- end.
-
-
diff --git a/lib/pman/src/pman_buf_converter.erl b/lib/pman/src/pman_buf_converter.erl
deleted file mode 100644
index c8b3fe37aa..0000000000
--- a/lib/pman/src/pman_buf_converter.erl
+++ /dev/null
@@ -1,190 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%% Purpose : The purpouse of the converter process is to take
-%% care of the raw data that is received by the tracing
-%% process (a pman_shell process) and pass it on to
-%% the buffer process in chunks that can be handled.
-%%
-%% This module is a part of the buffering system, and
-%% should not be used except through the API defined
-%% in the pman_buf module.
-%%
-%%----------------------------------------------------------------------
-
--module(pman_buf_converter).
--compile([{nowarn_deprecated_function,{gs,start,0}}]).
-
-%%-compile(export_all).
--export([init/2]).
-
--include("pman_buf.hrl").
-
-
-%% ---------------------------------------------------------------
-%% Starts the process which received the raw data from the debugger,
-%% cuts and forwards it to the buffer in smaller chunks. High priority
-%% to avoid large message queues waiting to be processed.
-
-init(Buffer_Pid, FileName) ->
- process_flag(priority, max),
- converter_loop(Buffer_Pid,[],0,true,[], FileName).
-
-converter_loop(Buffer_Pid,Raw,Size,State,Last, FileName) ->
- receive
- {file,Shell} ->
- case init_file(lists:append(Raw,Last),
- FileName,
- Shell,
- Buffer_Pid) of
- true -> converter_loop(Buffer_Pid,
- [to_buffer],
- 1,
- State,
- [],
- FileName);
- false -> converter_loop(Buffer_Pid,
- Raw,
- Size,
- State,
- Last,
- FileName)
- end;
- {raw,Trace} ->
- {New_Raw,New_Size,New_State,New_Last} =
- converter_data(Trace, Buffer_Pid, Raw, Size, State, Last),
- converter_loop(Buffer_Pid,
- New_Raw,
- New_Size,
- New_State,
- New_Last,
- FileName);
- {buffer,accept} when Raw /= [] ->
- {Length,Rest,Print} = pman_buf_utils:split(Raw,?PRINT_LEN,0,[]),
- Buffer_Pid!{raw,Print,Length},
- converter_loop(Buffer_Pid,Rest,Size-Length,false,Last,FileName);
- {buffer,accept} when Last /= [] ->
- {New_Raw,New_Size,New_State,New_Last} =
- converter_data(Last,Buffer_Pid,Raw,Size,true,[]),
- converter_loop(Buffer_Pid,
- New_Raw,
- New_Size,
- New_State,
- New_Last,
- FileName);
- {buffer,accept} ->
- converter_loop(Buffer_Pid,Raw,Size,true,Last, FileName);
- {clear,Str} ->
- Buffer_Pid!{clear,Str},
- converter_loop(Buffer_Pid,[],0,State,Last,FileName)
- end.
-
-converter_data(Trace,Buffer_Pid,Raw,Size,State,Last) ->
- if
- ?BUFF_SIZE - Size > 0 ->
- {Len,Rest,New_Trace} = pman_buf_utils:split(Trace,
- ?BUFF_SIZE-Size,
- 0,[]),
- {New_Raw,New_Last} =
- case Rest of
- [] ->
- {lists:append(Raw,New_Trace),Last};
- [_|_] ->
- case Last of
- [] ->
- {lists:append(Raw,New_Trace),Rest};
- _ ->{lists:concat([Raw,New_Trace,[cut_buffer]]),
- Rest}
- end
- end,
- case State of true ->
- {Length,Cut_Raw,Print} = pman_buf_utils:split(New_Raw,
- ?PRINT_LEN,
- 0,[]),
- Buffer_Pid!{raw,Print,Length},
- {Cut_Raw,Size-Length,false,New_Last};
- _ ->
- {New_Raw,Size+Len,false,New_Last}
- end;
- true ->
- {Raw,Size,State,Trace}
- end.
-
-
-%% ---------------------------------------------------------------
-%% Initializes the environment for saving the trace to file. The
-%% actual saving is taken care of by the buffer process.
-
-init_file(Raw,FileName, Name,Buffer_Pid) ->
- case open_file(FileName, Name) of
- {false,T} ->
- pman_win:msg_win(T),
- false;
- {File,T} ->
- Buffer_Pid!{converter,file},
- pman_win:dialog_window(gs:start(),T),
- save_loop_init(File,Raw)
- end.
-
-open_file(FileName, _Shell) ->
-%% L = "pman_trace." ++ Shell,
- case file:open(FileName, [read,write]) of
- {error, _} ->
- Str = "ERROR: Could not create_file\n" ++ FileName,
- {false,Str};
- {ok,File} ->
- file:position(File, {eof, 0}),
- Str1 = " Appending trace log to file\n" ++ FileName,
- {File,Str1}
- end.
-
-
-save_loop_init(Fd,Raw) ->
- {Date, Time} = calendar:local_time(),
- {Year, Month, Day} = Date,
- {Hour, Minute, Second} = Time,
- io:format(Fd,"%%% ~n",[]),
- io:format(Fd,"%%% Trace output~n",[]),
- io:format(Fd,"%%% Started at ~4p-~2p-~2p ~2p:~2p:~2p~n",
- [Year, Month, Day,
- Hour, Minute, Second
- ]),
- io:format(Fd,"%%% ~n~n",[]),
-
- Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
- receive
- {buffer,Text} when is_list(Text) ->
- io:format(Fd,Text,[]),
- io:format(Fd,Print,[]),
- save_loop(Fd)
- end.
-
-save_loop(Fd) ->
- receive
- {raw,Raw} ->
- Print = lists:map(fun(X) -> pman_buf_utils:textformat(X) end, Raw),
- io:format(Fd,Print,[]),
- save_loop(Fd);
- buffer -> true
- end.
-
-
-
-
-
diff --git a/lib/pman/src/pman_buf_printer.erl b/lib/pman/src/pman_buf_printer.erl
deleted file mode 100644
index 3284c57559..0000000000
--- a/lib/pman/src/pman_buf_printer.erl
+++ /dev/null
@@ -1,91 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(pman_buf_printer).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,start,0}}]).
-
-%%-compile(export_all).
--export([init/2]).
-
-
--include("pman_buf.hrl").
-
-%% ---------------------------------------------------------------
-%% Starts the part of the buffer which regulates the flow of data to
-%% be printed in the pid editors
-
-
-init(Editor,Buffer_pid) ->
- Buffer_pid!{printer,send},
- printer_loop(Editor,Buffer_pid).
-
-printer_loop(Editor,Buffer_pid)->
- receive
- {save_buffer,Name} ->
- gs:config(Editor,{save,Name}),
- TT = "Buffer saved in file\n" ++ Name,
- pman_win:dialog_window(gs:start(),TT),
- printer_loop(Editor,Buffer_pid);
- {buffer,Trace} ->
- case lists:flatlength(Trace) of
- Len when Len > ?MAX_OUTPUT ->
- printer_long(lists:flatten(Trace),Editor),
- Buffer_pid!{printer,send},
- printer_loop(Editor,Buffer_pid);
- _ ->
- Buffer_pid!{printer,send},
- print_trace(Editor,Trace),
- printer_loop(Editor,Buffer_pid)
- end;
- clear ->
- pman_win:configeditor(Editor, [{enable, true}]),
- pman_win:configeditor(Editor,clear),
- pman_win:configeditor(Editor, [{enable, false}]),
- printer_loop(Editor,Buffer_pid);
- _Other ->
- printer_loop(Editor,Buffer_pid)
- end.
-
-printer_long([],_) -> ok;
-printer_long(Trace,Editor) ->
- receive
- clear ->
- pman_win:configeditor(Editor, [{enable, true}]),
- pman_win:configeditor(Editor,clear),
- pman_win:configeditor(Editor, [{enable, false}])
- after 0 ->
- {_Length,Rest,Print} = pman_buf_utils:split(Trace,
- ?MAX_OUTPUT,
- 0,
- []),
- print_trace(Editor,Print),
- printer_long(Rest,Editor)
- end.
-
-
-
-%% ---------------------------------------------------------------
-%% Function which print trace messages on the window
-%% ---------------------------------------------------------------
-
-print_trace(Editor,Elements) ->
- pman_win:configeditor(Editor, [{enable, true}]),
- pman_win:configeditor(Editor, [{insert, {'end',Elements}}]),
- pman_win:configeditor(Editor, [{enable, false}]).
diff --git a/lib/pman/src/pman_buf_utils.erl b/lib/pman/src/pman_buf_utils.erl
deleted file mode 100644
index af3982665e..0000000000
--- a/lib/pman/src/pman_buf_utils.erl
+++ /dev/null
@@ -1,106 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--module(pman_buf_utils).
-
-%%-compile(export_all).
--export([textformat/1, split/4]).
-
-
-%% ---------------------------------------------------------------
-%% Funtion which format the trace message
-%% ---------------------------------------------------------------
-
-textformat(died) ->
- "\n\nProcess died\n";
-textformat({died, Pid}) ->
- io_lib:format("~w Process died.~n",[Pid]);
-textformat({shell_died, Old, New}) ->
- io_lib:format("~w Shell Process died. Restarted as ~w~n~n",[Old,New]);
-
-
-textformat(to_buffer) ->
- "\nAppending trace log to Buffer\n\n";
-textformat(to_file) ->
- "\nAppending trace log to File\n\n";
-textformat(cut_buffer) ->
- "\nCUT BUFFER\n\n";
-textformat({trace, From, 'receive', Msg}) ->
- io_lib:format("~w: rec ~s~n", [From,
- tuple_space(Msg)]);
-textformat({trace, From, send, Msg, To}) ->
- io_lib:format("~w: ! To: ~w Msg: ~s~n", [From,
- To,
- tuple_space(Msg)]);
-textformat({trace, From, call, Func}) ->
- io_lib:format("~w: call ~s~n",[From, ffunc(Func)]);
-textformat({trace, From, spawn, Data}) ->
- io_lib:format("~w: spawn ~p~n", [From, Data]);
-textformat({trace, From, link, Data}) ->
- io_lib:format("~w: link ~p~n", [From, Data]);
-textformat({trace, From, unlink, Data}) ->
- io_lib:format("~w: U-lnk ~p~n", [From, Data]);
-
-textformat({trace, From, Op, Data}) ->
- io_lib:format("~w: ~w ~p~n", [From, Op, Data]);
-
-textformat({print, Format, Args}) ->
- io_lib:format(Format, Args);
-textformat(Other) ->
- io_lib:format("~p~n",[Other]).
-
-
-
-
-
-ffunc({M,F, Argl}) ->
- io_lib:format("~w:~w(~s)", [M, F, fargs(Argl)]);
-ffunc(X) -> tuple_space(X).
-fargs([]) -> [];
-fargs([A]) -> tuple_space(A); %% last arg
-fargs([A|Args]) -> [tuple_space(A),", "|fargs(Args)].
-
-
-tuple_space(X) when is_tuple(X) -> print(size(X), X, "}");
-tuple_space(X) -> io_lib:format("~p",[X]).
-
-print(0 , _X, Buff) -> ["{"|Buff];
-print(1 , X, Buff) ->
- Str = tuple_space(element(1, X)),
- ["{",Str|Buff];
-print(Num, X, Buff) ->
- Str = tuple_space(element(Num, X)),
- print(Num-1, X, [", ",Str|Buff]).
-
-
-
-%% ----------------------------------------------------------------
-%% splits the list at element Size, returns Size, and the 2 lists
-%% If the list is not long enough, it returns {size(List),[],List}
-
-
-split([],_,Length,Buff) ->
- {Length,[],lists:reverse(Buff)};
-split(Rest,0,Length,Buff) ->
- {Length,Rest,lists:reverse(Buff)};
-split([L|List],Size,Length,Buff) ->
- split(List,Size-1,Length+1,[L|Buff]).
-
-
-
diff --git a/lib/pman/src/pman_main.erl b/lib/pman/src/pman_main.erl
deleted file mode 100644
index 2f51284293..0000000000
--- a/lib/pman/src/pman_main.erl
+++ /dev/null
@@ -1,789 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(pman_main).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-%% Main process and window
-
--export([init/2]).
-
--record(state, {win, % GS top window
- frame, % GS top frame
- grid, % GS process info grid
-
- size, % int() No. of displayed procs
- w, % int() Window width
- h, % int() Window height
-
- hide_system=false, % bool() Auto-hide system procs
- hide_new=false, % bool() Auto-hide new processes
-
- hide_modules, % ordset() Excluded modules
-
- hide_all=[], % [{node(), bool()}] Hide all
- hide_pids=[], % [{node(), Ordset}] Processes
- % explicitly to hide, per node
- show_pids=[], % [{node(), Ordset}] Processes
- % explicitly to show, per node
-
- shown_pids=[], % [{node(), Ordset}] Processes
- % actually shown, per node
-
- node, % node() Current node
- nodes=[], % [node()] All known nodes
-
- focus=1, % int() Grid line with focus
- focus_pid=undefined, % pid() | undefined Proc in focus
-
- noshell, % bool() Noshell mode on
-
- options}). % term() Trace options settings
-
-
--include("pman_win.hrl").
-
--define(REFRESH_TIME,5000).
-
--define(REQUIRES_FOCUS, % List of menus that should
- ['Trace Process', % be disabled if no process
- 'Kill', % is in focus
- 'Hide Selected Process',
- 'Module']).
-
-%%--Process init and loop-----------------------------------------------
-
-init(PidCaller, OSModuleExcluded) ->
- process_flag(trap_exit, true),
-
- %% Monitor all nodes in a distributed system
- case is_alive() of
-
- %% We have a distributed system
- true -> net_kernel:monitor_nodes(true);
-
- %% No distribution
- false -> ignore
- end,
- Nodes = [node()|nodes()],
-
- %% Create the main window
- %% For some extremely strange reason, the frame must be resized
- %% or the grid won't be visible...
- GridSize = length(processes()) + 61,
- {Window, Grid, Frame, Visible, W, H} =
- pman_win:pman_window(GridSize, OSModuleExcluded, Nodes),
- gse:resize(Frame, ?WIN_WIDTH, ?WIN_HEIGHT-?MENU_HEIGHT),
-
- Noshell = case pman_shell:find_shell() of
- noshell -> true;
- _ -> false
- end,
-
- State1 = #state{win=Window, frame=Frame, grid=Grid,
- size=Visible,
- w=W, h=H,
- hide_modules=OSModuleExcluded,
- node=node(),
- noshell=Noshell},
-
- State2 = lists:foldl(fun(Node, State) -> add_node(Node, State) end,
- State1,
- Nodes),
-
- State3 = refresh(State2),
-
- %% Notify caller that the process appears
- %% to have been started.
- PidCaller ! {initialization_complete, self()},
-
- %% Initiate a 'catch all' trace pattern so call tracing works
- erlang:trace_pattern({'_', '_', '_'}, true, [local]),
-
- %% Read default options file
- Options = restore_options(State3),
-
- loop(State3#state{options=Options}).
-
-add_node(Node, State) ->
- pman_win:add_menu(node, [Node], "Show"),
- State#state{hide_all=nl_update(Node, false, State#state.hide_all),
- hide_pids=nl_update(Node, [], State#state.hide_pids),
- show_pids=nl_update(Node, [], State#state.show_pids),
- shown_pids=nl_update(Node, [], State#state.shown_pids),
- nodes=[Node|State#state.nodes]}.
-
-%% Restore saved options from default file
-restore_options(State)->
- File = options_file(),
- case pman_options:read_from_file(File) of
- {ok, Options} ->
- Options;
- {error, ReasonStr, DefOptions} ->
- Parent = State#state.win,
- Msg = io_lib:format(
- "Problems reading default option file~n~s:~n~s",
- [File, ReasonStr]),
- tool_utils:notify(Parent, Msg),
- DefOptions
- end.
-
-options_file() ->
- {ok, [[Home]]} = init:get_argument(home),
- filename:join([Home, ".erlang_tools", "pman.opts"]).
-
-loop(State) ->
- receive
- {nodeup, Node} ->
- case nl_exists(Node, State#state.hide_all) of
- true ->
- pman_win:add_menu(node, [Node], "Show"),
- loop(State#state{nodes=[Node|State#state.nodes]});
- false ->
- loop(add_node(Node, State))
- end;
-
- {nodedown, Node} ->
- pman_win:remove_menu([Node]),
-
- Msg = io_lib:format("Node~n~p~ndown.", [Node]),
- spawn_link(tool_utils, notify, [State#state.win, Msg]),
-
- %% We remove Node from the list of nodes but not from
- %% the other lists of State, in case Node reappears later
- Nodes = lists:delete(Node, State#state.nodes),
- State2 = State#state{nodes=Nodes},
-
- %% If it was the shown node that went down,
- %% change overview to this node
- if
- Node==State#state.node ->
- State3 = execute_cmd({node,node()}, State2, [], []),
- loop(State3);
- true ->
- loop(State2)
- end;
-
- %% Ignore EXIT signals from help processes
- {'EXIT', _Pid, _Reason} ->
- loop(State);
-
- %% GS events
- {gs, _Obj, _Event, _Data, _Args} = Cmd ->
- case gs_cmd(Cmd, State) of
- stop ->
- exit(topquit);
- State2 ->
- loop(State2)
- end
-
- after ?REFRESH_TIME ->
- State2 = refresh(State),
- loop(State2)
- end.
-
-%% gs_cmd(Event, State) -> stop | State'
-gs_cmd(Event, State) ->
- case Event of
-
- %% --- Window manager commands ---
-
- %% Window is moved or resized
- {gs, _, configure, _Data, Args} ->
- configure(Args, State);
-
- %% Window closed, stop Pman
- {gs, _, destroy, _, _} ->
- stop;
-
- %% --- Dynamic commands ---
-
- %% Click in any object where the GS Data field is a 2-tuple
- {gs, _, click, Data, Args} when is_tuple(Data), size(Data)==2 ->
- execute_cmd(Data, State, [], Args);
-
- %% Single click in the grid sets focus to selected process
- {gs, _, click, {pidfunc,_,_}, [_,Row|_]} when is_integer(Row) ->
- focus(Row, State);
-
- %% Double click in the grid starts tracing of selected process
- {gs, _, doubleclick, {pidfunc,_,_}, [_Col,Row| _]} when is_integer(Row) ->
- execute_cmd('Trace Process', State, [], []);
-
- %% Click in named GS objects
- {gs, Cmd, click, Data, Args} when is_atom(Cmd);
- is_atom(element(1, Cmd)) ->
- execute_cmd(Cmd, State, Data, Args);
-
- %% --- Keyboard accelerator commands ---
-
- %% Move focus up and down
- {gs, _, keypress, [], ['Up',_,0,0]} ->
- execute_cmd(focus_previous, State, [], []);
- {gs, _, keypress, [], ['Down',_,0,0]} ->
- execute_cmd(focus_next, State, [], []);
-
- %% Other keyboard shortcuts
- {gs, _, keypress, [], ['Return',_,0,0]} ->
- execute_cmd('Trace Process', State, [], []);
- {gs, _, keypress, [], [Key,_,0,1]} ->
- execute_cmd(shortcut(Key), State, [], []);
-
- %% Ignore all other GS events
- _Other ->
- State
- end.
-
-%% Keyboard shortcuts
-
-%% File menu
-shortcut(o) -> 'Default Options';
-shortcut(e) -> 'Exit';
-shortcut(z) -> 'Exit';
-
-%% View menu
-shortcut(i) -> 'Hide All';
-shortcut(u) -> 'Hide Modules';
-shortcut(d) -> 'Hide Selected Process';
-shortcut(m) -> 'Module';
-shortcut(r) -> 'Refresh';
-
-%% Trace menu
-shortcut(k) -> 'Kill';
-shortcut(t) -> 'Trace Process';
-shortcut(s) -> 'Trace Shell';
-
-%% Help menu
-shortcut(h) -> 'Help';
-
-%% Keyboard command only
-shortcut(l) -> 'All Links';
-
-%% Process grid traversal
-shortcut(p) -> focus_previous;
-shortcut(n) -> focus_next;
-shortcut(_) -> dummy.
-
-%% configure([W,H,X,Y|_], State) -> State'
-%% Window has been moved or resized
-configure([W,H|_], State) ->
- if
- W==State#state.w, H==State#state.h ->
- ignore;
-
- true ->
- gse:resize(State#state.frame, W, H-?MENU_HEIGHT),
-
- Grid = State#state.grid,
- case abs(W - gs:read(Grid,width) - 6) of
- 0 ->
- ok; %% Avoid refreshing width if possible
- _Anything ->
- Cols = pman_win:calc_columnwidths(W-6),
- gs:config(Grid, Cols)
- end,
- pman_win:configwin(Grid, W, H)
- end,
- State.
-
-%% focus(Row, State) -> State'
-%% Row = int() Grid row
-%% User has selected a row in the grid.
-%% Row==1 means header row.
-focus(Row, State) ->
-
- Pid = case get_pid_in_focus(Row, State#state.grid) of
- {true, {pidfunc,Pid0,_}} ->
- pman_win:change_colour(State#state.grid,
- State#state.focus, Row),
- enable_pid_actions(),
- Pid0;
- false ->
- disable_pid_actions(),
- undefined
- end,
-
- State#state{focus=Row, focus_pid=Pid}.
-
-%% get_pid_in_focus(Row, Grid) -> {true, Data} | false
-%% Data = {pidfunc, Pid, Func}
-%% Func = {Mod,Name,Arity} | term()
-%% Return the data associated with the process in focus if there is one,
-get_pid_in_focus(1, _Grid) ->
- false;
-get_pid_in_focus(Row, Grid) ->
- case gs:read(Grid, {obj_at_row,Row}) of
- undefined -> false;
- GridLine ->
- Data = gs:read(GridLine, data),
- {true, Data}
- end.
-
-%% execute_cmd(Cmd, State, Data, Args) -> stop | State'
-
-%% Checkbutton "Hide System Processes"
-execute_cmd('Hide System', State, _Data, Args) ->
- [_Text, _Group, Bool|_Rest] = Args,
- State2 = State#state{hide_system=Bool},
- refresh(State2);
-
-%% Checkbutton "Auto-Hide New"
-execute_cmd('Auto Hide New', State, _Data, Args ) ->
- [_Text, _Group, Bool|_Rest] = Args,
- refresh(State#state{hide_new=Bool});
-
-%% File->Options...
-execute_cmd('Default Options', State, _Data, _Args) ->
- OldOptions = State#state.options,
- NewOptions = pman_options:dialog(State#state.win,
- "Default Trace Options",
- OldOptions),
- case NewOptions of
- {error, _Reason} ->
- State;
- Options ->
- State#state{options=Options}
- end;
-
-%% File->Save Options
-%% Save the set default options to the user's option file
-execute_cmd('Save Options', State, _Data, _Args)->
- Options = State#state.options,
- File = options_file(),
- Parent = State#state.win,
-
- case pman_options:save_to_file(Options, File) of
- ok ->
- tool_utils:notify(Parent, "Options saved to\n" ++ File);
- {error, ReasonStr} ->
- Msg = io_lib:format("Could not save options to~n~s:~n~s",
- [File, ReasonStr]),
- tool_utils:notify(Parent, Msg)
- end,
- State;
-
-%% File->Exit
-%% Exit the application
-execute_cmd('Exit', _State, _Data, _Args) ->
- stop;
-
-%% View->Hide All Processes
-execute_cmd('Hide All', State, _Data, _Args) ->
- Node = State#state.node,
- HideAll = nl_update(Node, true, State#state.hide_all),
- ShowPids = nl_del_all(State#state.node, State#state.show_pids),
- State2 = State#state{hide_all=HideAll, show_pids=ShowPids},
- refresh(State2, true);
-
-%% View->Hide modules...
-%% Opens a dialog where the user can select from a list of
-%% the loaded modules.
-%% The selected module is added to the list of hidden modules.
-execute_cmd('Hide Modules', State, _Data, _Args) ->
-
- %% Get all loaded modules that are not already hidden
- AllModules = lists:map(fun({Module, _File}) -> Module end,
- code:all_loaded()),
- ModulesSet = ordsets:subtract(ordsets:from_list(AllModules),
- State#state.hide_modules),
-
- %% Let the user select which of the loaded modules to exclude from
- %% the process overview
- Title = "Module selection",
- case pman_tool:select(State#state.win, Title, ModulesSet) of
- Modules when is_list(Modules) ->
- HideModules = ordsets:union(State#state.hide_modules,
- ordsets:from_list(Modules)),
- refresh(State#state{hide_modules=HideModules});
- cancelled -> State
- end;
-
-%% View->Hide Selected Process
-%% The process in focus should explicitly be hidden
-execute_cmd('Hide Selected Process', State, _Data, _Args) ->
- case State#state.focus_pid of
- undefined -> State;
- Pid ->
- Node = State#state.node,
- HidePids = nl_add(Node, Pid, State#state.hide_pids),
- ShowPids = nl_del(Node, Pid, State#state.show_pids),
- refresh(State#state{hide_pids=HidePids, show_pids=ShowPids})
- end;
-
-%% View->Module Info...
-%% Open window with module information.
-execute_cmd('Module', State, _Data, _Args) ->
- case get_pid_in_focus(State#state.focus, State#state.grid) of
- {true, {pidfunc, _Pid, {Module,_Name,_Arity}}} ->
- pman_module_info:start(Module);
- _ -> % false | {true, {pidfunc, Pid, Other}}
- ignore
- end,
- State;
-
-%% View->Refresh
-%% Refresh the main window.
-%% (Called automatically every ?REFRESH_TIME millisecond)
-execute_cmd('Refresh', State, _Data, _Args) ->
- refresh(State);
-
-%% View->Show All Processes
-%% Makes all processes visible except system processes and new
-%% processes, if those buttons are checked.
-%% Note: Also un-hides all hidden modules!
-execute_cmd('Show All', State, _Data, _Args) ->
- Node = State#state.node,
- HideAll = nl_update(Node, false, State#state.hide_all),
- HidePids = nl_del_all(State#state.node, State#state.hide_pids),
- ShowPids = nl_del_all(State#state.node, State#state.show_pids),
- State2 = State#state{hide_modules=ordsets:new(), hide_all=HideAll,
- hide_pids=HidePids, show_pids=ShowPids},
- refresh(State2, true);
-
-%% View->Show Processes...
-%% Open a list of all hidden processes, if the user selects one this
-%% process should explicitly be shown
-execute_cmd('Show Selected', State, _Data, _Args) ->
- Node = State#state.node,
-
- All = pman_process:r_processes(Node),
- Hidden = case nl_lookup(Node, State#state.hide_all) of
- true ->
- All;
- false ->
- Shown = nl_lookup(Node, State#state.shown_pids),
- ordsets:subtract(All, Shown)
- end,
-
- %% Selection window
- Title = "Select Processes to Show",
- Tuples =
- lists:map(fun(Pid) ->
- {M,F,A} = pman_process:function_info(Pid),
- Str = case pman_process:get_name(Pid) of
- " " ->
- io_lib:format("~p:~p/~p",
- [M, F, A]);
- Name ->
- io_lib:format("[~p] ~p:~p/~p",
- [Name, M, F, A])
- end,
- {Pid, Str}
- end,
- Hidden),
- case pman_tool:select(State#state.win, Title, Tuples) of
- Pids when is_list(Pids) ->
- HidePids = nl_del(Node, Pids, State#state.hide_pids),
- ShowPids = nl_add(Node, Pids, State#state.show_pids),
- refresh(State#state{hide_pids=HidePids,show_pids=ShowPids});
- cancelled -> State
- end;
-
-%% Trace->Kill
-execute_cmd('Kill', State, _Data, _Args) ->
- case State#state.focus_pid of
- Pid when is_pid(Pid) ->
- exit(Pid, kill);
- undefined ->
- ignore
- end,
- State;
-
-%% Trace->Selected Process
-execute_cmd('Trace Process', State, _Data, _Args) ->
- case State#state.focus_pid of
- Pid when is_pid(Pid) ->
- pman_shell:start({Pid,self()}, State#state.options);
- undefined ->
- ignore
- end,
- State;
-
-%% Trace->Shell Process
-execute_cmd('Trace Shell', State, _Data, _Args) ->
- case pman_shell:find_shell() of
- noshell ->
- State;
- Shell ->
- pman_shell:start({{shell,Shell},self()},
- State#state.options),
- State#state{noshell=false}
- end;
-
-%% Nodes->Show <Node>
-%% Change shown node
-execute_cmd({node,Node}, State, _Data, _Args) ->
- gse:config(State#state.win,
- [{title,lists:concat(["Pman: Overview on ", Node])}]),
- gse:disable(Node),
- catch gse:enable(State#state.node), % Menu may not exist any more
- refresh(State#state{node=Node}, true);
-
-%% Help->Help
-execute_cmd('Help', State, _Data, _Args) ->
- Win = State#state.win,
- HelpFile =
- filename:join([code:lib_dir(pman),"doc","html","index.html"]),
- tool_utils:open_help(Win, HelpFile),
- State;
-
-%% Keyboard shortcut Ctrl-l
-execute_cmd('All Links', State, _Data, _Args) ->
- case State#state.focus_pid of
- Pid when is_pid(Pid) ->
- case process_info(Pid, links) of
- {links, Pids} ->
- pman_shell:start_list(Pids, self(),
- State#state.options);
- undefined ->
- ignore
- end;
- undefined -> ignore
- end,
- State;
-
-%% Keyboard shortcuts for process grid traversal
-execute_cmd(focus_previous, State, _Data, _Args) ->
- focus(previous_row(State), State);
-execute_cmd(focus_next, State, _Data, _Args) ->
- focus(next_row(State), State);
-
-%% Keyboard combinations that are not shortcuts
-execute_cmd(dummy, State, _Data, _Args) ->
- State.
-
-%% Convenience functions for disabling/enabling menu items that require
-%% that a process is selected.
-disable_pid_actions() ->
- lists:foreach(fun(X) -> gse:disable(X) end, ?REQUIRES_FOCUS).
-
-enable_pid_actions() ->
- lists:foreach(fun(X) -> gse:enable(X) end, ?REQUIRES_FOCUS).
-
-%% refresh(State) -> State'
-%% refresh(State, ForceP) -> State'
-%% Refreshes the main window.
-refresh(State) ->
- refresh(State, false).
-refresh(#state{node=Node} = State, ForceP) ->
-
- %% Update shown processes
-
- %% First, get an ordset of all processes running at the current node
- All = pman_process:r_processes(Node),
-
- Shown = nl_lookup(Node, State#state.shown_pids),
- ExpShown = nl_lookup(Node, State#state.show_pids),
-
- {Show, State2} =
- case nl_lookup(Node, State#state.hide_all) of
-
- %% If the user has selected "Hide All Processes", only
- %% explicitly selected processes which still exist should
- %% be shown
- true ->
- {ordsets:intersection(ExpShown, All), State};
-
- false ->
- %% Compute which processes should be hidden according
- %% to the flags/menu items selected
- Hidden = hidden_pids(All, State),
-
- NotHidden = ordsets:subtract(All, Hidden),
-
- Show0 = case State#state.hide_new of
- %% If the user has selected "Auto-Hide New",
- %% then only those processes in NotHidden
- %% which are already shown, should be shown,
- %% together with explicitly selected
- %% processes which still exist
- true ->
- ordsets:union(
- ordsets:intersection(NotHidden,Shown),
- ordsets:intersection(ExpShown, All));
-
- %% Otherwise, show all processes in
- %% NotHidden, together with explicitly
- %% selected processes which still exist
- false ->
- ordsets:union(
- NotHidden,
- ordsets:intersection(ExpShown, All))
- end,
-
- ShownPids = nl_update(Node, Show0,
- State#state.shown_pids),
- {Show0, State#state{shown_pids=ShownPids}}
- end,
-
- NoOfHidden = length(All) - length(Show),
-
- if
- Show==Shown, not ForceP ->
- pman_win:update(NoOfHidden),
- State;
-
- true ->
- ShowInfo = display_info(Show),
- pman_win:update(State#state.grid, ShowInfo, NoOfHidden),
-
- %% Set the focus appropriately
- State3 = case State2#state.focus_pid of
- undefined ->
- disable_pid_actions(),
- State2;
- Pid ->
- Row = get_row(Pid, Show),
- focus(Row, State2)
- end,
-
- trace_shell_possible(State3),
-
- Size = length(Show),
- case Size of
- 1 -> gse:disable('Hide All');
- _ -> gse:enable('Hide All')
- end,
-
- State3#state{size=Size}
- end.
-
-%% hidden_pids(All, State) -> Hidden
-hidden_pids(All, State) ->
-
- %% Processes hidden because they are system processes
- HideSys = case State#state.hide_system of
- true ->
- lists:filter(
- fun(Pid) ->
- pman_process:is_system_process(Pid)
- end,
- All);
- false ->
- []
- end,
-
- %% Process hidden because they are executing code in a hidden module
- Mods = State#state.hide_modules,
- HideMod =
- lists:filter(fun(Pid) ->
- pman_process:is_hidden_by_module(Pid, Mods)
- end,
- All),
-
- %% Explicitly hidden processes
- HideExp = nl_lookup(State#state.node, State#state.hide_pids),
-
- %% All hidden processes
- ordsets:union([HideSys, HideMod, HideExp]).
-
-display_info(Pids) ->
- lists:map(fun(Pid) ->
- Func = pman_process:function_info(Pid),
- Name = pman_process:get_name(Pid),
- Msgs = pman_process:msg(Pid),
- Reds = pman_process:reds(Pid),
- Size = pman_process:psize(Pid),
- {Pid, Func, Name, Msgs, Reds, Size}
- end,
- Pids).
-
-get_row(Pid, List) ->
- get_row(Pid, List, length(List)+1).
-
-get_row(Pid, [Pid | _], Row) ->
- Row;
-get_row(Pid, [_ | T], Row) ->
- get_row(Pid, T, Row-1);
-get_row(_Pid, [], _Row) ->
- 1.
-
-next_row(#state{size=Size, focus=Row}) ->
- check_row(Row+1, Size).
-
-previous_row(#state{size=Size, focus=Row}) ->
- check_row(Row-1, Size).
-
-check_row(1, Size) ->
- Size+1;
-check_row(Row, Size) when Row==Size+2 ->
- 2;
-check_row(Row, _Size) ->
- Row.
-
-%% Check if node is running in noshell mode and if so disable the
-%% 'Trace Shell' menu option.
-trace_shell_possible(#state{noshell=true}) ->
- gse:disable('Trace Shell');
-trace_shell_possible(_) ->
- ok.
-
-%% -- Functions for manipulating {Node, Data} lists --
-
-%% nl_add(Node, Elem|Elems, NList) -> NList'
-nl_add(Node, Elems, [{Node, Ordset} | T]) when is_list(Elems) ->
- [{Node, ordsets:union(Elems, Ordset)} | T];
-nl_add(Node, Elem, [{Node, Ordset} | T]) ->
- [{Node, ordsets:add_element(Elem, Ordset)} | T];
-nl_add(Node, Elem, [H | T]) ->
- [H | nl_add(Node, Elem, T)];
-nl_add(Node, Elems, []) when is_list(Elems) ->
- [{Node, Elems}];
-nl_add(Node, Elem, []) ->
- [{Node, ordsets:add_element(Elem, ordsets:new())}].
-
-%% nl_del(Node, Elem|Elems, NList) -> NList'
-nl_del(Node, Elems, [{Node, Ordset} | T]) when is_list(Elems) ->
- [{Node, ordsets:subtract(Ordset, Elems)} | T];
-nl_del(Node, Elem, [{Node, Ordset} | T]) ->
- [{Node, ordsets:del_element(Elem, Ordset)} | T];
-nl_del(Node, Elem, [H | T]) ->
- [H | nl_del(Node, Elem, T)];
-nl_del(_Node, _Elem, []) ->
- [].
-
-%% nl_del_all(Node, NList) -> NList'
-nl_del_all(Node, [{Node, _Ordset} | T]) ->
- [{Node, ordsets:new()} | T];
-nl_del_all(Node, [H | T]) ->
- [H | nl_del_all(Node, T)];
-nl_del_all(_Node, []) ->
- [].
-
-%% nl_update(Node, Val, NList) -> NList'
-nl_update(Node, Val, [{Node, _OldVal} | T]) ->
- [{Node, Val} | T];
-nl_update(Node, Val, [H | T]) ->
- [H | nl_update(Node, Val, T)];
-nl_update(Node, Val, []) ->
- [{Node, Val}].
-
-%% nl_lookup(Node, NList) -> Val
-nl_lookup(Node, NList) ->
- {value, {_Node,Val}} = lists:keysearch(Node, 1, NList),
- Val.
-
-%% nl_exists(Node, NList) -> bool()
-nl_exists(Node, NList) ->
- case lists:keysearch(Node, 1, NList) of
- {value, _Val} ->
- true;
- false ->
- false
- end.
diff --git a/lib/pman/src/pman_module_info.erl b/lib/pman/src/pman_module_info.erl
deleted file mode 100644
index 944fd4a462..0000000000
--- a/lib/pman/src/pman_module_info.erl
+++ /dev/null
@@ -1,133 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(pman_module_info).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,start,1}}]).
-
-%% Window with module information (View->Module Info...)
-
-%% External exports
--export([start/1]).
-
-%% Record for keeping the loop state for the
-%% module info process.
--record(state, {topwin, % GS identifier for top window
- editor, % GS identifier for editor
- module, % Name of the viewed module
- parent}). % Pid of the parent
-
-start(Module) ->
- Self = self(),
- spawn_link(fun() -> init(Module, Self) end).
-
-init(Module, Parent) ->
- process_flag(trap_exit, true),
-
- GS = gs:start([{kernel,true}]),
- Font = pman_win:font(GS),
-
- WinTitle = lists:flatten(io_lib:format("Pman - Module Info: ~p",
- [Module])),
- WinOptions = [{title,WinTitle}, {width,550}, {height, 400},
- {configure,true}, {keypress,true}, {destroy,true}],
- TopWindow = gse:window(GS, WinOptions),
-
- %% File menu
- MenuBar = gse:menubar(TopWindow, []),
- MBFile = gse:menubutton(MenuBar, [{label,{text," File "}},
- {font,Font}, {underline, 1}]),
- MenuFile = gse:menu(MBFile, []),
-
- gse:named_menuitem('Save buffer', MenuFile,
- [{label,{text,"Save buffer..."}},
- {font,Font}, {underline,0}]),
- gse:named_menuitem('Close', MenuFile,
- [{label,{text,"Close"}},
- {font,Font}, {underline,0}]),
-
- %% Output part of window
- Editor = gse:editor(TopWindow,
- [{font,Font},
- {x,3}, {y,40}, {width,546}, {height,348}]),
- gse:config(Editor, [{keypress,true},
- {insert,{'end',pman_win:module_data(Module)}}]),
- gse:config(Editor, [{enable,false},
- {vscroll,right}, {hscroll,bottom},
- {wrap,none}]),
- gse:map(TopWindow),
-
- State = #state{topwin=TopWindow, editor=Editor, module=Module,
- parent=Parent},
- loop(State).
-
-loop(State) ->
-
- receive
- %% Die if the parent dies
- {'EXIT', Pid, _Reason} when Pid==State#state.parent ->
- gse:destroy(State#state.topwin);
-
- %% Ignore other exit signals (from file dialog window)
- {'EXIT', _Pid, _Reason} ->
- loop(State);
-
- %% Window closed
- {gs, _TopWindow, destroy, [], []} ->
- ok;
-
- %% Window resized or moved
- {gs, _TopWindow, configure ,_Data, [W,H,_X,_Y|_]} ->
- gs:config(State#state.editor, [{width,W-3}, {height,H-40}]),
- loop(State);
-
- %% Close - destroy window and exit process
- {gs, 'Close', click, _Data, _Args} ->
- gse:destroy(State#state.topwin),
- ok;
-
- %% Save Buffer - make filename and save buffer to file
- {gs, 'Save buffer', click, _Data, _Args} ->
- save_buffer(State),
- loop(State);
-
- %% Keyboard accelerator commands
- {gs, _, keypress, [], [c,_,0,1]} -> % 'Close'
- gse:destroy(State#state.topwin),
- ok;
- {gs, _, keypress, [], [s,_,0,1]} -> % 'Save buffer'
- save_buffer(State),
- loop(State);
- {gs, _, keypress, _Data, _Args} ->
- loop(State)
- end.
-
-save_buffer(State) ->
- DefaultFile = atom_to_list(State#state.module) ++ ".module_info",
- Result = tool_utils:file_dialog([{type,save}, {file,DefaultFile}]),
- case Result of
- %% User selected a file, now save the result
- {ok, File, _Dir} ->
- gs:config(State#state.editor, {save,File}),
- Msg = "Module information saved in file\n" ++ File,
- tool_utils:notify(State#state.topwin, Msg);
-
- %% File dialog was cancelled in some way.
- {error, _Reason} ->
- ignore
- end.
diff --git a/lib/pman/src/pman_options.erl b/lib/pman/src/pman_options.erl
deleted file mode 100644
index 0765458fdc..0000000000
--- a/lib/pman/src/pman_options.erl
+++ /dev/null
@@ -1,395 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(pman_options).
-
-%% Window with trace options settings (File->Options...)
-
--export([dialog/3,
- read_from_file/1, save_to_file/2]).
-
--include("pman_options.hrl").
-
--define(WIN_WIDTH, 350).
--define(WIN_HEIGHT, 350).
-
--define(TOP_WINDOW, xx_pman_option_window_xx).
--define(TOP_FRAME, xx_pman_top_frame_xx).
-
--record(state, {resize_frame, % GS identifier for the main frame
- parent}). % Pid of parent
-
-%%--dialog/3------------------------------------------------------------
-%% Create a window, or return a value indicating that is is already
-%% created.
-
-dialog(ParentWin, Title, Options) ->
- Self = self(),
- Pid = spawn(fun() -> dialog(Self, ParentWin, Title, Options) end),
- receive
- {Pid, Value} ->
- Value % Options2 | {error,destroyed} | {error,cancelled}
- end.
-
-dialog(Parent, ParentWin, Title, Options) ->
-
- %% Check if the dialog has already been created, in that
- %% case, we can reuse it. Otherwise a new dialog is created.
- case gse:name_occupied(?TOP_WINDOW) of
- false -> make_window(ParentWin, Title);
- true -> ok
- end,
-
- %% Window has now been created or may be re-used
- update_window_from_options(Options),
-
- gse:resize(?TOP_FRAME, ?WIN_WIDTH, ?WIN_HEIGHT),
- gse:map(?TOP_WINDOW),
-
- loop(#state{resize_frame=?TOP_FRAME, parent=Parent}).
-
-loop(State) ->
- receive
- {gs, _Id, destroy, _Data, _Arg} ->
- State#state.parent ! {self(), {error,destroyed}};
-
- {gs, ?TOP_WINDOW, configure, _Data, [W, H |_]} ->
- gse:config(State#state.resize_frame,
- [{width,W},{height,H}]), % repack
- loop(State);
-
- {gs, ok_button, click, _Data, _Arg} ->
- Options = get_options_from_window(),
- gse:unmap(?TOP_WINDOW),
- State#state.parent ! {self(), Options};
-
- {gs, cancel_button, click, _Data, _Arg} ->
- gse:unmap(?TOP_WINDOW),
- State#state.parent ! {self(), {error,cancelled}};
-
- {gs, trace_spawn, click, _Data, [_Text,_,Value]} ->
- group_radio(Value, trace_spawn_all, [trace_spawn_all,
- trace_spawn_first]),
- loop(State);
-
- {gs, trace_link, click, _Data, [_Text,_,Value]} ->
- group_radio(Value, trace_link_all, [trace_link_all,
- trace_link_first]),
- loop(State);
-
- {gs, trace_in_window, click, _Data, _Arg} ->
- lists:foreach(fun(X) -> gse:disable(X) end,
- [trace_file, trace_file_browse]),
- loop(State);
-
- {gs, trace_to_file, click, _Data, [_Text,_,_Value]} ->
- lists:foreach(fun(X) -> gse:enable(X) end,
- [trace_file, trace_file_browse]),
- loop(State);
-
- {gs, trace_file_browse, click, _Data, _Arg} ->
- Result = tool_utils:file_dialog([{type,save},
- {file, "Untitled.log"}]),
- case Result of
- {error, _Reason} ->
- loop(State);
- {ok, Name,_State} ->
- gse:config(trace_file, [{text, Name}]),
- loop(State)
- end
- end.
-
--define(LBLOPTS, [{justify,left}, {align,w}]).
--define(BTNOPTS, [{justify,left}, {align,w}]).
-
-make_window(ParentWin, Title) ->
-
- Font = pman_win:font(),
-
- gse:named_window(?TOP_WINDOW, ParentWin, [{title,Title},
- {configure,true},
- {width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT}]),
-
- gse:named_frame(?TOP_FRAME, ?TOP_WINDOW,
- [{bw,3},
- {packer_x,[{stretch,1,175}, {stretch,1,175}]},
- {packer_y,[{stretch,3},{stretch,2},{stretch,1}]}]),
-
- F11 = gse:frame(?TOP_FRAME, [{bw,3},
- {pack_xy,{1,1}},
- {packer_x,[{stretch,1},
- {stretch,20},
- {stretch,2}]},
- {packer_y,[{stretch,2},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1}]}]),
-
- gse:label(F11,[{pack_xy,{2,1}},
- {label,{text,"Trace output options:"}},
- {font,Font} | ?LBLOPTS]),
-
- gse:named_checkbutton(trace_send, F11,
- [{pack_xy,{2,2}},
- {label,{text,"Trace send"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_checkbutton(trace_receive, F11,
- [{pack_xy,{2,3}},
- {label,{text, "Trace receive"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_checkbutton(trace_functions,F11,
- [{pack_xy,{2,4}},
- {label,{text, "Trace functions"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_checkbutton(trace_events,F11,
- [{pack_xy,{2,5}},
- {label,{text, "Trace events"}},
- {font,Font} | ?BTNOPTS]),
-
- F21 = gse:frame(?TOP_FRAME, [{bw,3},
- {pack_xy,{2,1}},
- {packer_x,[{stretch,1},
- {stretch,2},
- {stretch,2},
- {stretch,20},
- {stretch,1}]},
- {packer_y,[{stretch,2},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1},
- {stretch,1}]}]),
-
- gse:label(F21, [{pack_xy,{{2,4},1}},
- {label,{text,"Inheritance options:"}},
- {font,Font} | ?LBLOPTS]),
-
- gse:named_checkbutton(trace_spawn, F21,
- [{pack_xy,{{2,4},2}},
- {data,trace_send},
- {label,{text,"Inherit on spawn"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_radiobutton(trace_spawn_all, F21,
- [{pack_xy,{{3,4},3}},
- {group,spawn},
- {data,trace_receive},
- {label,{text, "All spawns"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_radiobutton(trace_spawn_first, F21,
- [{pack_xy,{{3,4},4}},
- {group,spawn},
- {data,trace_receive},
- {label,{text,"First spawn only"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_checkbutton(trace_link, F21,
- [{pack_xy,{{2,4},6}},
- {data,trace_send},
- {label,{text,"Inherit on link"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_radiobutton(trace_link_all, F21,
- [{pack_xy,{{3,4},7}},
- {group,link},
- {data,trace_receive},
- {label,{text,"All links"}},
- {font,Font} | ?BTNOPTS]),
-
- gse:named_radiobutton(trace_link_first, F21,
- [{pack_xy,{{3,4},8}},
- {group,link},
- {data,trace_receive},
- {label,{text,"First link only"}},
- {font,Font} | ?BTNOPTS]),
-
- F12 = gse:frame(?TOP_FRAME, [{bw,3},
- {pack_xy,{{1,2},2}},
- {packer_x,[{stretch,1},
- {stretch,5}, % Label
- {stretch,1},
- {stretch,10}, % Field
- {stretch,1},
- {stretch,5}, % Button
- {stretch,1}]},
- {packer_y,[{stretch,2},
- {stretch,1},
- {stretch,1},
- {stretch,1}]}]),
-
- gse:label(F12, [{pack_xy,{{2,6},1}},
- {label,{text,"Trace output options:"}},
- {font,Font} | ?LBLOPTS]),
- gse:named_radiobutton(trace_in_window, F12,
- [{pack_xy,{{2,6},2}},
- {group, trace_dest},
- {label,{text,"In window"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_radiobutton(trace_to_file, F12,
- [{pack_xy,{2,3}},
- {group, trace_dest},
- {label,{text,"To file"}},
- {font,Font} | ?BTNOPTS]),
- gse:named_entry(trace_file, F12, [{pack_xy,{4,3}}, {font,Font}]),
- gse:named_button(trace_file_browse, F12,
- [{pack_xy,{6,3}},
- {label,{text," Browse..."}},
- {font,Font} | ?BTNOPTS]),
-
- F13 = gse:frame(?TOP_FRAME, [{bw,3},
- {pack_xy,{{1,2},3}},
- {packer_x,[{stretch, 1},
- {fixed, 60},
- {stretch, 1},
- {fixed, 60},
- {stretch, 1}]},
- {packer_y,[{stretch,1},
- {fixed, 30},
- {stretch,1}]}]),
-
- gse:named_button(ok_button, F13, [{pack_xy,{2,2}},
- {label,{text,"OK"}},
- {font,Font}]),
- gse:named_button(cancel_button, F13, [{pack_xy,{4,2}},
- {label,{text,"Cancel"}},
- {font,Font}]).
-
-update_window_from_options(Options) ->
-
- %% Trace output
- gse:config(trace_send, [{select,Options#trace_options.send}]),
- gse:config(trace_receive,
- [{select,Options#trace_options.treceive}]),
- gse:config(trace_functions,
- [{select,Options#trace_options.functions}]),
- gse:config(trace_events, [{select,Options#trace_options.events}]),
-
- %% Trace inheritance
- case (Options#trace_options.inherit_on_all_spawn or
- Options#trace_options.inherit_on_1st_spawn) of
- true ->
- gse:select(trace_spawn),
- gse:config(trace_spawn_all,
- [{select,Options#trace_options.inherit_on_all_spawn}]),
- gse:config(trace_spawn_first,
- [{select,Options#trace_options.inherit_on_1st_spawn}]);
- false ->
- lists:foreach(fun(X) -> gse:disable(X) end,
- [trace_spawn_all,trace_spawn_first])
- end,
-
- case (Options#trace_options.inherit_on_all_link or
- Options#trace_options.inherit_on_1st_link) of
- true -> gse:select(trace_link),
- gse:config(trace_link_all,
- [{select,Options#trace_options.inherit_on_all_link}]),
- gse:config(trace_link_first,
- [{select, Options#trace_options.inherit_on_1st_link}]);
- false ->
- lists:foreach(fun(X) -> gse:disable(X) end,
- [trace_link_all,trace_link_first])
- end,
-
- %% Trace ouput destinations
- gse:config(trace_in_window,
- [{select,(not Options#trace_options.to_file)}]),
-
- gse:config(trace_to_file, [{select,Options#trace_options.to_file}]),
- gse:config(trace_file, [{text,Options#trace_options.file}]),
- case Options#trace_options.to_file of
- true ->
- ok;
- false ->
- lists:foreach(fun(X) -> gse:disable(X) end,
- [trace_file, trace_file_browse])
- end.
-
-get_options_from_window() ->
- #trace_options{send = gse:read(trace_send,select),
- treceive = gse:read(trace_receive,select),
- functions = gse:read(trace_functions,select),
- events = gse:read(trace_events,select),
- inherit_on_1st_spawn = gse:read(trace_spawn_first,select),
- inherit_on_all_spawn = gse:read(trace_spawn_all,select),
- inherit_on_1st_link = gse:read(trace_link_first,select),
- inherit_on_all_link = gse:read(trace_link_all,select),
- to_file = gse:read(trace_to_file,select),
- file = gse:read(trace_file,text)}.
-
-group_radio(Value, Default, GroupList) ->
- case Value of
- true ->
- gse:select(Default),
- lists:foreach(fun(X) -> gse:enable(X) end, GroupList);
- false ->
- lists:foreach(fun(X) -> gse:deselect(X) end, GroupList),
- lists:foreach(fun(X) -> gse:disable(X) end, GroupList)
- end.
-
-%%--read_from_file/(File)-----------------------------------------------
-%% Returns the options saved in File.
-%% If no options can be found, then the default options are
-%% returned.
-
-read_from_file(File) ->
- case file:consult(File) of
- {ok, [Term]} ->
- if
- is_record(Term, trace_options) ->
- {ok, Term};
- true ->
- {error, "unexpected contents", #trace_options{}}
- end;
- {ok, _Terms} ->
- {error, "unexpected contents", #trace_options{}};
- {error, Tuple} when is_tuple(Tuple) -> % {Line,Mod,Term}
- {error, "erroneous contents", #trace_options{}};
- {error, _Posix} ->
- %% The most probable reason is that the file does not
- %% exist, this is not an error so we simply return
- %% the default trace options instead
- {ok, #trace_options{}}
- end.
-
-%%--save_to_file(Options, File)-----------------------------------------
-
-save_to_file(Options, File) ->
- case file:open(File, [write]) of
- {ok, Fd} ->
- {{Year,Month,Day},{H,M,S}} = calendar:local_time(),
- io:format(Fd, "%%%~n", []),
- io:format(Fd, "%%% File: ~s~n", [File]),
- io:format(Fd, "%%% Date: ~w-~2..0w-~2..0w, ~2..0w:~2..0w:~2..0w~n",
- [Year,Month,Day,H,M,S]),
- io:format(Fd, "%%%~n", []),
- io:format(Fd, "%%% This file was created by Pman. ~n", []),
- io:format(Fd, "%%%~n", []),
- io:format(Fd, "%%% DO NOT EDIT! ~n", []),
- io:format(Fd, "%%%~n", []),
- io:format(Fd, "%%%~n", []),
- io:format(Fd, "~p.~n", [Options]),
- file:close(Fd),
- ok;
- {error, Posix} ->
- {error, file:format_error(Posix)}
- end.
diff --git a/lib/pman/src/pman_process.erl b/lib/pman/src/pman_process.erl
deleted file mode 100644
index 276407a0f1..0000000000
--- a/lib/pman/src/pman_process.erl
+++ /dev/null
@@ -1,317 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%% Purpose : A front-end to the erlang:process_info() functions, that
-%% can handle processes on different nodes in a transparent
-%% way.
-%% Also some convenience functions for process info, as well
-%% as some application specific functions for process
-%% classification.
-%%----------------------------------------------------------------------
-
--module(pman_process).
-
--export([pinfo/1, pinfo/2,
- r_processes/1,
- function_info/1,
- get_name/1, msg/1, reds/1, psize/1,
- is_running/1,
- is_pid_or_shell/1,
- get_pid/1,
- is_system_process/1,
- is_hidden_by_module/2
- ]).
-
-%% List of registered name that will make a prodcess a "SYSTEM"-process
--define(SYSTEM_REG_NAMES,
- [
- %% kernel
- application_controller,
- erl_reply,
- auth,
- boot_server,
- code_server,
- disk_log_server,
- disk_log_sup,
- erl_prim_loader,
- error_logger,
- file_server_2,
- fixtable_server,
- global_group,
- global_name_server,
- heart,
- inet_gethost_native,
- inet_gethost_native_sup,
- init,
- kernel_config,
- kernel_safe_sup,
- kernel_sup,
- net_kernel,
- net_sup,
- rex,
- user,
- os_server,
- ddll_server,
- erl_epmd,
- inet_db,
- pg2,
-
- %% stdlib
- timer_server,
- rsh_starter,
- take_over_monitor,
- pool_master,
- dets,
-
- %% sasl
- sasl_safe_sup, sasl_sup, alarm_handler, overload,
- release_handler,
-
- %% gs
- gs_frontend
- ]).
-
-%% List of module:function/arity calls that will make the caller a
-%% "SYSTEM"-process.
-%%
--define(SYSTEM_INIT_CALLS,
- [{application_master,init,4},
- {application_master,start_it,4},
- {inet_tcp_dist,accept_loop,2},
- {net_kernel,ticker,2},
- {supervisor_bridge,user_sup,1},
- {user_drv,server,2},
- {group,server,3},
- {kernel_config,init,1},
- {inet_tcp_dist,do_accept,6},
- {inet_tcp_dist,do_setup,6},
- {pman_main,init,2},
- {pman_buf_printer,init,2},
- {pman_buf_converter,init,2},
- {pman_buf_buffer,init,1},
- {gstk,init,1},
- {gstk_port_handler,init,2},
- {gstk,worker_init,1}
- ]).
-
-%% List of module:function/arity calls that will make the executing
-%% process a "SYSTEM"-process.
--define(SYSTEM_RUNNING_CALLS,
- [{file_io_server,server_loop,1},
- {global,loop_the_locker,1},
- {global,collect_deletions,2},
- {global,loop_the_registrar,0},
- {gs_frontend,request,2},
- {shell,get_command1,5},
- {shell,eval_loop,3},
- {io,wait_io_mon_reply,2},
- {pman_module_info,loop,1},
- {pman_options,dialog,3},
- {pman_options,loop,1},
- {pman_relay_server,loop,1},
- {pman_shell,monitor_loop,1},
- {pman_shell,safe_loop,2}
- ]).
-
-%% pinfo(Pid) -> [{Item, Info}] | undefined
-%% pinfo(Pid, Item) -> Info | undefined
-%% A version of process_info/1 that handles pid on remote nodes as well.
-pinfo({_, Pid}) -> % Handle internal process format
- pinfo(Pid);
-pinfo(Pid) when node(Pid)==node() ->
- process_info(Pid);
-pinfo(Pid) ->
- case rpc:call(node(Pid), erlang, process_info, [Pid]) of
- {badrpc, _} -> undefined;
- Res -> Res
- end.
-
-pinfo({_, Pid}, Item) -> % Handle internal process format
- pinfo(Pid, Item);
-pinfo(Pid, Item) when node(Pid)==node() ->
- case process_info(Pid, Item) of
- {Item, Info} -> Info;
- "" -> ""; % Item == registered_name
- undefined -> undefined
- end;
-pinfo(Pid, Item) ->
- case rpc:call(node(Pid), erlang, process_info, [Pid, Item]) of
- {badrpc, _} -> undefined;
- {Item, Info} -> Info;
- "" -> ""; % Item == registered_name
- undefined -> undefined
- end.
-
-%% function_info(Pid) -> {M, F, A}
-%% Returns the initial function for the specified process.
-function_info(Pid) ->
- case pinfo(Pid, current_function) of
- {Module, Function, Arity} ->
- {Module, Function, Arity};
- undefined ->
- {unknown, unknown, 0}
- end.
-
-%% r_processes(Node) -> Pids
-%% Return a list of all processes at Node.
-%%
-%% If there is a problem with getting information from a remote
-%% node, an empty list is returned.
-r_processes(Node) ->
- ordsets:from_list(r_processes1(Node)).
-
-r_processes1(Node) ->
- if
- Node==node() ->
- processes();
- true ->
- case rpc:block_call(Node, erlang, processes, []) of
- {badrpc, _} ->
- [];
- Pids -> Pids
- end
- end.
-
-%% is_running(Object) -> {true, {shell,Pid}} | {true, Pid} | false
-%% Object = {shell, Pid} | {link, Pid, ?} | Pid
-is_running({shell,Pid}) ->
- case is_running(Pid) of
- {true,Pid} ->
- {true,{shell,Pid}};
- false ->
- false
- end;
-is_running({link,Pid,_}) ->
- is_running(Pid);
-is_running(Pid) ->
- case is_pid_or_shell(Pid) of
- true ->
- case pinfo(Pid) of
- undefined -> false;
- _PInfo -> {true, Pid}
- end;
- false ->
- false
- end.
-
-%% is_pid_or_shell(Object) -> bool()
-%% Checks if the argument is an pid or a tuple {shell, Pid}.
-is_pid_or_shell({shell,Pid}) when is_pid(Pid) ->
- true;
-is_pid_or_shell(Pid) when is_pid(Pid) ->
- true;
-is_pid_or_shell(_) ->
- false.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% get_pid/1 - returns the Pid of the object provided that
-%% it is a proper process specifier.
-%%
-%% Arguments:
-%% Object A process specifier
-%%
-%% Returns:
-%% The Pid.
-
-get_pid({shell,Pid}) ->
- Pid;
-get_pid(Pid) when is_pid(Pid) ->
- Pid.
-
-%% is_system_process(Pid) -> bool()
-%% Returns true if Pid is a "system process".
-%% This is a prototype version, use file configuration later.
-is_system_process(Pid) ->
- catch is_system_process2(Pid).
-
-is_system_process2(Pid) ->
-
- %% Test if the registered name is a system registered name
- case pinfo(Pid, registered_name) of
- undefined -> ignore;
- "" -> ignore;
- Name ->
- case lists:member(Name, ?SYSTEM_REG_NAMES) of
- true -> throw(true);
- false -> ignore
- end
- end,
-
- %% Test if the start specification is a "system start function"
- MFAi = case pinfo(Pid, initial_call) of
- {proc_lib, init_p, 5} ->
- proc_lib:translate_initial_call(Pid); % {M,F,A} | Fun
- Res -> Res % {M,F,A} | undefined
- end,
- case lists:member(MFAi, ?SYSTEM_INIT_CALLS) of
- true -> throw(true);
- false -> ignore
- end,
-
- %% Test if the running specification is a "system running function"
- case pinfo(Pid, current_function) of
- undefined -> false;
- MFAc ->
- lists:member(MFAc, ?SYSTEM_RUNNING_CALLS)
- end.
-
-%% is_hidden_by_module(Pid, Modules) -> bool()
-%% Checks if Pid is to be hidden because it executes code from one
-%% of Modules
-is_hidden_by_module(Pid, Modules) ->
- case pinfo(Pid, current_function) of
- {Module, _Function, _Arity} ->
- lists:member(Module, Modules);
- undefined -> false
- end.
-
-%% get_name(Pid) -> Name | " "
-%% Returns the registered name of a process, if any, or " " otherwise.
-get_name(Pid) ->
- case pinfo(Pid, registered_name) of
- undefined -> " ";
- "" -> " ";
- Name -> Name
- end.
-
-%% msg(Pid) -> int()
-msg(Pid) ->
- case pinfo(Pid, messages) of
- undefined -> 0;
- Msgs -> length(Msgs)
- end.
-
-%% reds(Pid) -> int()
-reds(Pid) ->
- case pinfo(Pid, reductions) of
- undefined -> 0;
- Reds -> Reds
- end.
-
-%% psize(Pid) -> int()
-%% Returns the total process size (stack + heap).
-psize(Pid) ->
- Stack = pinfo(Pid, stack_size),
- Heap = pinfo(Pid, heap_size),
- case {Heap, Stack} of
- {undefined, undefined} -> 0;
- {undefined, Sz} -> Sz;
- {Sz, undefined} -> Sz;
- {Sz0, Sz1} -> Sz0 + Sz1
- end.
diff --git a/lib/pman/src/pman_relay.erl b/lib/pman/src/pman_relay.erl
deleted file mode 100644
index 289765492f..0000000000
--- a/lib/pman/src/pman_relay.erl
+++ /dev/null
@@ -1,127 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%----------------------------------------------------------------------
-%% Purpose : Interface function to relay calls (esp. trace calls)
-%% to processes on other nodes. Some of the calls
-%% are conditionally relayed.
-%%----------------------------------------------------------------------
-
--module(pman_relay).
-
-%%-compile(export_all).
--export([start/1,
- ok_to_trace/1,
- trac/3]).
-
-
--include("assert.hrl").
-
-%% --------------------------------------------------------------
-%% DISTRIBUTION
-%% --------------------------------------------------------------
-%% (???) Process dictionary alert!!!
-%%
-%% Since we are not allowed to do erlang:trace/3 on remote
-%% processe we create a help process at the remote node to
-%% do the job for us
-%% ---------------------------------------------------------------
-
-start(P) when is_pid(P), node(P)/=node() ->
-
- %% Remote supervision, relaying necessary
-
- put(relay, spawn_link(node(P), pman_relay_server, init, [self()]));
-
-
-start(_) ->
-
- %% Local supervision, no relaying
-
- ignore.
-
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% ok_to_trace/1 - Tests wheter we can actually start tracing
-%% a process.
-%%
-%% Arguments:
-%% Pid Pid of the process to trace (on local or remote node)
-%%
-%% Returns
-%% true If it is OK to trace the process
-%% false If the process is already traced, or some other
-%% condition prevents it from being traced.
-
-ok_to_trace(Pid) when node(Pid) == node()->
-
- %% Local trace, no relaying
-
- case catch erlang:trace(Pid, false, [send]) of
- 1 ->
- true;
- _Otherwise ->
- false
- end;
-ok_to_trace(Pid) ->
-
- %% Remote trace, relaying necessary
-
- PidRelay = get(relay),
- PidRelay ! {ok_to_trace, self(), Pid},
- receive
- {ok_to_trace, PidRelay} ->
- true;
- {not_ok_to_trace, PidRelay} ->
- false;
- _Otherwise ->
- ?ALWAYS_ASSERT("Unexpected message from relay process")
- after
- 5000 ->
- false
- end.
-
-
-
-
-
-
-%% ---------------------------------------------------------------
-%% Possibly send a request to do tracing to a remote node.
-%% ---------------------------------------------------------------
-
-trac(Pid, How, Flag) when node(Pid) == node() ->
-
- %% Local trace, no relaying necessary
-
-
- case catch erlang:trace(Pid, How, Flag) of
- 1 -> ok;
- _ -> pman_win:format("** Illegal trace request ** \n", [])
- end;
-
-trac(Pid, How, Flag) ->
-
-
-
- %% Remote trace, relaying necessary
-
- get(relay) ! {self(), erlang, trace, [Pid, How, Flag]}.
-
diff --git a/lib/pman/src/pman_relay_server.erl b/lib/pman/src/pman_relay_server.erl
deleted file mode 100644
index 2fcbb663bc..0000000000
--- a/lib/pman/src/pman_relay_server.erl
+++ /dev/null
@@ -1,57 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%%----------------------------------------------------------------------
-%%% Purpose : Relay server code.
-%%%----------------------------------------------------------------------
-
--module(pman_relay_server).
-
-%%-compile(export_all).
--export([init/1]).
-
-
-
-init(P) ->
- process_flag(trap_exit, true),
-
- loop(P).
-
-loop(P) ->
- receive
- {ok_to_trace, PidSender, PidToTrace} ->
- case catch erlang:trace(PidToTrace, false, [send]) of
- 1 ->
- PidSender ! {ok_to_trace, self()},
- loop(P);
- _Otherwise ->
- PidSender ! {not_ok_to_trace, self()}
- end;
-
- {P, M,F,A} ->
- case catch apply(M, F, A) of
- 1 -> ok;
- _Other -> P ! {print, "** Illegal trace request **\n", []}
- end,
- loop(P);
- {'EXIT', P, _Reason} ->
- exit(normal);
- Other -> %% Here is the normal case for trace i/o
- P ! Other,
- loop(P)
- end.
diff --git a/lib/pman/src/pman_shell.erl b/lib/pman/src/pman_shell.erl
deleted file mode 100644
index 2d2b8ce000..0000000000
--- a/lib/pman/src/pman_shell.erl
+++ /dev/null
@@ -1,827 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%%
-%% ---------------------------------------------------------------
-%% Purpose: Create a trace window with process
-%% information or a help window with information
-%% about pman.
-%%
-%% ---------------------------------------------------------------
-
--module(pman_shell).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,start,1}}]).
-
-%% ---------------------------------------------------------------
-%% The user interface exports
-%% ---------------------------------------------------------------
-
--export([start_list/3,
- start/2,
- start/1,
- find_shell/0]).
-
-%% ---------------------------------------------------------------
-%% Includes
-%% ---------------------------------------------------------------
--include("assert.hrl").
--include("pman_options.hrl").
--include("pman_buf.hrl").
-
-
-%% ---------------------------------------------------------------
-%% Internal record declarations
-%% ---------------------------------------------------------------
--record(pman_shell,{win,
- editor,
- pid,
- buffer,
- father,
- shell_flag, % boolean, true for shell
- trace_options, % Keeps trace options
- db}). % DB for trace windows
-
-
-%%
-%% Constants
-%%
-
--define (PMAN_DB, pman_db). % The pman db for trace windows
-
-
-
-%% ---------------------------------------------------------------
-%% start/1, start/2
-%%
-%% Starts a new trace shell process.
-%%
-%% start(Pid, DefaultOptions)
-%% Pid The Pid of the process to trace
-%% DefaultOptions The default trace options passed along from
-%% the calling process.
-%%
-%%
-%% start(Pid)
-%% Pid The Pid of the process to trace
-%%
-%% start(Pid) starts without using any default options except for those
-%% hardwired into the application. (See pman_options.hrl).
-%%
-%%
-%% Return: Both functions return a process id
-%% ---------------------------------------------------------------
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start_list/3 - Starts a trace window for each of the processes
-%% in the list
-
-start_list(LIPid, Father, Options) ->
- StartFun = fun(Pid) ->
- start({Pid,Father}, Options)
- end,
- lists:foreach(StartFun, LIPid).
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% start/1 - Starts a trace window for the specified Pid.
-%%
-
-start(Pid) ->
- start(Pid, #trace_options{}).
-
-%%
-%% start/2
-%%
-
-start(Pid,DefaultOptions) when is_pid(Pid) ->
- start({Pid,self()}, DefaultOptions);
-
-start(Var,DefaultOptions) ->
- Db = db_start(),
- spawn_link(fun() -> internal(Var, DefaultOptions, Db) end).
-
-%% ---------------------------------------------------------------
-%% Initialize the enviroment for tracing/viewing Object
-%%
-%% Object can either be {shell,Shell} or a Pid.
-%% The main loop is then called, which handles trace and event
-%% requests. The window dies whenever Supervisor dies, while
-%% message windows die whenever their parent dies.
-%% ---------------------------------------------------------------
-
-internal({Object,Supervisor}, DefaultOptions, Db) ->
-
- %% (???) This call will cause minor problems when the window has been
- %% invoked with proc/1 from for instance the shell. The shell
- %% does not handle the exit-signals, so it will exit
- %% when the window is exited.
-
-
- %% First check that no other process is tracing the process we want
- %% to trace. There is no well defined way of doing this, so the
- %% code below is used instead. (???)
-
- pman_relay:start(Object), %(???) Uses proc. dict.
-
- Pid = pman_process:get_pid(Object),
-
- case pman_relay:ok_to_trace(Pid) of
-
- %% Tracing cannot be performed on the specified process
-
- false ->
- T = lists:flatten(io_lib:format("ERROR: Process ~p is already being~ntraced by some other process.~nOr there may be a problem communicating with it.",[Pid])),
- tool_utils:notify(gs:start(),T),
- exit(quit);
-
- %% Tracing can be performed, go ahead!
-
- true ->
-
- case db_insert_key (Db, Pid) of
- true ->
-
- link(Supervisor),
- process_flag(trap_exit, true),
-
- case catch pman_win:window(Object) of
- {'EXIT', badrpc} ->
- T = "ERROR: Could not access node",
- pman_win:dialog_window(gs:start(),T);
- {'EXIT', dead} ->
- T = "ERROR: The process is dead",
- pman_win:dialog_window(gs:start(),T);
- {'EXIT',_W} ->
- T = "ERROR: Untracable process \n(unexpected EXIT reason)",
- pman_win:dialog_window(gs:start(),T);
- {Win, Ed} ->
- init_monitor_loop(Win,
- Ed,
- Object,
- Supervisor,
- DefaultOptions,
- Db)
- end;
-
- false ->
- T = lists:flatten(io_lib:format("ERROR: Process ~p is already being~ntraced by some other process.",[Pid])),
- tool_utils:notify(gs:start(),T),
- exit(quit);
-
- Error ->
- Error
- end
-
- end.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% init_monitor_loop/5
-
-init_monitor_loop(Win,Ed,Object,Supervisor, DefaultOptions, Db) ->
-
- process_flag(priority, max),
-
- %% Most default options come from the main window. Now we must set
- %% the default file name to something that is shows what process
- %% is being traced.
-
- %% Find out an appropriate file name to write the trace output
- %% to if the output should go to a file.
-
- FileName = case pman_process:is_pid_or_shell(Object) of
- true ->
- default_file_name(pman_process:get_pid(Object));
- false ->
- "NoName"
- end,
-
- Buff = pman_buf:start(Ed, FileName),
-
- case pman_process:is_running(Object) of
-
- %% We are tracing a shell process.
- {true,{shell,Pid}} ->
- safe_link(Pid),
- NewDefaultOptions =
- DefaultOptions#trace_options{file=FileName},
- perform_option_changes(Pid, NewDefaultOptions, Buff),
- monitor_loop(#pman_shell{win=Win, editor=Ed, pid=Pid, buffer=Buff,
- father = Supervisor,
- shell_flag = true,
- trace_options = NewDefaultOptions,
- db = Db});
-
- %% We are tracing an ordinary process.
- {true,Pid} ->
- safe_link(Pid),
- NewDefaultOptions =
- DefaultOptions#trace_options{file=FileName},
- perform_option_changes(Pid, NewDefaultOptions, Buff),
- monitor_loop(#pman_shell{win=Win, editor=Ed, pid=Pid, buffer=Buff,
- father = Supervisor,
- shell_flag = false,
- trace_options = NewDefaultOptions,
- db = Db});
-
- %% The process being traced is dead.
- false ->
- monitor_loop(#pman_shell{win=Win, editor=Ed, pid=nopid,
- buffer=Buff,
- father = Supervisor,
- shell_flag = false,
- trace_options= DefaultOptions,
- db = Db})
- end.
-
-%% ----------------------------------------------------------------
-%% What is the Pid of the shell on our node?
-%% ----------------------------------------------------------------
-
-find_shell() ->
- case shell:whereis_evaluator() of
- undefined -> % noshell
- noshell;
- Pid ->
- Pid
- end.
-
-%% ---------------------------------------------------------------
-%% Functions called in case of an exit message
-%% ---------------------------------------------------------------
-
-clean_up(Win, Buff,Pid) ->
-
- %% (???) Unlinks the traced process, but since we are using a safe link
- %% it is probably unnecessary.
-
- safe_unlink(Pid),
-
- %% Kill helper processes
-
- exit(Buff#buffer.converter, topquit),
- exit(Buff#buffer.buffer, topquit),
-
- gs:destroy(Win).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% exit_cmd/3 - Takes care of the necessary details when
-%% a linked process terminates.
-
-
-exit_cmd(Pid,_Reason, State) ->
- case State#pman_shell.shell_flag of
-
- %% This clause handles the case when a shell process dies.
- %% Since it is restarted and the intention is to continue tracing
- %% the restarted shell process, we need to handle it separately by
- %% finding the new shell process.
- true ->
-
- NewShell = find_shell(),
- safe_link(NewShell),
- pman_relay:start(NewShell),
-
- %% Update the window title with the new PID
- Title = pman_win:title({shell, NewShell}),
- Win = State#pman_shell.win,
- gse:config(Win,[{title,Title}]),
-
- pman_relay:trac(NewShell, true, flags()),
-
- B = State#pman_shell.buffer,
- B#buffer.converter!{raw,[{shell_died, Pid, NewShell}]},
-
-
-
- State#pman_shell{pid=NewShell};
-
- %% This clause handles the case when a traced process that is
- %% not a shell process dies.
- false ->
-
- B = State#pman_shell.buffer,
- B#buffer.converter!{raw,[{died, Pid}]},
-
- lists:foreach(fun(X) -> gse:disable(X) end,
- ['Options',
- 'Kill',
- 'LinksMenu']),
- State#pman_shell{pid=undefined}
- end.
-
-flags() ->
- [send, 'receive', call, procs,
- set_on_spawn, set_on_first_spawn, set_on_link, set_on_first_link].
-
-options_to_flaglists(Options) ->
- AssocList =
- [{Options#trace_options.send, send},
- {Options#trace_options.treceive, 'receive'},
- {Options#trace_options.inherit_on_1st_spawn, set_on_first_spawn},
- {Options#trace_options.inherit_on_all_spawn, set_on_spawn},
- {Options#trace_options.inherit_on_1st_link, set_on_first_link},
- {Options#trace_options.inherit_on_all_link, set_on_link},
- {Options#trace_options.events, procs},
- {Options#trace_options.functions,call}],
-
- TrueFun = fun ({Option,Flag}) ->
- case Option of
- true -> Flag;
- _Otherwise -> false
- end
- end,
- TrueFlags = mapfilter(TrueFun, AssocList),
-
- FalseFun = fun ({Option,Flag}) ->
- case Option of
- false -> Flag;
- _Otherwise -> false
- end
- end,
- FalseFlags = mapfilter(FalseFun, AssocList),
- {TrueFlags,FalseFlags}.
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% mapfilter/2 - Combines the functionality of lists:map and
-%% lists:filter. mapfilter applies the function argument to
-%% each element in the list. All returned values that are
-%% not false will occur in the resulting list.
-%%
-%% Arguments:
-%% Fun A fun that takes one argument
-%% List A list. Each element will become an argument to Fun.
-%%
-%% Returns:
-%% A list of all results from the map operation that are not false.
-%%
-
-mapfilter(Fun,[E|Es]) ->
- case apply(Fun,[E]) of
- false ->
- mapfilter(Fun,Es);
- Value -> [Value | mapfilter(Fun,Es)]
- end;
-mapfilter(_Fun, []) -> [].
-
-
-
-perform_option_changes(Pid,Options,Buffer) ->
-
- %% Notify the trace output functionality
- %% if the destination is supposed to go to a file...
-
- case Options#trace_options.to_file of
- true ->
- FName = Options#trace_options.file,
- Buffer#buffer.converter!{file,FName};
- false ->
- done
- end,
-
- %%...then set the trace flags of the traced process
-
- {OnFlags, OffFlags} = options_to_flaglists(Options),
- case catch begin
-
- %% (???) Note that the following calls cannot actually fail
- %% This may be a problem. And the catch appears unnecessary
- %% However, it may become necessary to let the
- %% pman_relay:trac/3 function retrun appropriate values.
- pman_relay:trac(Pid,true, OnFlags),
- pman_relay:trac(Pid,false, OffFlags)
- end of
- true ->
- ok;
- _ -> pman_win:format("** Illegal trace request ** \n", [])
- end.
-
-
-
-
-
-
-%% ---------------------------------------------------------------
-%% Take care of the command executed by the user.
-
-execute_cmd(Cmd,Shell_data) ->
- Window = Shell_data#pman_shell.win,
- Editor = Shell_data#pman_shell.editor,
- Shell = Shell_data#pman_shell.pid,
- Buffer = Shell_data#pman_shell.buffer,
- TraceOptions = Shell_data#pman_shell.trace_options,
-
- case Cmd of
- 'Close' ->
- db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
- clean_up(Window, Buffer, Shell),
- exit(quit);
- 'Destroy' ->
- db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
- exit(Buffer#buffer.buffer,topquit),
- safe_unlink(Shell),
- exit(Buffer#buffer.converter,topquit),
- exit(Buffer#buffer.buffer,topquit),
- exit(quit);
-
- 'Clear' when is_pid(Shell) ->
- New_buffer = pman_buf:clear(Buffer,pman_win:display(Shell),
- TraceOptions#trace_options.file),
- Shell_data#pman_shell{buffer = New_buffer};
- 'Save buffer' ->
- DefaultFile = "Pman_buffer." ++ default_file_name(Shell),
- Result = tool_utils:file_dialog([{type,save},
- {file,DefaultFile}]),
- case Result of
- {ok, UserFile, _State} ->
- Buffer#buffer.buffer!{save_buffer,UserFile};
- {error,_Reason} ->
- true
- end,
- Shell_data;
- 'Help' ->
- HelpFile = filename:join([code:lib_dir(pman), "doc", "html", "index.html"]),
- tool_utils:open_help(gs:start([{kernel, true}]), HelpFile),
- Shell_data;
- 'Kill' when is_pid(Shell) ->
- exit(Buffer#buffer.converter,killed),
- exit(Buffer#buffer.buffer,killed),
- lists:foreach(fun(X) -> gse:disable(X) end,
- ['TraceMenu',
- 'Clear']),
- catch exit(Shell, kill),
- Shell_data#pman_shell{pid = undefined};
- 'All Links' when is_pid(Shell) ->
- LIPid = pman_process:pinfo(Shell, links),
- ?ALWAYS_ASSERT("Just a brutal test"),
- start_list(LIPid,
- Shell_data#pman_shell.father,
- Shell_data#pman_shell.trace_options),
- Shell_data;
- 'Module' when is_pid(Shell) ->
- {ModuleName,_,_} = pman_process:function_info(Shell),
- pman_module_info:start(ModuleName),
- Shell_data;
- 'Options' when is_pid(Shell) ->
- case pman_options:dialog(Window,
- "Trace Options for Process",
- TraceOptions) of
- {error, _Reason} ->
- Shell_data;
- Options ->
- perform_option_changes(Shell, Options, Buffer),
- Shell_data#pman_shell{trace_options=Options}
- end;
-
- {trac,Choice,Bool} when is_pid(Shell) ->
- pman_relay:trac(Shell, Bool, [Choice]),
- Shell_data;
-
-
- {configure,{X,Y}} ->
- configure (Editor, X, Y),
- Shell_data;
-
- Pid when is_pid(Pid) ->
- pman_shell:start({Pid, Shell_data#pman_shell.father},
- Shell_data#pman_shell.trace_options),
- Shell_data;
- _Other ->
- ?ALWAYS_ASSERT("Received unexpected event"),
- Shell_data
- end.
-
-
-default_file_name(Shell) when is_pid(Shell) ->
- [A,B,C] = string:tokens(pid_to_list(Shell),[$.,$<,$>]),
- "pman_trace." ++ A ++ "_" ++ B ++ "_" ++ C;
-default_file_name(_OTHER) ->
- "shell".
-
-
-
-
-
-%% Key accellerators
-
-key(e) -> 'Clear';
-key(s) -> 'Save buffer';
-key(c) -> 'Close';
-key(a) -> 'All';
-key(r) -> 'Reset';
-key(m) -> 'Module';
-key(l) -> 'All Links';
-key(k) -> 'Kill';
-key(h) -> 'Help';
-key(z) -> 'Close';
-key(O) -> O.
-
-
-
-%% ---------------------------------------------------------------
-%% The main loop takes care of data coming in from the traces, as
-%% well as exit signals from proceses we are monitoring. Events
-%% caused by the user or window manager are also handled here.
-%% ---------------------------------------------------------------
-
-
-monitor_loop(Shell_data) ->
- receive
-
- %% WM destroy
- {gs,_Window,destroy,[],[]} -> %%Avoid links menus
- execute_cmd('Destroy', Shell_data);
-
-
- %% Handle EXIT signal from parent process
- {'EXIT', _Pid, topquit} ->
- clean_up(Shell_data#pman_shell.win,
- Shell_data#pman_shell.buffer,
- Shell_data#pman_shell.pid),
- exit(topquit);
-
- %% (???) Ignore "stray" EXIT signal from converter
- {'EXIT', _Pid, win_killed} ->
- monitor_loop(Shell_data);
-
-
- %% Handle EXIT signal from safely linked Pid
- %% This is received when a traced process dies.
- {'SAFE_EXIT', Pid, Reason} ->
- New_Shell_data = exit_cmd(Pid, Reason,Shell_data ),
- monitor_loop(New_Shell_data);
-
-
- %% Handle EXIT signal from processes where we expect
- %% some EXIT signals, such as the file_dialog opened, and possibly
- %% others.
-
- {'EXIT', _Pid, _Reason} ->
- monitor_loop(Shell_data);
-
- %% Handle incoming trace messages
- Message when is_tuple(Message) , element(1,Message) == trace->
- {L, Suspended} = collect_tracs([Message]),
- Buffer = Shell_data#pman_shell.buffer,
- Buffer#buffer.converter!{raw,L},
- lists:foreach(fun(P) -> erlang:resume_process(P) end, Suspended),
- monitor_loop(Shell_data);
-
-
- %% All other messages on the form {...,...,...}
- Message when is_tuple(Message) ->
- do_link_stuff(Shell_data),
-
- New_Shell_data = process_gs_event(Message,Shell_data),
- monitor_loop(New_Shell_data);
-
- %% Catch all for unexpected messages
- _Anything ->
- ?ALWAYS_ASSERT("Received unexpected event"),
- monitor_loop(Shell_data)
-
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% process_event/1 - Error handling wrapper for gs_cmd
-
-process_gs_event(Message, Shell_data) ->
- case catch gs_cmd(Message,Shell_data) of
-
- %%
- %% Error exits from gs_cmd
-
- {'EXIT', badrpc} ->
- Text = "\nERROR: Could not access node",
- pman_win:msg_win(Text),
- Shell_data;
- {'EXIT', dead} ->
- Text = "\nERROR: The process is dead",
- pman_win:msg_win(Text),
- Shell_data;
-
- %% A controlled application initiated termination
- {'EXIT', quit} ->
- db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
- exit(quit);
-
-
- {'EXIT',Reason} ->
- db_delete_key (Shell_data#pman_shell.db, Shell_data#pman_shell.pid),
- io:format("Debug info, Reason: ~p~n",[Reason]),
- ?ALWAYS_ASSERT("Unexpected EXIT reason"),
- exit({unexpected_EXIT_reason,Reason});
-
- %%
- %% "Proper" exits from gs_cmd
-
- New_Shell_data ->
- New_Shell_data
- end.
-
-
-
-gs_cmd(Cmd, Shell_data) ->
- case Cmd of
-
- %%User Command
- {gs, Command, click, _Data, _Args} ->
- execute_cmd(Command,Shell_data);
-
- %%Key accellerator
- {gs,_Window,keypress,_D,[Key,_,0,1]} ->
- execute_cmd(key(Key),Shell_data);
-
- %%Window Resize
- {gs,_Window,configure,_,[X,Y|_]} ->
- execute_cmd({configure,{X,Y}},Shell_data);
-
-
- {gs, _Object, _Event, _Data, _Args} ->
- ?ALWAYS_ASSERT("Unhandled gs event"),
- Shell_data
-
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% (???) do_link_stuff/1 - I have no clue.
-%%
-
-do_link_stuff(Shell_data) ->
-
- %% This appears to be code to execute for adding
- %% dynamic links menus.
-
- case Shell_data#pman_shell.pid of
- undefined ->
- ok;
- Pid ->
- case pman_process:pinfo(Pid, links) of
- Links when is_list(Links) ->
- pman_win:links_menus(Links);
- undefined ->
- ok
- end
- end.
-
-
-%% (???) Process dictionary used to safe Pid-Pid pairs.
-%%
-%% safe_link/1 - Spawns a process, that links to the Pid, and sends
-%% a message to the caller when the linked process dies.
-%%
-%% Since we (think we) need to link to the traced process, we want
-%% to do it in a way that has the smallest possible risk. The process
-%% that links to the Pid is small and simple, which is safer than if
-%% the calling process would link directly to the Pid.
-
-safe_link(Pid) when is_pid(Pid) ->
- Self = self(),
- PidSafe = spawn_link(fun() -> safe_init(Self, Pid) end),
- put(Pid, PidSafe).
-
-
-%% safe_unlink/1 - Removes a safe link
-%%
-
-safe_unlink(Pid) when is_pid(Pid) ->
- PidSafe = get(Pid),
- PidSafe ! {unlink, self(), Pid},
- erase(Pid);
-
-safe_unlink(_Anything)->
- true.
-
-%% safe_init/2 - Initialize a simple receive loop that controls safe linking
-%% to application processes.
-%%
-safe_init(Caller, Pid) ->
-
- process_flag(trap_exit, true),
- link(Pid),
-
- safe_loop(Caller, Pid).
-
-
-%% safe_loop/2 - Simply waits for an exit signal from the linked Pid,
-%% all other messages are disregarded.
-%%
-
-
-safe_loop(Caller, Pid) ->
- receive
- %% Linked process dies
- {'EXIT' , Pid, Reason} ->
- Caller ! {'SAFE_EXIT', Pid, Reason};
-
- %% Caller dies
- {'EXIT', Caller, _Reason} ->
- unlink(Pid);
-
-
- %% Unlink request
- {unlink, Caller, Pid} ->
- unlink(Pid);
-
- %% Ignore everything else
- _Anything ->
- safe_loop(Caller, Pid)
- end.
-
-
-
-configure (Editor, W, H) ->
- gs:config (Editor, [{width, W - 3},
- {height, H - 40}]).
-
-
-
-
-%%% The DB is used to avoid multiple trace windows
-%%% of the same process.
-
-%%% db_start /0
-%%%
-
-db_start() ->
- case ets:info(?PMAN_DB) of
- undefined -> ets:new(?PMAN_DB, [public, named_table]);
- _ -> ?PMAN_DB
- end.
-
-
-
-%%% db_insert_key /2
-%%%
-
-db_insert_key (Db, Pid) ->
- case ets:lookup (Db, Pid) of
- [] ->
- case catch ets:insert (Db, {Pid}) of
- true ->
- true;
-
- _Error ->
- error_insert_db
- end;
-
- _already_exists ->
- false
- end.
-
-
-
-%%% db_delete_key /2
-%%%
-
-db_delete_key (Db, Pid) ->
- ets:delete (Db, Pid).
-
-
-%% Function to collect all trace messages in the receive queue.
-%% Returns: {Messages,SuspendedProcesses}
-
-collect_tracs(Ack) -> collect_tracs(Ack, ordsets:new()).
-
-collect_tracs(Ack, Procs) ->
- receive
- Trac when is_tuple(Trac), element(1, Trac) == trace ->
- P = suspend(Trac, Procs),
- collect_tracs([Trac | Ack], P)
- after 0 ->
- {lists:reverse(Ack), ordsets:to_list(Procs)}
- end.
-
-suspend({trace,From,call,_Func}, Suspended) when node(From) == node() ->
- case ordsets:is_element(From, Suspended) of
- true -> Suspended;
- false ->
- case (catch erlang:suspend_process(From)) of
- true ->
- ordsets:add_element(From, Suspended);
- _ ->
- Suspended
- end
- end;
-suspend(_Other, Suspended) -> Suspended.
diff --git a/lib/pman/src/pman_tool.erl b/lib/pman/src/pman_tool.erl
deleted file mode 100644
index 36382745af..0000000000
--- a/lib/pman/src/pman_tool.erl
+++ /dev/null
@@ -1,146 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(pman_tool).
--compile([{nowarn_deprecated_function,{gs,read,2}}]).
-
-%% Listbox selection window
-
--export([select/3]).
-
--record(state, {topwin,
- frame,
- listbox}).
-
-%% Constants
--define(WIN_WIDTH, 350).
--define(WIN_HEIGHT, 350).
-
-select(Win, Title, Choices) ->
- Self = self(),
- Pid = spawn_link(fun() -> init(Self, Win, Title, Choices) end),
- receive
- {Pid, Result} ->
- Result
- end.
-
-init(Pid, Win, Title, Choices) ->
-
- %% Create window
- State = create_window(Win, Title, Choices),
-
- gse:map(State#state.topwin),
-
- %% enter event loop
- loop(Pid, Choices, State).
-
-loop(Pid, Choices, State) ->
- receive
- {gs, _, destroy, _Data, _Args} ->
- Pid ! {self(), cancelled};
- {gs, _, configure, _Data, [W, H|_]} ->
- gse:resize(State#state.frame, W, H),
- loop(Pid, Choices, State);
- {gs, _, click, ok, _Args} ->
- case gs:read(State#state.listbox, selection) of
- [] ->
- Pid ! {self(), cancelled};
- Indices ->
- Selection = selection(Indices, Choices),
- Pid ! {self(), Selection}
- end;
- {gs, _, click, cancel, _Args} ->
- Pid ! {self(), cancelled};
- {gs, Obj, doubleclick, _Data, _Args} ->
- self() ! {gs, Obj, click, ok, []},
- loop(Pid, Choices, State);
- _GSEvent ->
- loop(Pid, Choices, State)
- end.
-
-selection(Indices, Choices) ->
- selection(0, Indices, Choices).
-
-selection(I, [I|Is], [{Val,_Str}|Vals]) ->
- [Val | selection(I+1, Is, Vals)];
-selection(I, [I|Is], [Val|Vals]) ->
- [Val | selection(I+1, Is, Vals)];
-selection(_I, [], _Vals) ->
- [];
-selection(I, Is, [_Val|Vals]) ->
- selection(I+1, Is, Vals).
-
-create_window(Win, Title, Choices) ->
- Font = pman_win:font(Win),
-
- %% Top window and a frame that covers it entirely, to allow
- %% usage of the packer for geometry management.
- Topwin = gse:window(Win, [{width, ?WIN_WIDTH},
- {height,?WIN_HEIGHT},
- {configure, true},
- {title, Title}]),
- Frame = gse:frame(Topwin, [{packer_x,[{stretch,1},
- {stretch,1}]},
- {packer_y,[{stretch,1},
- {stretch,5},
- {stretch,1}]}]),
-
- %% Caption above the list of items
- CaptionTxt = "Select one or more of the following:",
- gse:label(Frame, [{pack_x,{1,2}},
- {pack_y,{1,1}},
- {label,{text,CaptionTxt}}, {font,Font}]),
-
- %% List of selectable items
- Listbox = gse:listbox(Frame, [{pack_x,{1,2}},
- {pack_y,{2,2}},
- {selectmode,multiple},
- {doubleclick, true},
- {font,Font},
- {items, str_choices(Choices)}]),
-
- %% OK and Cancel buttons in a separate frame.
- F13 = gse:frame(Frame, [{bw,1},
- {pack_xy,{{1,2},3}},
- {packer_x,[{stretch,1},
- {fixed, 60},
- {stretch,1},
- {fixed, 60},
- {stretch,1}]},
- {packer_y,[{stretch,1},
- {fixed, 30},
- {stretch,1}]}]),
-
- gse:button(F13, [{pack_xy,{2,2}},
- {label,{text,"OK"}}, {font,Font},
- {data,ok}]),
- gse:button(F13, [{pack_xy,{4,2}},
- {label,{text,"Cancel"}}, {font,Font},
- {data,cancel}]),
-
- gse:resize(Frame, ?WIN_WIDTH, ?WIN_HEIGHT),
- #state{topwin=Topwin, frame=Frame, listbox=Listbox}.
-
-str_choices(Choices) ->
- lists:map(
- fun({Val, Str}) ->
- lists:flatten(io_lib:format("~p: ~s", [Val, Str]));
- (Term) ->
- lists:flatten(io_lib:format("~p", [Term]))
- end,
- Choices).
diff --git a/lib/pman/src/pman_win.erl b/lib/pman/src/pman_win.erl
deleted file mode 100644
index aec7dc4412..0000000000
--- a/lib/pman/src/pman_win.erl
+++ /dev/null
@@ -1,677 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2013. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-%% ------------------------------------------------------------
-%% Purpose: window management and the gs interface
-%% ------------------------------------------------------------
-
--module(pman_win).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,create,4}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,1}},
- {nowarn_deprecated_function,{gs,text,2}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-%% ---------------------------------------------------------------
-%% The user interface exports
-%% ---------------------------------------------------------------
-
--export([pman_window/3, window/1, module_data/1, display/1, format/2,
- dialog_window/2, configeditor/2, configwin/3,
- update/1, update/3,
- msg_win/1, title/1,
- remove_menu/1, add_menu/3,
- change_colour/3, links_menus/1, calc_columnwidths/1]).
--export([font/0, font/1]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% Constants
-%%
--include("pman_win.hrl").
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% pman_window/3 - Create a GS window and components for the
-%% Pman overview window, the main window.
-%%
-%% Arguments:
-%% Size number of processes
-%% HiddenModules list of modules
-%% Nodes list of supervised nodes
-%%
-%% Return:
-%% {Win, Grid, Frame, Procnum, W, H} where
-%% Win The GS top window
-%% Grid The GS grid
-%% Procnum Number of displayed processes
-%%
-
-pman_window(Size, _HiddenModules, Nodes) ->
- GS = gs:start([{kernel,true}]),
- Font = font(GS),
- Win_Options = [{title, lists:concat(["Pman: Overview on ",node()])},
- {width, ?WIN_WIDTH}, {height, ?WIN_HEIGHT},
- {destroy, true},
- {keypress,true}],
- Win = gs:create(window, GS, Win_Options),
-
- %% Menu bar
- MenuBar = gs:create(menubar, Win, []),
- MBFile = gs:create(menubutton, MenuBar, [{label,{text," File "}},
- {font,Font},
- {underline,1}]),
- MBView = gs:create(menubutton, MenuBar, [{label,{text, " View "}},
- {font,Font},
- {underline,1}]),
- MBTrace = gs:create(menubutton, MenuBar, [{label,{text, " Trace "}},
- {font,Font},
- {underline,1}]),
- MBHelp = gs:create(menubutton, MenuBar, [{label, {text, " Help "}},
- {font,Font},
- {side,right},
- {underline,1}]),
-
- %% Addition of a menu for distribution
- add_node_menu(MenuBar, Nodes, Font),
-
- %% All menu buttons
- MenuFile = gs:create(menu, MBFile, []),
- MenuView = gs:create(menu, MBView, []),
- MenuTrace = gs:create(menu, MBTrace, []),
- MenuHelp = gs:create(menu, MBHelp, []),
-
- %% File menu
- gse:named_menuitem('Default Options', MenuFile,
- [{label,{text,"Options..."}}, {font,Font},
- {underline,0}]),
- gse:named_menuitem('Save Options',MenuFile,
- [{label,{text,"Save Options"}}, {font,Font}]),
- gse:named_menuitem('Exit', MenuFile,
- [{label,{text,"Exit"}}, {font,Font},
- {underline,0}]),
-
- %% View menu
- gse:named_menuitem('Hide All',MenuView,
- [{label, {text, "Hide All Processes"}},
- {font,Font},
- {underline,1}]),
-
- gse:named_menuitem('Hide Modules', MenuView,
- [{label, {text, "Hide Modules..."}},
- {font,Font},
- {underline,8}]),
-
- gse:named_menuitem('Hide Selected Process', MenuView,
- [{label, {text, "Hide Selected Process"}},
- {font,Font},
- {underline,2}]),
-
- gse:named_menuitem('Module',MenuView,
- [{label, {text, "Module Info..."}}, {font,Font},
- {underline,7}]),
-
- gse:named_menuitem('Refresh', MenuView,
- [{label, {text, "Refresh"}}, {font,Font},
- {underline,0}]),
-
- gse:named_menuitem('Show All',MenuView,
- [{label, {text, "Show All Processes"}},
- {font,Font}]),
-
- gse:named_menuitem('Show Selected',MenuView,
- [{label, {text, "Show Processes..."}},
- {font,Font}]),
-
- %% Trace menu
- gs:create(menuitem, 'Kill', MenuTrace, [{label,{text, "Kill"}},
- {font,Font},
- {underline,0}]),
-
- gs:create(menuitem, 'Trace Process', MenuTrace,
- [{label, {text, "Trace Selected Process"}}, {font,Font},
- {underline,0}]),
-
- gs:create(menuitem,'Trace Shell', MenuTrace,
- [{label, {text,"Shell Process"}}, {font,Font},
- {underline,0}]),
-
- %% Help menu
- gs:create(menuitem,'Help', MenuHelp, [{label, {text, "Help" }},
- {font,Font},
- {underline,0}]),
-
- %% Window contents
-
- %% Geometry managing frame
- Frame = gse:frame(Win, [{y,?MENU_HEIGHT},
- {packer_x,[{stretch, 1}]},
- {packer_y,[{stretch,10},
- {fixed,?CHECKBAR_HEIGHT}]}]),
-
-
-
- %% Grid
- Grid_Options = [
- {pack_x,1}, {pack_y,1},
- {fg,black},
- {vscroll,right},{hscroll,bottom},
- calc_columnwidths(739),
- {rows, {1,Size}}],
- Grid = gse:grid(Frame,Grid_Options),
-
-
- %% Checkbutton bar at the bottom of the window
-
- CheckBar = gse:frame(Frame, [{pack_x,1},
- {pack_y,2},
- {packer_x,[{stretch, 2, 100,300},
- {stretch, 2, 100,300},
- {stretch,1},
- {stretch, 2,100,300}]},
- {packer_y,[{stretch,1}]}]),
- gse:named_checkbutton('Hide System',CheckBar,
- [{pack_xy,{1,1}},
- {justify, left},
- {align,w},
- {width, 200},
- {font, Font},
- {label, {text, "Hide System Processes" }}]),
-
- gse:named_checkbutton('Auto Hide New',CheckBar,
- [{pack_xy,{2,1}},
- {width, 200},
- {justify, left},
- {align,w},
- {font, Font},
- {label, {text, "Auto-Hide New" }}]),
-
- gse:named_label('Number Hidden',CheckBar,
- [{pack_xy,{4,1}},
- {justify, left},
- {align,w},
- {width, 200},
- {font, Font},
- {label, {text, ?CPIDHIDDENTEXT }}]),
-
- %% Finalize it!
- gse:map(Win),
- gse:config(Win,[raise]),
- gse:config(Win,[{configure,true}]),
-
-
- {Win, Grid, Frame, length(processes())+1, ?WIN_WIDTH, ?WIN_HEIGHT}.
-
-
-%% Calculate columnwidths in respect to the size of the window.
-
-calc_columnwidths(Width) ->
- if
- Width =< 739 ->
- {columnwidths,[75,215,146,90,105,105]};
- true ->
- S = (Width - 75)/(215+146+90+105+105),
- {columnwidths,[75,round(215*S),round(146*S),round(90*S),
- round(105*S),round(105*S)]}
- end.
-
-%% ---------------------------------------------------------------
-%% Create a trace window
-%%
-%% Process, a process id or an atom
-%%
-%% Return: A window and a editor
-%% ---------------------------------------------------------------
-
-
-window(Process) ->
- GS = gs:start([{kernel,true}]),
- Font = font(GS),
- Win_Options = [{title,title(Process)}, {width,550}, {keypress,true},
- {configure,true},
- {destroy,true},{height, 400}],
- Win = gs:create(window,GS,Win_Options),
-
- MenuBar = gs:create(menubar, Win, []),
-
- %% File menu
- MBFile = gs:create(menubutton,MenuBar,[{label,{text," File "}},
- {font,Font},
- {underline, 1}]),
- MenuFile = gs:create(menu, MBFile, []),
- make_menus(pman_process:is_running(Process), MenuBar, MenuFile,
- Font),
-
- gse:named_menuitem('Save buffer',MenuFile,
- [{label,{text, "Save buffer..."}},
- {font,Font},
- {underline,0}]),
- gse:named_menuitem('Close',MenuFile,
- [{label, {text, "Close"}},
- {font,Font},
- {underline,0}]),
-
-
- Editor = gs:create(editor,Win,[{x,3}, {y,40},
- {width,546}, {height,348},
- {font,Font}]),
- gs:config(Editor, [{keypress, true},{insert, {'end', display(Process)}}]),
- gs:config(Editor, [{enable, false},{vscroll, right}, {hscroll, bottom},
- {wrap,none}]),
- gs:config(Win, [{map, true}]),
- {Win, Editor}.
-
-%% ---------------------------------------------------------------------
-%% Menu Help Fuctions
-%% ---------------------------------------------------------------------
-
-
-links_menus(Links) ->
- gs:destroy('Links'),
- gs:create(menu,'Links','LinksMenu',[]),
- Flag = case links_menus(Links,[]) of
- [] -> false;
- Pids ->
- add_menu('Links', Pids, "Trace"),
- true
- end,
- gse:config('LinksMenu',[{enable,Flag}]).
-
-links_menus([],Pids) -> Pids;
-links_menus([Pid|Links],Pids) when is_pid(Pid) ->
- links_menus(Links,[Pid|Pids]);
-links_menus([_Port|Links],Pids) ->
- links_menus(Links,Pids).
-
-
-%% Create the node menu.
-
-add_node_menu(MenuBar, Nodes, Font) ->
- MBNode = gs:create(menubutton, MenuBar, [{label,{text, " Nodes "}},
- {font,Font},
- {underline, 1}]),
- gs:create(menu, node, MBNode, []),
- add_menu(node, Nodes, "Show", Font),
- gse:disable(node()).
-
-
-%% ---------------------------------------------------------------------
-%% Add Menus in the list under Menu menuitem.
-
-add_menu(Menu, Names, Tag) ->
- add_menu(Menu, Names, Tag, font()).
-
-add_menu(_Menu, [], _Tag, _Font) -> ok;
-add_menu(Menu, [Name|Names], Tag, Font) ->
- Title = io_lib:format("~s ~p",[Tag, Name]),
- gs:create(menuitem,Name,Menu,[{label,{text,Title}},
- {font,Font},
- {data,{Menu,Name}}]),
- add_menu(Menu, Names, Tag, Font).
-
-%% ---------------------------------------------------------------------
-%% Remove a specific menu item, or a whole menu, or a list of both.
-%%
-
-remove_menu(List) when is_list(List)->
- lists:foreach(fun(X) -> gs:destroy(X) end, List);
-
-remove_menu(Object) ->
- gse:destroy(Object).
-
-
-%% ---------------------------------------------------------------------
-%% If the trace window opened is supposed to trace a real pid, let us
-%% add the trace menu, and other items specific to tracing. If not,
-%% the only menus available are the ones in the default defined in
-%% window(Pid).
-
-make_menus(false, _, _, _) -> ok;
-make_menus({true,Pid}, MenuBar, MenuFile, Font) ->
- MBView = gs:create(menubutton,'ViewMenu',MenuBar,
- [{underline,1},
- {label,{text," View "}}, {font,Font},
- {side,left}]),
- MenuView = gs:create(menu, MBView, []),
-
- MBTrace = gs:create(menubutton,'TraceMenu',MenuBar,
- [{underline,1},
- {label,{text," Trace "}}, {font,Font},
- {side,left}]),
- MenuTrace = gs:create(menu, MBTrace, []),
-
-
- MBHelp = gs:create(menubutton,'HelpMenu',MenuBar,
- [{underline,1},
- {label,{text," Help "}}, {font,Font},
- {side,right}]),
- MenuHelp = gs:create(menu, MBHelp, []),
-
- %% File menu
- gse:named_menuitem('Options', MenuFile,
- [{label, {text, "Options..."}}, {font,Font},
- {underline,0}]),
-
- %% Trace menu
- gse:named_menuitem('All Links', MenuTrace,
- [{label, {text, "All Linked Processes"}},
- {font,Font},
- {underline,0}]),
- gse:named_menuitem('LinksMenu', MenuTrace,
- [{underline,0},
- {label, {text, "Linked Process..."}},
- {font,Font},
- {itemtype, cascade},
- {enable,false}]),
- gs:create(menu,'Links','LinksMenu',[]),
- case pman_process:pinfo(Pid, links) of
- Links when is_list(Links) ->
- links_menus(Links);
- undefined ->
- lists:foreach(fun(X) -> gse:disable(X) end,['LinksMenu'])
- end,
- gse:named_menuitem('Kill', MenuTrace,
- [{label, {text, "Kill"}}, {font,Font},
- {underline,0}]),
-
- %% View menu
- gse:named_menuitem('Clear', MenuView,
- [{label, {text, "Clear buffer"}}, {font,Font},
- {underline,0}]),
-
- gse:named_menuitem('Module', MenuView,
- [{label, {text, "Module Info"}}, {font,Font},
- {underline,0}]),
-
- %% Help menu
- gse:named_menuitem('Help', MenuHelp,
- [{label, {text, "Help"}}, {font,Font},
- {underline,0}]).
-
-%% ---------------------------------------------------------------------
-%% Configurate the actual editor
-%%
-%% Editor, actual editor
-%% Options, actual options for the editor
-%%
-%% Return: A configurated editor with the actual options
-%% ---------------------------------------------------------------------
-
-configeditor(Editor, Options) ->
- gs:config(Editor, Options).
-
-%% ---------------------------------------------------------------------
-%% Configure the actual window after it has been resized.
-%% ---------------------------------------------------------------------
-
-configwin(Object, W, H) ->
- Dx = abs(W - gs:read(Object,width) - 4),
- Dy = abs(H - gs:read(Object,height) - 42),
- if
- Dx + Dy =/= 0 ->
- gs:config(Object,[{width,W - 4}]);
- true -> ok
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% update/1, 3
-update(NoOfHidden) ->
- Str = lists:flatten(io_lib:format(?CPIDHIDDENTEXT++"~w",
- [NoOfHidden])),
- gse:config('Number Hidden', [{label, {text,Str}}]).
-
-update(Grid, ShowInfoR, NoOfHidden) ->
-
- %% We reverse the list because we want the processes to appear with
- %% the newest (=highest) pid first in the list.
- ShowInfo = lists:reverse(ShowInfoR),
-
- %% Set the length of the grid
- CGridline = length(ShowInfo) + 1,
- gs:config(Grid, [{rows, {1,CGridline}}]),
-
- %% Add the header line
- add_gridline(Grid,
- 1,
- {'Pid','Current Function','Name','Msgs','Reds','Size'},
- []),
-
- update(NoOfHidden),
-
- %% Recurse through the ordset of pids
- update_r(Grid, ShowInfo, 2).
-
-update_r(Grid, [], Row) ->
- delete_gridlines(Grid, Row);
-update_r(Grid, [{Pid,Func,Name,Msgs,Reds,Psize}|ShowInfo], Row) ->
- {M, F, A} = Func,
- FuncText = lists:flatten(io_lib:format("~w:~w/~w", [M, F, A])),
- add_gridline(Grid,
- Row,
- {Pid, FuncText, Name, Msgs, Reds, Psize},
- [{data,{pidfunc,Pid,Func}}]),
- update_r(Grid, ShowInfo, Row+1).
-
-add_gridline(Grid, Row, Tuple, LIOptSpec) ->
- {Pid, FuncText, Name, Msgs, Reds, Psize} = Tuple,
- LIOpt = [{click,true},
- {doubleclick,true},
- {fg, colour(Row)},
- {text,{1,Pid}},
- {text,{2,FuncText}},
- {text,{3,Name}},
- {text,{4,Msgs}},
- {text,{5,Reds}},
- {text,{6,Psize}} |LIOptSpec],
- case gs:read(Grid, {obj_at_row, Row}) of
- undefined ->
- gse:gridline(Grid,[{row, Row}|LIOpt]);
- GridLine ->
- gs:config(GridLine,LIOpt)
- end.
-
-delete_gridlines(Grid, Row) ->
- case gs:read(Grid, {obj_at_row, Row}) of
- undefined ->
- ok;
- GridLine ->
- gs:destroy(GridLine),
- delete_gridlines(Grid, Row+1)
- end.
-
-colour(1) ->
- ?HEADER_COLOUR;
-colour(_Row) ->
- ?UNSELECTED_COLOUR.
-
-%% Interchange colours between two rows
-change_colour(Grid, Row, Row) ->
- Gitem = gs:read(Grid, {obj_at_row,Row}),
- gs:config(Gitem, {fg,?SELECTED_COLOUR});
-change_colour(Grid, From, To) ->
- Gitem_to = gs:read(Grid, {obj_at_row,To}),
- Gitem_fr = gs:read(Grid, {obj_at_row,From}),
- gs:config(Gitem_to, {fg,?SELECTED_COLOUR}),
- gs:config(Gitem_fr, {fg,colour(From)}).
-
-%% --------------------------------------------------------------
-%% Create a title for the window
-%% Return: the title
-%% --------------------------------------------------------------
-
-title({module, Mod}) ->
- lists:flatten([io_lib:format("Pman: Module info ~p", [Mod])]);
-
-title({shell, Sh} ) ->
- lists:flatten([io_lib:format("Pman: Shell process ~p on ~p",
- [Sh,node(Sh)])]);
-
-title(Sh) ->
- lists:flatten([io_lib:format("Pman: Process ~p on ~p",
- [Sh, node(Sh)]),name(Sh)]).
-name(Pid) ->
- case pman_process:pinfo(Pid, registered_name) of
- undefined -> "";
- Name ->
- lists:flatten([io_lib:format("[~p]", [Name])])
- end.
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% module_data/1 - %% Returns the module information for a
-%% module, on a format suitable to insert into a GS editor.
-%%
-%% Arguments:
-%% ModuleName The module
-%%
-%% Returns:
-%% A string with module information.
-%%
-
-module_data(ModuleName) ->
- vformat("", catch apply(ModuleName, module_info, [])).
-
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%% display/1 -
-%%
-
-display({_,Pid,_}) -> display(Pid);
-display({_,Pid}) -> display(Pid);
-display(Pid) when is_pid(Pid) ->
- case pman_process:pinfo(Pid) of
- undefined ->
- format('Process is dead~n',[]);
- Other ->
- proc_format(Other)
- end.
-
-%% --------------------------------------------------------------
-%% Format functions for the shell and help window.
-%% --------------------------------------------------------------
-
-vformat(Pad, {M,F,A}) when is_atom(F) ->
- Pad2 = lists:append(Pad,mkpad(io_lib:format("~w:~w",[M,F]))),
- lists:flatten([format("~p:~p", [M,F]),argformat(Pad2, A)]);
-
-vformat(Pad, [H|T]) ->
- kvformat(Pad, [H|T],"[");
-
-vformat(_Pad, X) -> format("~p~n", [X]).
-
-format(Format) -> format(Format, []).
-
-format(Format, Args) ->
- io_lib:format(Format, Args).
-
-
-kvformat(S, [Item],Buff) ->
- lists:reverse([format("\n~s~p]\n",[S,Item])|Buff]);
-
-kvformat(S,[H|T],Buff) ->
- kvformat(S,T,[format("\n~s~p, ",[S,H])|Buff]);
-
-kvformat(_,[],Buff) ->
- lists:reverse(["]\n"|Buff]).
-
-argformat(_Pad,A) when is_integer(A) ->
- format("/~p\n", [A]);
-argformat(_,A) ->
- lists:flatten([format("/~p\n", [length(A)]),
- format("args: \n"),
- argformat2(" ", A)]).
-
-argformat2(Pad, Arglist) ->
- Chars = lists:flatten(io_lib:format("~p",[Arglist])),
- if
- length(Chars) < (70 - length(Pad)) ->
- format("~s~s\n", [Pad, Chars]);
- true ->
- argformat3(Pad, Arglist)
- end.
-
-argformat3(_,[]) -> format("\n");
-argformat3(Pad, [H|T]) ->
- Chars = truncate(65,io_lib:format("~s~p",[Pad, H])),
- format("~s,\n", [Chars]),
- argformat3(Pad, T).
-
-pformat(false) -> [];
-pformat({value,{_, 0}}) -> [];
-pformat({value,{_, []}}) -> [];
-pformat({value, {Key, Vals}}) ->
- Pad = mkpad(io_lib:format("~p ",[Key])),
- format(lists:flatten(["~p: " ,vformat(Pad, Vals), "~n"]), [Key]).
-
-truncate(0, _Chars) -> ".....";
-truncate(I, [H|T]) -> [H|truncate(I-1, T)];
-truncate(_I, []) -> [].
-
-mkpad([_|T]) -> [32|mkpad(T)];
-mkpad([]) -> [].
-
-proc_format(Pi) -> %% process_info struct
- X1 = pformat(lists:keysearch(initial_call, 1, Pi)),
- X2 = pformat(lists:keysearch(current_function, 1,Pi)),
- X3 = pformat(lists:keysearch(messages, 1,Pi)),
- X4 = pformat(lists:keysearch(dictionary,1, Pi)),
- X5 = pformat(lists:keysearch(heap_size, 1,Pi)),
- X6 = pformat(lists:keysearch(stack_size, 1,Pi)),
- X7 = pformat(lists:keysearch(reductions, 1,Pi)),
- X8 = pformat(lists:keysearch(links, 1,Pi)),
- X9 = pformat(lists:keysearch(trap_exit, 1,Pi)),
- lists:flatten([X1, X2, X3, X4, X5,X6,X7,X8,X9]).
-
-
-%% Using the tool_utils function for presenting messages.
-dialog_window(GSParent, Text) ->
- spawn_link(tool_utils, notify, [GSParent, Text]).
-
-%% Create a window with a dismiss button.
-msg_win(Text) ->
- spawn_link(fun() -> display_msg_win(Text) end).
-
-display_msg_win(Text) ->
- GS = gs:start([{kernel,true}]),
- Font = font(GS),
- Win = gs:window(GS, [{width,200}, {height,75}, {destroy,true},
- {title,"Pman Message"}]),
- Can = gs:canvas(Win, [{width,200}, {height, 75},{x,0},{y,0}]),
- gs:text(Can, [{text,Text}, {coords,[{10,0}]}, {justify,center}]),
- Btn = gs:button(Win, [{label,{text,"Dismiss"}}, {font,Font},
- {width,100}, {x,50}, {y,40}]),
- gs:config(Win, {map,true}),
- receive
- {gs, Btn, click, _, _} ->
- ok
- end.
-
-%% Choose default font
-font() ->
- font(gs:start([{kernel,true}])).
-
-font(GS) ->
- case gs:read(GS, {choose_font, {screen,[],12}}) of
- Font when element(1, Font)==screen ->
- Font;
- _ ->
- gs:read(GS, {choose_font, {courier,[],12}})
- end.
diff --git a/lib/pman/src/pman_win.hrl b/lib/pman/src/pman_win.hrl
deleted file mode 100644
index 8a2778d5b7..0000000000
--- a/lib/pman/src/pman_win.hrl
+++ /dev/null
@@ -1,39 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
--define(WIN_HEIGHT, 390).
--define(WIN_WIDTH, 745).
-
--define(MENU_HEIGHT, 40).
--define(CHECKBAR_HEIGHT, 40).
-
--define(CPIDHIDDENTEXT, "# Hidden: ").
-
--define(HEADER_COLOUR, blue).
--define(UNSELECTED_COLOUR, black).
--define(SELECTED_COLOUR, white).
-
-
-
-
-
-
-
-
-
diff --git a/lib/pman/vsn.mk b/lib/pman/vsn.mk
deleted file mode 100644
index 92fb9df222..0000000000
--- a/lib/pman/vsn.mk
+++ /dev/null
@@ -1 +0,0 @@
-PMAN_VSN = 2.7.1.4
diff --git a/lib/public_key/asn1/Makefile b/lib/public_key/asn1/Makefile
index a4e36c7293..c1b3bc866d 100644
--- a/lib/public_key/asn1/Makefile
+++ b/lib/public_key/asn1/Makefile
@@ -41,7 +41,7 @@ RELSYSDIR = $(RELEASE_PATH)/lib/public_key-$(VSN)
ASN_TOP = OTP-PUB-KEY PKCS-FRAME
ASN_MODULES = PKIX1Explicit88 PKIX1Implicit88 PKIX1Algorithms88 \
PKIXAttributeCertificate PKCS-1 PKCS-3 PKCS-7 PKCS-8 PKCS-10 PKCS5v2-0 OTP-PKIX \
- InformationFramework
+ InformationFramework RFC5639
ASN_ASNS = $(ASN_MODULES:%=%.asn1)
ASN_ERLS = $(ASN_TOP:%=%.erl)
ASN_HRLS = $(ASN_TOP:%=%.hrl)
@@ -116,7 +116,8 @@ OTP-PUB-KEY.asn1db: PKIX1Algorithms88.asn1 \
PKCS-7.asn1\
PKCS-10.asn1\
InformationFramework.asn1\
- OTP-PKIX.asn1
+ OTP-PKIX.asn1 \
+ RFC5639.asn1
$(EBIN)/PKCS-FRAME.beam: PKCS-FRAME.erl PKCS-FRAME.hrl
PKCS-FRAME.erl PKCS-FRAME.hrl: PKCS-FRAME.asn1db
diff --git a/lib/public_key/asn1/OTP-PUB-KEY.set.asn b/lib/public_key/asn1/OTP-PUB-KEY.set.asn
index e94f428e4b..b3f3ccdb77 100644
--- a/lib/public_key/asn1/OTP-PUB-KEY.set.asn
+++ b/lib/public_key/asn1/OTP-PUB-KEY.set.asn
@@ -9,3 +9,4 @@ DSS.asn1
ECPrivateKey.asn1
PKCS-7.asn1
PKCS-10.asn1
+RFC5639.asn1
diff --git a/lib/public_key/asn1/RFC5639.asn1 b/lib/public_key/asn1/RFC5639.asn1
new file mode 100644
index 0000000000..85b8533132
--- /dev/null
+++ b/lib/public_key/asn1/RFC5639.asn1
@@ -0,0 +1,27 @@
+RFC5639 {iso(1) identified-organization(3) teletrust(36) algorithm(3) signature-algorithm(3) ecSign(2) 8} DEFINITIONS EXPLICIT TAGS ::=
+
+BEGIN
+
+ecStdCurvesAndGeneration OBJECT IDENTIFIER::= {iso(1)
+ identified-organization(3) teletrust(36) algorithm(3) signature-algorithm(3) ecSign(2) 8}
+
+ellipticCurveRFC5639 OBJECT IDENTIFIER ::= {ecStdCurvesAndGeneration 1}
+
+versionOne OBJECT IDENTIFIER ::= {ellipticCurveRFC5639 1}
+
+brainpoolP160r1 OBJECT IDENTIFIER ::= {versionOne 1}
+brainpoolP160t1 OBJECT IDENTIFIER ::= {versionOne 2}
+brainpoolP192r1 OBJECT IDENTIFIER ::= {versionOne 3}
+brainpoolP192t1 OBJECT IDENTIFIER ::= {versionOne 4}
+brainpoolP224r1 OBJECT IDENTIFIER ::= {versionOne 5}
+brainpoolP224t1 OBJECT IDENTIFIER ::= {versionOne 6}
+brainpoolP256r1 OBJECT IDENTIFIER ::= {versionOne 7}
+brainpoolP256t1 OBJECT IDENTIFIER ::= {versionOne 8}
+brainpoolP320r1 OBJECT IDENTIFIER ::= {versionOne 9}
+brainpoolP320t1 OBJECT IDENTIFIER ::= {versionOne 10}
+brainpoolP384r1 OBJECT IDENTIFIER ::= {versionOne 11}
+brainpoolP384t1 OBJECT IDENTIFIER ::= {versionOne 12}
+brainpoolP512r1 OBJECT IDENTIFIER ::= {versionOne 13}
+brainpoolP512t1 OBJECT IDENTIFIER ::= {versionOne 14}
+
+END
diff --git a/lib/public_key/doc/src/public_key.xml b/lib/public_key/doc/src/public_key.xml
index 002f641f1d..bd19d0e434 100644
--- a/lib/public_key/doc/src/public_key.xml
+++ b/lib/public_key/doc/src/public_key.xml
@@ -71,7 +71,7 @@
<p>Use the following include directive to get access to the
records and constant macros described here and in the User's Guide.</p>
- <code> -include_lib("public_key/include/public_key.hrl"). </code>
+ <code> -include_lib("public_key/include/public_key.hrl").</code>
<p><em>Data Types </em></p>
@@ -84,44 +84,49 @@
<p><code>der_encoded() = binary()</code></p>
<p><code>pki_asn1_type() = 'Certificate' | 'RSAPrivateKey'| 'RSAPublicKey' |
- 'DSAPrivateKey' | 'DSAPublicKey' | 'DHParameter' | 'SubjectPublicKeyInfo' |
- 'PrivateKeyInfo' | 'CertificationRequest' | 'ECPrivateKey'|
- 'EcpkParameters'</code></p>
+ 'DSAPrivateKey' | 'DSAPublicKey' | 'DHParameter' |
+ 'SubjectPublicKeyInfo' | 'PrivateKeyInfo' |
+ 'CertificationRequest' | 'ECPrivateKey' | 'EcpkParameters'</code></p>
<p><code>pem_entry () = {pki_asn1_type(), binary(), %% DER or encrypted DER
- not_encrypted | cipher_info()} </code></p>
+ not_encrypted | cipher_info()}</code></p>
- <p><code>cipher_info() = {"RC2-CBC | "DES-CBC" | "DES-EDE3-CBC", crypto:rand_bytes(8)} |
- 'PBES2-params'} </code></p>
+ <p><code>cipher_info() = {"RC2-CBC | "DES-CBC" | "DES-EDE3-CBC",
+ crypto:rand_bytes(8)} | 'PBES2-params'}</code></p>
+ <p><code>public_key() = rsa_public_key() | dsa_public_key() | ec_public_key()</code></p>
+ <p><code>private_key() = rsa_public_key() | dsa_public_key() | ec_public_key()</code></p>
<p><code>rsa_public_key() = #'RSAPublicKey'{}</code></p>
- <p><code>rsa_private_key() = #'RSAPrivateKey'{} </code></p>
+ <p><code>rsa_private_key() = #'RSAPrivateKey'{}</code></p>
- <p><code>dsa_public_key() = {integer(), #'Dss-Parms'{}} </code></p>
+ <p><code>dsa_public_key() = {integer(), #'Dss-Parms'{}}</code></p>
<p><code>dsa_private_key() = #'DSAPrivateKey'{}</code></p>
- <p><code>ec_public_key() = {#'ECPoint'{}, #'EcpkParameters'{} | {namedCurve, oid()}} </code></p>
+ <p><code>ec_public_key() = {#'ECPoint'{}, #'EcpkParameters'{} |
+ {namedCurve, oid()}}</code></p>
<p><code>ec_private_key() = #'ECPrivateKey'{}</code></p>
- <p><code> public_crypt_options() = [{rsa_pad, rsa_padding()}]. </code></p>
+ <p><code>public_crypt_options() = [{rsa_pad, rsa_padding()}].</code></p>
- <p><code> rsa_padding() = 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding'
- | 'rsa_no_padding'</code></p>
+ <p><code>rsa_padding() = 'rsa_pkcs1_padding' | 'rsa_pkcs1_oaep_padding' |
+ 'rsa_no_padding'</code></p>
- <p><code> rsa_digest_type() = 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' | 'sha512' </code></p>
+ <p><code>rsa_digest_type() = 'md5' | 'sha' | 'sha224' | 'sha256' | 'sha384' |
+ 'sha512'</code></p>
- <p><code> dss_digest_type() = 'sha' </code></p>
+ <p><code>dss_digest_type() = 'sha'</code></p>
- <p><code> ecdsa_digest_type() = 'sha'| 'sha224' | 'sha256' | 'sha384' | 'sha512' </code></p>
+ <p><code>ecdsa_digest_type() = 'sha'| 'sha224' | 'sha256' | 'sha384' | 'sha512'</code></p>
- <p><code> crl_reason() = unspecified | keyCompromise | cACompromise | affiliationChanged | superseded | cessationOfOperation | certificateHold | privilegeWithdrawn | aACompromise
- </code></p>
+ <p><code>crl_reason() = unspecified | keyCompromise | cACompromise |
+ affiliationChanged | superseded | cessationOfOperation |
+ certificateHold | privilegeWithdrawn | aACompromise</code></p>
- <p><code> ssh_file() = openssh_public_key | rfc4716_public_key |
- known_hosts | auth_keys </code></p>
+ <p><code>ssh_file() = openssh_public_key | rfc4716_public_key | known_hosts |
+ auth_keys</code></p>
<!-- <p><code>policy_tree() = [Root, Children]</code></p> -->
@@ -430,7 +435,7 @@
constructing the input to this function and that should be run through the <c>verify_fun</c>.</d>
<v> CertChain = [der_encode()]</v>
<d>A list of DER encoded certificates in trust order ending with the peer certificate.</d>
- <v> Options = proplists:proplists()</v>
+ <v> Options = proplists:proplist()</v>
<v>PublicKeyInfo = {?'rsaEncryption' | ?'id-dsa',
rsa_public_key() | integer(), 'NULL' | 'Dss-Parms'{}}</v>
<v> PolicyTree = term() </v>
@@ -492,7 +497,7 @@ fun(OtpCert :: #'OTPCertificate'{}, Event :: {bad_cert, Reason :: atom()} |
<type>
<v> OTPCertificate = #'OTPCertificate'{}</v>
<v> DPAndCRLs = [{DP::#'DistributionPoint'{} ,CRL::#'CertificateList'{}}] </v>
- <v> Options = proplists:proplists()</v>
+ <v> Options = proplists:proplist()</v>
<v> CRLStatus() = valid | {bad_cert, revocation_status_undetermined} |
{bad_cert, {revoked, crl_reason()}}</v>
</type>
diff --git a/lib/public_key/include/public_key.hrl b/lib/public_key/include/public_key.hrl
index 1e882e76ee..8afc841fa6 100644
--- a/lib/public_key/include/public_key.hrl
+++ b/lib/public_key/include/public_key.hrl
@@ -88,7 +88,8 @@
-define(privilegeWithdrawn, 9).
-define(aACompromise, 10).
--type public_key() :: rsa_public_key() | dsa_public_key().
+-type public_key() :: rsa_public_key() | dsa_public_key() | ec_public_key().
+-type private_key() :: rsa_private_key() | dsa_private_key() | ec_private_key().
-type rsa_public_key() :: #'RSAPublicKey'{}.
-type rsa_private_key() :: #'RSAPrivateKey'{}.
-type dsa_private_key() :: #'DSAPrivateKey'{}.
diff --git a/lib/public_key/src/pubkey_cert_records.erl b/lib/public_key/src/pubkey_cert_records.erl
index fdd89aa70d..f7a361d5a8 100644
--- a/lib/public_key/src/pubkey_cert_records.erl
+++ b/lib/public_key/src/pubkey_cert_records.erl
@@ -147,6 +147,20 @@ namedCurves(?'sect163r1') -> sect163r1;
namedCurves(?'sect163k1') -> sect163k1;
namedCurves(?'secp256r1') -> secp256r1;
namedCurves(?'secp192r1') -> secp192r1;
+namedCurves(?'brainpoolP160r1') -> brainpoolP160r1;
+namedCurves(?'brainpoolP160t1') -> brainpoolP160t1;
+namedCurves(?'brainpoolP192r1') -> brainpoolP192r1;
+namedCurves(?'brainpoolP192t1') -> brainpoolP192t1;
+namedCurves(?'brainpoolP224r1') -> brainpoolP224r1;
+namedCurves(?'brainpoolP224t1') -> brainpoolP224t1;
+namedCurves(?'brainpoolP256r1') -> brainpoolP256r1;
+namedCurves(?'brainpoolP256t1') -> brainpoolP256t1;
+namedCurves(?'brainpoolP320r1') -> brainpoolP320r1;
+namedCurves(?'brainpoolP320t1') -> brainpoolP320t1;
+namedCurves(?'brainpoolP384r1') -> brainpoolP384r1;
+namedCurves(?'brainpoolP384t1') -> brainpoolP384t1;
+namedCurves(?'brainpoolP512r1') -> brainpoolP512r1;
+namedCurves(?'brainpoolP512t1') -> brainpoolP512t1;
namedCurves(sect571r1) -> ?'sect571r1';
namedCurves(sect571k1) -> ?'sect571k1';
@@ -180,7 +194,21 @@ namedCurves(sect239k1) -> ?'sect239k1';
namedCurves(sect163r1) -> ?'sect163r1';
namedCurves(sect163k1) -> ?'sect163k1';
namedCurves(secp256r1) -> ?'secp256r1';
-namedCurves(secp192r1) -> ?'secp192r1'.
+namedCurves(secp192r1) -> ?'secp192r1';
+namedCurves(brainpoolP160r1) -> ?'brainpoolP160r1';
+namedCurves(brainpoolP160t1) -> ?'brainpoolP160t1';
+namedCurves(brainpoolP192r1) -> ?'brainpoolP192r1';
+namedCurves(brainpoolP192t1) -> ?'brainpoolP192t1';
+namedCurves(brainpoolP224r1) -> ?'brainpoolP224r1';
+namedCurves(brainpoolP224t1) -> ?'brainpoolP224t1';
+namedCurves(brainpoolP256r1) -> ?'brainpoolP256r1';
+namedCurves(brainpoolP256t1) -> ?'brainpoolP256t1';
+namedCurves(brainpoolP320r1) -> ?'brainpoolP320r1';
+namedCurves(brainpoolP320t1) -> ?'brainpoolP320t1';
+namedCurves(brainpoolP384r1) -> ?'brainpoolP384r1';
+namedCurves(brainpoolP384t1) -> ?'brainpoolP384t1';
+namedCurves(brainpoolP512r1) -> ?'brainpoolP512r1';
+namedCurves(brainpoolP512t1) -> ?'brainpoolP512t1'.
%%--------------------------------------------------------------------
%%% Internal functions
diff --git a/lib/reltool/src/reltool_utils.erl b/lib/reltool/src/reltool_utils.erl
index 9af8f6bae8..5a3f34506d 100644
--- a/lib/reltool/src/reltool_utils.erl
+++ b/lib/reltool/src/reltool_utils.erl
@@ -589,6 +589,8 @@ throw_error(Format, Args) ->
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+decode_regexps(Key, Regexps, undefined) ->
+ decode_regexps(Key, Regexps, []);
decode_regexps(Key, {add, Regexps}, Old) when is_list(Regexps) ->
do_decode_regexps(Key, Regexps, Old);
decode_regexps(_Key, {del, Regexps}, Old) when is_list(Regexps) ->
diff --git a/lib/reltool/test/reltool_server_SUITE.erl b/lib/reltool/test/reltool_server_SUITE.erl
index feeac9e099..bfe5d39d53 100644
--- a/lib/reltool/test/reltool_server_SUITE.erl
+++ b/lib/reltool/test/reltool_server_SUITE.erl
@@ -143,7 +143,8 @@ all() ->
mod_incl_cond_derived,
use_selected_vsn,
use_selected_vsn_relative_path,
- non_standard_vsn_id].
+ non_standard_vsn_id,
+ undefined_regexp].
groups() ->
[].
@@ -2506,6 +2507,12 @@ non_standard_vsn_id(Config) ->
reltool_server:get_app(Pid2,b)),
ok.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+undefined_regexp(_Config) ->
+ ?msym({ok,_},
+ reltool:get_config([{sys,[{app,asn1,[{excl_app_filters,
+ {add, ["^priv"]}}]}]}])),
+ ok.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Library functions
diff --git a/lib/reltool/test/reltool_test_lib.erl b/lib/reltool/test/reltool_test_lib.erl
index 3485365ed9..530d0a9985 100644
--- a/lib/reltool/test/reltool_test_lib.erl
+++ b/lib/reltool/test/reltool_test_lib.erl
@@ -258,8 +258,8 @@ run_test([{Module, TC} | Rest], Config) ->
true ->
[do_run_test(Module, TC, NewConfig)]
end,
- Module:end_per_suite(NewConfig),
- Res ++ run_test(Rest, NewConfig);
+ CommonTestRes = worst_res(Res),
+ Res ++ run_test(Rest, [{tc_status,CommonTestRes}|NewConfig]);
Error ->
?error("Test suite skipped: ~w~n", [Error]),
[{skipped, Error}]
@@ -267,6 +267,36 @@ run_test([{Module, TC} | Rest], Config) ->
run_test([], _Config) ->
[].
+worst_res(Res) ->
+ NewRes = [{dummy, {ok,dummy, dummy}} | Res],
+ [{_,WorstRes}|_] = lists:sort(fun compare_res/2, NewRes),
+ common_test_res(WorstRes).
+
+common_test_res(ok) ->
+ ok;
+common_test_res({Res,_,Reason}) ->
+ common_test_res({Res,Reason});
+common_test_res({Res,Reason}) ->
+ case Res of
+ ok -> ok;
+ skip -> {skipped, Reason};
+ skipped -> {skipped, Reason};
+ failed -> {failed, Reason};
+ crash -> {failed, Reason}
+ end.
+
+% crash < failed < skip < ok
+compare_res({_,{ResA,_,_}},{_,{ResB,_,_}}) ->
+ res_to_int(ResA) < res_to_int(ResB).
+
+res_to_int(Res) ->
+ case Res of
+ ok -> 4;
+ skip -> 3;
+ failed -> 2;
+ crash -> 1
+ end.
+
do_run_test(Module, all, Config) ->
All = [{Module, Test} || Test <- Module:all()],
run_test(All, Config);
@@ -290,9 +320,10 @@ eval_test_case(Mod, Fun, Config) ->
test_case_evaluator(Mod, Fun, [Config]) ->
NewConfig = Mod:init_per_testcase(Fun, Config),
- R = apply(Mod, Fun, [NewConfig]),
- Mod:end_per_testcase(Fun, NewConfig),
- exit({test_case_ok, R}).
+ Res = apply(Mod, Fun, [NewConfig]),
+ CommonTestRes = common_test_res(Res),
+ Mod:end_per_testcase(Fun, [{tc_status,CommonTestRes}|NewConfig]),
+ exit({test_case_ok, Res}).
wait_for_evaluator(Pid, Mod, Fun, Config) ->
receive
@@ -307,13 +338,17 @@ wait_for_evaluator(Pid, Mod, Fun, Config) ->
{'EXIT', Pid, {skipped, Reason}} ->
log("<WARNING> Test case ~w skipped, because ~p~n",
[{Mod, Fun}, Reason]),
- Mod:end_per_testcase(Fun, Config),
- {skip, {Mod, Fun}, Reason};
+ Res = {skipped, {Mod, Fun}, Reason},
+ CommonTestRes = common_test_res(Res),
+ Mod:end_per_testcase(Fun, [{tc_status,CommonTestRes}|Config]),
+ Res;
{'EXIT', Pid, Reason} ->
log("<ERROR> Eval process ~w exited, because\n\t~p~n",
[{Mod, Fun}, Reason]),
- Mod:end_per_testcase(Fun, Config),
- {crash, {Mod, Fun}, Reason}
+ Res = {crash, {Mod, Fun}, Reason},
+ CommonTestRes = common_test_res(Res),
+ Mod:end_per_testcase(Fun, [{tc_status,CommonTestRes}|Config]),
+ Res
end.
flush() ->
diff --git a/lib/runtime_tools/c_src/Makefile.in b/lib/runtime_tools/c_src/Makefile.in
index d315a90e18..2bcb93b4dd 100644
--- a/lib/runtime_tools/c_src/Makefile.in
+++ b/lib/runtime_tools/c_src/Makefile.in
@@ -21,11 +21,6 @@ include $(ERL_TOP)/make/$(TARGET)/otp.mk
include $(ERL_TOP)/make/$(TARGET)/otp_ded.mk
# ----------------------------------------------------
-# Items from top-level configure
-# ----------------------------------------------------
-DTRACE_ENABLED=@DTRACE_ENABLED@
-DTRACE_ENABLED_2STEP=@DTRACE_ENABLED_2STEP@
-# ----------------------------------------------------
# Application version
# ----------------------------------------------------
include ../vsn.mk
@@ -108,28 +103,7 @@ _create_dirs := $(shell mkdir -p $(OBJDIR) $(LIBDIR))
debug opt valgrind: $(SOLIBS) $(OBJDIR) $(LIBDIR) $(NIF_LIB)
-ifdef DTRACE_ENABLED
-DTRACE_USER_HEADER=$(OBJDIR)/dtrace_user.h
-$(OBJDIR)/dtrace_user.h: ./dtrace_user.d
- $(dtrace_verbose)dtrace -h -C $(INCLUDES) \
- -s ./dtrace_user.d \
- -o ./dtrace_user.tmp
- $(V_at)sed -e '/^#define[ ]*ERLANG_[A-Z0-9_]*(.*)/y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' ./dtrace_user.tmp > $@
- $(V_at)rm ./dtrace_user.tmp
-else
-DTRACE_USER_HEADER=
-endif
-
-DTRACE_OBJS =
-ifdef DTRACE_ENABLED_2STEP
-DTRACE_OBJS += $(OBJDIR)/dtrace_user.o
-$(OBJDIR)/dtrace_user.o: $(before_DTrace_OBJS) $(OBJDIR)/dtrace_user.h
- $(dtrace_verbose)dtrace -G -C \
- -s ./dtrace_user.d \
- -o $@ $(before_DTrace_OBJS)
-endif
-
-DYNTRACE_OBJS = $(before_DTrace_OBJS) $(DTRACE_OBJS)
+DYNTRACE_OBJS = $(before_DTrace_OBJS)
$(OBJDIR):
-@mkdir -p $(OBJDIR)
@@ -137,7 +111,7 @@ $(OBJDIR):
$(LIBDIR):
-@mkdir -p $(LIBDIR)
-$(OBJDIR)/dyntrace$(TYPEMARKER).o: dyntrace.c $(DTRACE_USER_HEADER)
+$(OBJDIR)/dyntrace$(TYPEMARKER).o: dyntrace.c
$(V_at)$(INSTALL_DIR) $(OBJDIR)
$(V_CC) -c -o $@ $(ALL_CFLAGS) $<
diff --git a/lib/runtime_tools/c_src/dyntrace.c b/lib/runtime_tools/c_src/dyntrace.c
index eef03afd1c..18f91cd7e7 100644
--- a/lib/runtime_tools/c_src/dyntrace.c
+++ b/lib/runtime_tools/c_src/dyntrace.c
@@ -30,9 +30,6 @@
#if defined(USE_DYNAMIC_TRACE) && (defined(USE_DTRACE) || defined(USE_SYSTEMTAP))
#define HAVE_USE_DTRACE 1
#endif
-#ifdef HAVE_USE_DTRACE
-#include "dtrace_user.h"
-#endif
void dtrace_nifenv_str(ErlNifEnv *env, char *process_buf);
void get_string_maybe(ErlNifEnv *env, const ERL_NIF_TERM term, char **ptr, char *buf, int bufsiz);
diff --git a/lib/runtime_tools/doc/src/dbg.xml b/lib/runtime_tools/doc/src/dbg.xml
index bf1a7621fd..d31ccd834d 100644
--- a/lib/runtime_tools/doc/src/dbg.xml
+++ b/lib/runtime_tools/doc/src/dbg.xml
@@ -1024,7 +1024,7 @@ hello</pre>
</desc>
</func>
<func>
- <name>stop() -> stopped</name>
+ <name>stop() -> ok</name>
<fsummary>Stop the <c>dbg</c>server and the tracing of all processes.</fsummary>
<desc>
<p>Stops the <c>dbg</c> server and clears all trace flags for
@@ -1035,7 +1035,7 @@ hello</pre>
</desc>
</func>
<func>
- <name>stop_clear() -> stopped</name>
+ <name>stop_clear() -> ok</name>
<fsummary>Stop the <c>dbg</c>server and the tracing of all processes, and clears trace patterns.</fsummary>
<desc>
<p>Same as stop/0, but also clears all trace patterns on local
diff --git a/lib/runtime_tools/src/dbg.erl b/lib/runtime_tools/src/dbg.erl
index f0086e8cc7..186563ab74 100644
--- a/lib/runtime_tools/src/dbg.erl
+++ b/lib/runtime_tools/src/dbg.erl
@@ -1786,12 +1786,12 @@ h(get_tracer) ->
" - Returns the process or port to which all trace messages are sent."]);
h(stop) ->
help_display(
- ["stop() -> stopped",
+ ["stop() -> ok",
" - Stops the dbg server and the tracing of all processes.",
" Does not clear any trace patterns."]);
h(stop_clear) ->
help_display(
- ["stop_clear() -> stopped",
+ ["stop_clear() -> ok",
" - Stops the dbg server and the tracing of all processes,",
" and clears all trace patterns."]).
diff --git a/lib/runtime_tools/src/system_information.erl b/lib/runtime_tools/src/system_information.erl
index 1d4b878d79..603b698d5e 100644
--- a/lib/runtime_tools/src/system_information.erl
+++ b/lib/runtime_tools/src/system_information.erl
@@ -280,7 +280,7 @@ print_environments([],_) ->
print_environment({_Key, false},_) -> ok;
print_environment({Key, Value},_) ->
- io:format(" - ~s = ~s~n", [Key, Value]).
+ io:format(" - ~s = ~ts~n", [Key, Value]).
print_modules_from_code(M, [Info|Ms], Opts) ->
print_module_from_code(M, Info),
@@ -292,14 +292,14 @@ print_modules_from_code(_, [], _) ->
ok.
print_module_from_code(M, {Path, [{M,ModInfo}]}) ->
- io:format(" from path \"~s\" (no application):~n", [Path]),
+ io:format(" from path \"~ts\" (no application):~n", [Path]),
io:format(" - compiler: ~s~n", [get_value([compiler], ModInfo)]),
io:format(" - md5: ~s~n", [get_value([md5], ModInfo)]),
io:format(" - native: ~w~n", [get_value([native], ModInfo)]),
io:format(" - loaded: ~w~n", [get_value([loaded], ModInfo)]),
ok;
print_module_from_code(M, {App,Vsn,Path,[{M,ModInfo}]}) ->
- io:format(" from path \"~s\" (~w-~s):~n", [Path,App,Vsn]),
+ io:format(" from path \"~ts\" (~w-~s):~n", [Path,App,Vsn]),
io:format(" - compiler: ~s~n", [get_value([compiler], ModInfo)]),
io:format(" - md5: ~s~n", [get_value([md5], ModInfo)]),
io:format(" - native: ~w~n", [get_value([native], ModInfo)]),
diff --git a/lib/sasl/test/release_handler_SUITE.erl b/lib/sasl/test/release_handler_SUITE.erl
index 5293381af0..7e9d7c984a 100644
--- a/lib/sasl/test/release_handler_SUITE.erl
+++ b/lib/sasl/test/release_handler_SUITE.erl
@@ -1786,25 +1786,25 @@ no_dot_erlang(Conf) ->
try
ok = file:set_cwd(PrivDir),
- Erl = filename:join([code:root_dir(),"bin","erl"]),
+ Erl = "\"" ++ filename:join([code:root_dir(),"bin","erl"]) ++ "\"",
Args = " -noinput -run io put_chars \"TESTOK\" -run erlang halt",
ok = file:write_file(".erlang", <<"io:put_chars(\"DOT_ERLANG_READ\\n\").\n">>),
case os:cmd(Erl ++ Args) of
"DOT_ERLANG_READ" ++ _ -> ok;
Other1 ->
- io:format("Failed: ~s~n",[Erl ++ Args]),
+ io:format("Failed: ~ts~n",[Erl ++ Args]),
io:format("Expected: ~s ++ _~n",["DOT_ERLANG_READ "]),
- io:format("Got: ~s~n",[Other1]),
+ io:format("Got: ~ts~n",[Other1]),
exit(failed_to_start, test_error)
end,
NO_DOT_ERL = " -boot no_dot_erlang",
case os:cmd(Erl ++ NO_DOT_ERL ++ Args) of
"TESTOK" ++ _ -> ok;
Other2 ->
- io:format("Failed: ~s~n",[Erl ++ Args]),
+ io:format("Failed: ~ts~n",[Erl ++ Args]),
io:format("Expected: ~s~n",["TESTOK"]),
- io:format("Got: ~s~n",[Other2]),
+ io:format("Got: ~ts~n",[Other2]),
exit(failed_to_start, no_dot_erlang)
end
after
diff --git a/lib/snmp/doc/src/notes.xml b/lib/snmp/doc/src/notes.xml
index d213b67052..ab5514e550 100644
--- a/lib/snmp/doc/src/notes.xml
+++ b/lib/snmp/doc/src/notes.xml
@@ -4,7 +4,7 @@
<chapter>
<header>
<copyright>
- <year>1996</year><year>2013</year>
+ <year>1996</year><year>2014</year>
<holder>Ericsson AB. All Rights Reserved.</holder>
</copyright>
<legalnotice>
@@ -34,6 +34,80 @@
<section>
+ <title>SNMP Development Toolkit 4.25.0.1</title>
+ <p>Version 4.25.0.1 supports code replacement in runtime from/to
+ version 4.25, 4.24.2, 4.24.1 and 4.24. </p>
+
+ <section>
+ <title>Improvements and new features</title>
+<!--
+ <p>-</p>
+-->
+
+ <list type="bulleted">
+ <item>
+ <p>Updated doc files to utf8. </p>
+ <p>Own Id: OTP-10907</p>
+ </item>
+
+ <item>
+ <p>Fixed test suite to support UTF-8 paths. </p>
+ <p>Own Id: OTP-10877</p>
+ </item>
+
+ </list>
+
+ </section>
+
+ <section>
+ <title>Fixed Bugs and Malfunctions</title>
+ <p>-</p>
+
+<!--
+ <list type="bulleted">
+ <item>
+ <p>Wrong block cypher type used for AES ('aes_cbf128'
+ instead of 'aes_cfb128') when performing AES block
+ encrypt/decrypt which breaks SNMP usmAesCfb128Protocol
+ in agent and manager. </p>
+ <p>Own Id: OTP-11412</p>
+ </item>
+
+ <item>
+ <p>[manager] When performing the AES encryption, invalid values for
+ the EngineBoots and EngineTime was used. </p>
+ <p>The values of the local agent was used, which would have produced
+ "some" values if an agent was actually running.
+ If not it would have caused a crash. </p>
+ <p>Own Id: OTP-11413</p>
+ </item>
+
+ </list>
+-->
+
+ </section>
+
+ <section>
+ <title>Incompatibilities</title>
+ <p>-</p>
+
+<!--
+ <list type="bulleted">
+ <item>
+ <p>[manager] The old Addr-and-Port based API functions, previously
+ long deprecated and marked for deletion in R16B, has now been
+ removed. </p>
+ <p>Own Id: OTP-10027</p>
+ </item>
+
+ </list>
+-->
+ </section>
+
+ </section> <!-- 4.25.0.1 -->
+
+
+ <section>
<title>SNMP Development Toolkit 4.25</title>
<p>Version 4.25 supports code replacement in runtime from/to
version 4.24.2, 4.24.1, 4.24, 4.23.1 and 4.23. </p>
diff --git a/lib/snmp/src/app/snmp.appup.src b/lib/snmp/src/app/snmp.appup.src
index fa4b72ab68..babc33e6a5 100644
--- a/lib/snmp/src/app/snmp.appup.src
+++ b/lib/snmp/src/app/snmp.appup.src
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -28,11 +28,10 @@
%% {update, snmpa_local_db, soft, soft_purge, soft_purge, []}
%% {add_module, snmpm_net_if_mt}
[
+ {"4.25", [{restart_application, snmp}]},
{"4.24.2", [{restart_application, snmp}]},
{"4.24.1", [{restart_application, snmp}]},
- {"4.24", [{restart_application, snmp}]},
- {"4.23.1", [{restart_application, snmp}]},
- {"4.23", [{restart_application, snmp}]}
+ {"4.24", [{restart_application, snmp}]}
],
%% ------D o w n g r a d e ---------------------------------------------------
@@ -41,11 +40,10 @@
%% {remove, {snmpm_net_if_mt, soft_purge, soft_purge}}
[
+ {"4.25", [{restart_application, snmp}]},
{"4.24.2", [{restart_application, snmp}]},
{"4.24.1", [{restart_application, snmp}]},
- {"4.24", [{restart_application, snmp}]},
- {"4.23.1", [{restart_application, snmp}]},
- {"4.23", [{restart_application, snmp}]}
+ {"4.24", [{restart_application, snmp}]}
]
}.
diff --git a/lib/snmp/test/snmp_agent_test.erl b/lib/snmp/test/snmp_agent_test.erl
index 50336fcf6e..89a6ce1253 100644
--- a/lib/snmp/test/snmp_agent_test.erl
+++ b/lib/snmp/test/snmp_agent_test.erl
@@ -1524,11 +1524,11 @@ app_info(Config) when is_list(Config) ->
false ->
"undefined"
end,
- io:format("Root dir: ~s~n"
- "SNMP: Application dir: ~s~n"
- " Application ver: ~s~n"
- "SSL: Application dir: ~s~n"
- "CRYPTO: Application dir: ~s~n",
+ io:format("Root dir: ~ts~n"
+ "SNMP: Application dir: ~ts~n"
+ " Application ver: ~ts~n"
+ "SSL: Application dir: ~ts~n"
+ "CRYPTO: Application dir: ~ts~n",
[code:root_dir(), SnmpDir, AppVsn, SslDir, CryptoDir]),
ok.
diff --git a/lib/snmp/vsn.mk b/lib/snmp/vsn.mk
index 70f7c2b19a..533e313bdb 100644
--- a/lib/snmp/vsn.mk
+++ b/lib/snmp/vsn.mk
@@ -2,7 +2,7 @@
# %CopyrightBegin%
#
-# Copyright Ericsson AB 1997-2013. All Rights Reserved.
+# Copyright Ericsson AB 1997-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -18,6 +18,6 @@
# %CopyrightEnd%
APPLICATION = snmp
-SNMP_VSN = 4.25
+SNMP_VSN = 4.25.0.1
PRE_VSN =
APP_VSN = "$(APPLICATION)-$(SNMP_VSN)$(PRE_VSN)"
diff --git a/lib/ssh/doc/src/ssh.xml b/lib/ssh/doc/src/ssh.xml
index 679ef9bc19..5d5f2e5b91 100644
--- a/lib/ssh/doc/src/ssh.xml
+++ b/lib/ssh/doc/src/ssh.xml
@@ -38,6 +38,8 @@
<item>Supported SSH version is 2.0 </item>
<item>Supported MAC algorithms: hmac-sha1</item>
<item>Supported encryption algorithms: aes128-cb and 3des-cbc</item>
+ <item>Supports unicode filenames if the emulator and the underlaying OS supports it. See the DESCRIPTION section in <seealso marker="kernel:file">file</seealso> for information about this subject</item>
+ <item>Supports unicode in shell and cli</item>
</list>
</section>
diff --git a/lib/ssh/src/ssh.erl b/lib/ssh/src/ssh.erl
index 2685b1553b..9f571adba2 100644
--- a/lib/ssh/src/ssh.erl
+++ b/lib/ssh/src/ssh.erl
@@ -59,8 +59,8 @@ stop() ->
application:stop(ssh).
%%--------------------------------------------------------------------
--spec connect(string(), integer(), proplists:proplists()) -> {ok, pid()} | {error, term()}.
--spec connect(string(), integer(), proplists:proplists(), timeout()) -> {ok, pid()} | {error, term()}.
+-spec connect(string(), integer(), proplists:proplist()) -> {ok, pid()} | {error, term()}.
+-spec connect(string(), integer(), proplists:proplist(), timeout()) -> {ok, pid()} | {error, term()}.
%%
%% Description: Starts an ssh connection.
%%--------------------------------------------------------------------
diff --git a/lib/ssh/src/ssh.hrl b/lib/ssh/src/ssh.hrl
index 94ced9da6f..0c4d34f89c 100644
--- a/lib/ssh/src/ssh.hrl
+++ b/lib/ssh/src/ssh.hrl
@@ -54,6 +54,7 @@
-define(uint32(X), << ?UINT32(X) >> ).
-define(uint64(X), << ?UINT64(X) >> ).
-define(string(X), << ?STRING(list_to_binary(X)) >> ).
+-define(string_utf8(X), << ?STRING(unicode:characters_to_binary(X)) >> ).
-define(binary(X), << ?STRING(X) >>).
-define(SSH_CIPHER_NONE, 0).
diff --git a/lib/ssh/src/ssh_auth.erl b/lib/ssh/src/ssh_auth.erl
index 1fa3df847f..409a1db6d5 100644
--- a/lib/ssh/src/ssh_auth.erl
+++ b/lib/ssh/src/ssh_auth.erl
@@ -83,7 +83,7 @@ password_msg([#ssh{opts = Opts, io_cb = IoCb,
method = "password",
data =
<<?BOOLEAN(?FALSE),
- ?STRING(list_to_binary(Password))>>},
+ ?STRING(unicode:characters_to_binary(Password))>>},
Ssh)
end.
@@ -190,8 +190,7 @@ handle_userauth_request(#ssh_msg_userauth_request{user = User,
data = Data}, _,
#ssh{opts = Opts} = Ssh) ->
<<_:8, ?UINT32(Sz), BinPwd:Sz/binary>> = Data,
- Password = binary_to_list(BinPwd),
-
+ Password = unicode:characters_to_list(BinPwd),
case check_password(User, Password, Opts) of
true ->
{authorized, User,
@@ -352,7 +351,7 @@ verify_sig(SessionId, User, Service, Alg, KeyBlob, SigWLen, Opts) ->
build_sig_data(SessionId, User, Service, KeyBlob, Alg) ->
Sig = [?binary(SessionId),
?SSH_MSG_USERAUTH_REQUEST,
- ?string(User),
+ ?string_utf8(User),
?string(Service),
?binary(<<"publickey">>),
?TRUE,
diff --git a/lib/ssh/src/ssh_bits.erl b/lib/ssh/src/ssh_bits.erl
index 2b0241cb83..8aaff93b9f 100644
--- a/lib/ssh/src/ssh_bits.erl
+++ b/lib/ssh/src/ssh_bits.erl
@@ -116,6 +116,10 @@ enc(Xs, [string|Ts], Offset) ->
X0 = hd(Xs),
Y = ?string(X0),
[Y | enc(tl(Xs),Ts,Offset+size(Y))];
+enc(Xs, [string_utf8|Ts], Offset) ->
+ X0 = hd(Xs),
+ Y = ?string_utf8(X0),
+ [Y | enc(tl(Xs),Ts,Offset+size(Y))];
enc(Xs, [binary|Ts], Offset) ->
X0 = hd(Xs),
Y = ?binary(X0),
diff --git a/lib/ssh/src/ssh_cli.erl b/lib/ssh/src/ssh_cli.erl
index 2c8e515a14..77453e8fd7 100644
--- a/lib/ssh/src/ssh_cli.erl
+++ b/lib/ssh/src/ssh_cli.erl
@@ -170,10 +170,19 @@ handle_msg({Group, get_unicode_state}, State) ->
{ok, State};
handle_msg({Group, tty_geometry}, #state{group = Group,
- pty = #ssh_pty{width=Width,
- height=Height}
+ pty = Pty
} = State) ->
- Group ! {self(),tty_geometry,{Width,Height}},
+ case Pty of
+ #ssh_pty{width=Width,height=Height} ->
+ Group ! {self(),tty_geometry,{Width,Height}};
+ _ ->
+ %% This is a dirty fix of the problem with the otp ssh:shell
+ %% client. That client will not allocate a tty, but someone
+ %% asks for the tty_geometry just before every erlang prompt.
+ %% If that question is not answered, there is a 2 sec timeout
+ %% Until the prompt is seen by the user at the client side ...
+ Group ! {self(),tty_geometry,{0,0}}
+ end,
{ok,State};
handle_msg({Group, Req}, #state{group = Group, buf = Buf, pty = Pty,
@@ -349,7 +358,7 @@ delete_chars(N, {Buf, BufTail, Col}, Tty) when N > 0 ->
{Buf, NewBufTail, Col}};
delete_chars(N, {Buf, BufTail, Col}, Tty) -> % N < 0
NewBuf = nthtail(-N, Buf),
- NewCol = Col + N,
+ NewCol = case Col + N of V when V >= 0 -> V; _ -> 0 end,
M1 = move_cursor(Col, NewCol, Tty),
M2 = move_cursor(NewCol + length(BufTail) - N, NewCol, Tty),
{[M1, BufTail, lists:duplicate(-N, $ ) | M2],
diff --git a/lib/ssh/src/ssh_connection.erl b/lib/ssh/src/ssh_connection.erl
index 03dddae3c8..b377614949 100644
--- a/lib/ssh/src/ssh_connection.erl
+++ b/lib/ssh/src/ssh_connection.erl
@@ -271,10 +271,36 @@ cancel_tcpip_forward(ConnectionHandler, BindIP, Port) ->
%%--------------------------------------------------------------------
%%% Internal API
%%--------------------------------------------------------------------
+l2b(L) when is_integer(hd(L)) ->
+ try list_to_binary(L)
+ of
+ B -> B
+ catch
+ _:_ ->
+ unicode:characters_to_binary(L)
+ end;
+l2b([H|T]) ->
+ << (l2b(H))/binary, (l2b(T))/binary >>;
+l2b(B) when is_binary(B) ->
+ B;
+l2b([]) ->
+ <<>>.
+
+
+
channel_data(ChannelId, DataType, Data, Connection, From)
when is_list(Data)->
channel_data(ChannelId, DataType,
- list_to_binary(Data), Connection, From);
+%% list_to_binary(Data), Connection, From);
+ l2b(Data), Connection, From);
+ %% try list_to_binary(Data)
+ %% of
+ %% B -> B
+ %% catch
+ %% _:_ -> io:format('BAD BINARY: ~p~n',[Data]),
+ %% unicode:characters_to_binary(Data)
+ %% end,
+ %% Connection, From);
channel_data(ChannelId, DataType, Data,
#connection{channel_cache = Cache} = Connection,
diff --git a/lib/ssh/src/ssh_message.erl b/lib/ssh/src/ssh_message.erl
index 7bd0375521..01a0988718 100644
--- a/lib/ssh/src/ssh_message.erl
+++ b/lib/ssh/src/ssh_message.erl
@@ -120,7 +120,7 @@ encode(#ssh_msg_userauth_request{
data = Data
}) ->
ssh_bits:encode([?SSH_MSG_USERAUTH_REQUEST, User, Service, Method, Data],
- [byte, string, string, string, '...']);
+ [byte, string_utf8, string, string, '...']);
encode(#ssh_msg_userauth_failure{
authentications = Auths,
partial_success = Bool
@@ -135,7 +135,7 @@ encode(#ssh_msg_userauth_banner{
language = Lang
}) ->
ssh_bits:encode([?SSH_MSG_USERAUTH_BANNER, Banner, Lang],
- [byte, string, string]);
+ [byte, string_utf8, string]);
encode(#ssh_msg_userauth_pk_ok{
algorithm_name = Alg,
diff --git a/lib/ssh/src/ssh_sftp.erl b/lib/ssh/src/ssh_sftp.erl
index 10167a9223..0ea2366ac7 100644
--- a/lib/ssh/src/ssh_sftp.erl
+++ b/lib/ssh/src/ssh_sftp.erl
@@ -352,7 +352,7 @@ write_file(Pid, Name, List) ->
write_file(Pid, Name, List, ?FILEOP_TIMEOUT).
write_file(Pid, Name, List, FileOpTimeout) when is_list(List) ->
- write_file(Pid, Name, list_to_binary(List), FileOpTimeout);
+ write_file(Pid, Name, unicode:characters_to_binary(List), FileOpTimeout);
write_file(Pid, Name, Bin, FileOpTimeout) ->
case open(Pid, Name, [write, binary], FileOpTimeout) of
{ok, Handle} ->
@@ -514,7 +514,7 @@ do_handle_call({pread,Async,Handle,At,Length}, From, State) ->
case get_mode(Handle, State2) of
binary -> {{ok,Data}, State2};
text ->
- {{ok,binary_to_list(Data)}, State2}
+ {{ok,unicode:characters_to_list(Data)}, State2}
end;
(Rep, State2) ->
{Rep, State2}
@@ -535,8 +535,7 @@ do_handle_call({read,Async,Handle,Length}, From, State) ->
fun({ok,Data}, State2) ->
case get_mode(Handle, State2) of
binary -> {{ok,Data}, State2};
- text ->
- {{ok,binary_to_list(Data)}, State2}
+ text -> {{ok,binary_to_list(Data)}, State2}
end;
(Rep, State2) -> {Rep, State2}
end);
diff --git a/lib/ssh/src/ssh_sftpd.erl b/lib/ssh/src/ssh_sftpd.erl
index 174ca0126b..213b5c714d 100644
--- a/lib/ssh/src/ssh_sftpd.erl
+++ b/lib/ssh/src/ssh_sftpd.erl
@@ -214,8 +214,7 @@ handle_op(?SSH_FXP_INIT, Version, B, State) when is_binary(B) ->
handle_op(?SSH_FXP_REALPATH, ReqId,
<<?UINT32(Rlen), RPath:Rlen/binary>>,
State0) ->
- RelPath0 = binary_to_list(RPath),
- RelPath = relate_file_name(RelPath0, State0, _Canonicalize=false),
+ RelPath = relate_file_name(RPath, State0, _Canonicalize=false),
{Res, State} = resolve_symlinks(RelPath, State0),
case Res of
{ok, AbsPath} ->
@@ -231,7 +230,7 @@ handle_op(?SSH_FXP_OPENDIR, ReqId,
<<?UINT32(RLen), RPath:RLen/binary>>,
State0 = #state{xf = #ssh_xfer{vsn = Vsn},
file_handler = FileMod, file_state = FS0}) ->
- RelPath = binary_to_list(RPath),
+ RelPath = unicode:characters_to_list(RPath),
AbsPath = relate_file_name(RelPath, State0),
XF = State0#state.xf,
@@ -312,9 +311,8 @@ handle_op(?SSH_FXP_WRITE, ReqId,
?SSH_FX_INVALID_HANDLE),
State
end;
-handle_op(?SSH_FXP_READLINK, ReqId, <<?UINT32(PLen), BPath:PLen/binary>>,
+handle_op(?SSH_FXP_READLINK, ReqId, <<?UINT32(PLen), RelPath:PLen/binary>>,
State = #state{file_handler = FileMod, file_state = FS0}) ->
- RelPath = binary_to_list(BPath),
AbsPath = relate_file_name(RelPath, State),
{Res, FS1} = FileMod:read_link(AbsPath, FS0),
case Res of
@@ -524,10 +522,10 @@ close_our_file({_,Fd}, FileMod, FS0) ->
%%% stat: do the stat
stat(Vsn, ReqId, Data, State, F) when Vsn =< 3->
<<?UINT32(BLen), BPath:BLen/binary>> = Data,
- stat(ReqId, binary_to_list(BPath), State, F);
+ stat(ReqId, unicode:characters_to_list(BPath), State, F);
stat(Vsn, ReqId, Data, State, F) when Vsn >= 4->
<<?UINT32(BLen), BPath:BLen/binary, ?UINT32(_Flags)>> = Data,
- stat(ReqId, binary_to_list(BPath), State, F).
+ stat(ReqId, unicode:characters_to_list(BPath), State, F).
fstat(Vsn, ReqId, Data, State) when Vsn =< 3->
<<?UINT32(HLen), Handle:HLen/binary>> = Data,
@@ -609,13 +607,13 @@ decode_4_acess([]) ->
open(Vsn, ReqId, Data, State) when Vsn =< 3 ->
<<?UINT32(BLen), BPath:BLen/binary, ?UINT32(PFlags),
_Attrs/binary>> = Data,
- Path = binary_to_list(BPath),
+ Path = unicode:characters_to_list(BPath),
Flags = ssh_xfer:decode_open_flags(Vsn, PFlags),
do_open(ReqId, State, Path, Flags);
open(Vsn, ReqId, Data, State) when Vsn >= 4 ->
<<?UINT32(BLen), BPath:BLen/binary, ?UINT32(Access),
?UINT32(PFlags), _Attrs/binary>> = Data,
- Path = binary_to_list(BPath),
+ Path = unicode:characters_to_list(BPath),
FlagBits = ssh_xfer:decode_open_flags(Vsn, PFlags),
AcessBits = ssh_xfer:decode_ace_mask(Access),
%% TODO: This is to make sure the Access flags are not ignored
@@ -712,7 +710,7 @@ relate_file_name(File, State) ->
relate_file_name(File, State, _Canonicalize=true).
relate_file_name(File, State, Canonicalize) when is_binary(File) ->
- relate_file_name(binary_to_list(File), State, Canonicalize);
+ relate_file_name(unicode:characters_to_list(File), State, Canonicalize);
relate_file_name(File, #state{cwd = CWD, root = ""}, Canonicalize) ->
relate_filename_to_path(File, CWD, Canonicalize);
relate_file_name(File, #state{root = Root}, Canonicalize) ->
diff --git a/lib/ssh/src/ssh_xfer.erl b/lib/ssh/src/ssh_xfer.erl
index e18e18a9a9..63d01fd9de 100644
--- a/lib/ssh/src/ssh_xfer.erl
+++ b/lib/ssh/src/ssh_xfer.erl
@@ -72,7 +72,6 @@ protocol_version_request(XF) ->
open(XF, ReqID, FileName, Access, Flags, Attrs) ->
Vsn = XF#ssh_xfer.vsn,
- FileName1 = unicode:characters_to_binary(FileName),
MBits = if Vsn >= 5 ->
M = encode_ace_mask(Access),
?uint32(M);
@@ -82,7 +81,7 @@ open(XF, ReqID, FileName, Access, Flags, Attrs) ->
F = encode_open_flags(Flags),
xf_request(XF,?SSH_FXP_OPEN,
[?uint32(ReqID),
- ?binary(FileName1),
+ ?string_utf8(FileName),
MBits,
?uint32(F),
encode_ATTR(Vsn,Attrs)]).
@@ -90,7 +89,7 @@ open(XF, ReqID, FileName, Access, Flags, Attrs) ->
opendir(XF, ReqID, DirName) ->
xf_request(XF, ?SSH_FXP_OPENDIR,
[?uint32(ReqID),
- ?string(DirName)]).
+ ?string_utf8(DirName)]).
close(XF, ReqID, Handle) ->
@@ -127,13 +126,11 @@ write(XF,ReqID, Handle, Offset, Data) ->
remove(XF, ReqID, File) ->
xf_request(XF, ?SSH_FXP_REMOVE,
[?uint32(ReqID),
- ?string(File)]).
+ ?string_utf8(File)]).
%% Rename a file/directory
-rename(XF, ReqID, Old, New, Flags) ->
+rename(XF, ReqID, OldPath, NewPath, Flags) ->
Vsn = XF#ssh_xfer.vsn,
- OldPath = unicode:characters_to_binary(Old),
- NewPath = unicode:characters_to_binary(New),
FlagBits
= if Vsn >= 5 ->
F0 = encode_rename_flags(Flags),
@@ -143,30 +140,27 @@ rename(XF, ReqID, Old, New, Flags) ->
end,
xf_request(XF, ?SSH_FXP_RENAME,
[?uint32(ReqID),
- ?binary(OldPath),
- ?binary(NewPath),
+ ?string_utf8(OldPath),
+ ?string_utf8(NewPath),
FlagBits]).
%% Create directory
mkdir(XF, ReqID, Path, Attrs) ->
- Path1 = unicode:characters_to_binary(Path),
xf_request(XF, ?SSH_FXP_MKDIR,
[?uint32(ReqID),
- ?binary(Path1),
+ ?string_utf8(Path),
encode_ATTR(XF#ssh_xfer.vsn, Attrs)]).
%% Remove a directory
rmdir(XF, ReqID, Dir) ->
- Dir1 = unicode:characters_to_binary(Dir),
xf_request(XF, ?SSH_FXP_RMDIR,
[?uint32(ReqID),
- ?binary(Dir1)]).
+ ?string_utf8(Dir)]).
%% Stat file
stat(XF, ReqID, Path, Flags) ->
- Path1 = unicode:characters_to_binary(Path),
Vsn = XF#ssh_xfer.vsn,
AttrFlags = if Vsn >= 5 ->
F = encode_attr_flags(Vsn, Flags),
@@ -176,13 +170,12 @@ stat(XF, ReqID, Path, Flags) ->
end,
xf_request(XF, ?SSH_FXP_STAT,
[?uint32(ReqID),
- ?binary(Path1),
+ ?string_utf8(Path),
AttrFlags]).
%% Stat file - follow symbolic links
lstat(XF, ReqID, Path, Flags) ->
- Path1 = unicode:characters_to_binary(Path),
Vsn = XF#ssh_xfer.vsn,
AttrFlags = if Vsn >= 5 ->
F = encode_attr_flags(Vsn, Flags),
@@ -192,7 +185,7 @@ lstat(XF, ReqID, Path, Flags) ->
end,
xf_request(XF, ?SSH_FXP_LSTAT,
[?uint32(ReqID),
- ?binary(Path1),
+ ?string_utf8(Path),
AttrFlags]).
%% Stat open file
@@ -211,10 +204,9 @@ fstat(XF, ReqID, Handle, Flags) ->
%% Modify file attributes
setstat(XF, ReqID, Path, Attrs) ->
- Path1 = unicode:characters_to_binary(Path),
xf_request(XF, ?SSH_FXP_SETSTAT,
[?uint32(ReqID),
- ?binary(Path1),
+ ?string_utf8(Path),
encode_ATTR(XF#ssh_xfer.vsn, Attrs)]).
@@ -227,10 +219,9 @@ fsetstat(XF, ReqID, Handle, Attrs) ->
%% Read a symbolic link
readlink(XF, ReqID, Path) ->
- Path1 = unicode:characters_to_binary(Path),
xf_request(XF, ?SSH_FXP_READLINK,
[?uint32(ReqID),
- ?binary(Path1)]).
+ ?string_utf8(Path)]).
%% Create a symbolic link
@@ -244,10 +235,9 @@ symlink(XF, ReqID, LinkPath, TargetPath) ->
%% Convert a path into a 'canonical' form
realpath(XF, ReqID, Path) ->
- Path1 = unicode:characters_to_binary(Path),
xf_request(XF, ?SSH_FXP_REALPATH,
[?uint32(ReqID),
- ?binary(Path1)]).
+ ?string_utf8(Path)]).
extended(XF, ReqID, Request, Data) ->
xf_request(XF, ?SSH_FXP_EXTENDED,
@@ -296,7 +286,10 @@ xf_send_names(#ssh_xfer{cm = CM, channel = Channel, vsn = Vsn},
Count = length(NamesAndAttrs),
{Data, Len} = encode_names(Vsn, NamesAndAttrs),
Size = 1 + 4 + 4 + Len,
- ToSend = [<<?UINT32(Size), ?SSH_FXP_NAME, ?UINT32(ReqId), ?UINT32(Count)>>,
+ ToSend = [<<?UINT32(Size),
+ ?SSH_FXP_NAME,
+ ?UINT32(ReqId),
+ ?UINT32(Count)>>,
Data],
ssh_connection:send(CM, Channel, ToSend).
@@ -818,25 +811,27 @@ decode_names(_Vsn, 0, _Data) ->
decode_names(Vsn, I, <<?UINT32(Len), FileName:Len/binary,
?UINT32(LLen), _LongName:LLen/binary,
Tail/binary>>) when Vsn =< 3 ->
- Name = binary_to_list(FileName),
+ Name = unicode:characters_to_list(FileName),
{A, Tail2} = decode_ATTR(Vsn, Tail),
[{Name, A} | decode_names(Vsn, I-1, Tail2)];
decode_names(Vsn, I, <<?UINT32(Len), FileName:Len/binary,
Tail/binary>>) when Vsn >= 4 ->
- Name = binary_to_list(FileName),
+ Name = unicode:characters_to_list(FileName),
{A, Tail2} = decode_ATTR(Vsn, Tail),
[{Name, A} | decode_names(Vsn, I-1, Tail2)].
encode_names(Vsn, NamesAndAttrs) ->
lists:mapfoldl(fun(N, L) -> encode_name(Vsn, N, L) end, 0, NamesAndAttrs).
-encode_name(Vsn, {Name,Attr}, Len) when Vsn =< 3 ->
+encode_name(Vsn, {NameUC,Attr}, Len) when Vsn =< 3 ->
+ Name = binary_to_list(unicode:characters_to_binary(NameUC)),
NLen = length(Name),
EncAttr = encode_ATTR(Vsn, Attr),
ALen = size(EncAttr),
NewLen = Len + NLen*2 + 4 + 4 + ALen,
{[<<?UINT32(NLen)>>, Name, <<?UINT32(NLen)>>, Name, EncAttr], NewLen};
-encode_name(Vsn, {Name,Attr}, Len) when Vsn >= 4 ->
+encode_name(Vsn, {NameUC,Attr}, Len) when Vsn >= 4 ->
+ Name = binary_to_list(unicode:characters_to_binary(NameUC)),
NLen = length(Name),
EncAttr = encode_ATTR(Vsn, Attr),
ALen = size(EncAttr),
@@ -851,9 +846,9 @@ encode_acl_items([ACE|As]) ->
Type = encode_ace_type(ACE#ssh_xfer_ace.type),
Flag = encode_ace_flag(ACE#ssh_xfer_ace.flag),
Mask = encode_ace_mask(ACE#ssh_xfer_ace.mask),
- Who = list_to_binary(ACE#ssh_xfer_ace.who),
+ Who = ACE#ssh_xfer_ace.who,
[?uint32(Type), ?uint32(Flag), ?uint32(Mask),
- ?binary(Who) | encode_acl_items(As)];
+ ?string_utf8(Who) | encode_acl_items(As)];
encode_acl_items([]) ->
[].
@@ -872,7 +867,7 @@ decode_acl_items(I, <<?UINT32(Type),
[#ssh_xfer_ace { type = decode_ace_type(Type),
flag = decode_ace_flag(Flag),
mask = decode_ace_mask(Mask),
- who = binary_to_list(BWho)} | Acc]).
+ who = unicode:characters_to_list(BWho)} | Acc]).
encode_extensions(Exts) ->
Count = length(Exts),
diff --git a/lib/ssh/test/ssh_test_lib.erl b/lib/ssh/test/ssh_test_lib.erl
index 6ed3dfa68c..00c25bf394 100644
--- a/lib/ssh/test/ssh_test_lib.erl
+++ b/lib/ssh/test/ssh_test_lib.erl
@@ -63,8 +63,13 @@ daemon(Host, Port, Options) ->
Error
end.
+
+
start_shell(Port, IOServer, UserDir) ->
- spawn_link(?MODULE, init_shell, [Port, IOServer, [{user_dir, UserDir}]]).
+ start_shell(Port, IOServer, UserDir, []).
+
+start_shell(Port, IOServer, UserDir, Options) ->
+ spawn_link(?MODULE, init_shell, [Port, IOServer, [{user_dir, UserDir}|Options]]).
start_shell(Port, IOServer) ->
spawn_link(?MODULE, init_shell, [Port, IOServer, []]).
@@ -91,18 +96,23 @@ loop_io_server(TestCase, Buff0) ->
{input, TestCase, Line} ->
loop_io_server(TestCase, Buff0 ++ [Line]);
{io_request, From, ReplyAs, Request} ->
+%%ct:pal("~p",[{io_request, From, ReplyAs, Request}]),
{ok, Reply, Buff} = io_request(Request, TestCase, From,
ReplyAs, Buff0),
+%%ct:pal("io_request(~p)-->~p",[Request,{ok, Reply, Buff}]),
io_reply(From, ReplyAs, Reply),
loop_io_server(TestCase, Buff);
{'EXIT',_, _} ->
- erlang:display('EXIT'),
+ erlang:display('ssh_test_lib:loop_io_server/2 EXIT'),
ok
end.
io_request({put_chars, Chars}, TestCase, _, _, Buff) ->
reply(TestCase, Chars),
{ok, ok, Buff};
+io_request({put_chars, unicode, Chars}, TestCase, _, _, Buff) when is_binary(Chars) ->
+ reply(TestCase, Chars),
+ {ok, ok, Buff};
io_request({put_chars, Enc, Chars}, TestCase, _, _, Buff) ->
reply(TestCase, unicode:characters_to_binary(Chars,Enc,latin1)),
{ok, ok, Buff};
@@ -120,11 +130,13 @@ io_request({get_line, _Enc,_}, _, _, _, [Line | Buff]) ->
io_reply(_, _, []) ->
ok;
io_reply(From, ReplyAs, Reply) ->
+%%ct:pal("io_reply ~p sending ~p ! ~p",[self(),From, {io_reply, ReplyAs, Reply}]),
From ! {io_reply, ReplyAs, Reply}.
reply(_, []) ->
ok;
reply(TestCase, Result) ->
+%%ct:pal("reply ~p sending ~p ! ~p",[self(), TestCase, Result]),
TestCase ! Result.
receive_exec_result(Msg) ->
diff --git a/lib/ssh/test/ssh_unicode_SUITE.erl b/lib/ssh/test/ssh_unicode_SUITE.erl
new file mode 100644
index 0000000000..a896a425b9
--- /dev/null
+++ b/lib/ssh/test/ssh_unicode_SUITE.erl
@@ -0,0 +1,590 @@
+%% Next line needed to enable utf8-strings in Erlang:
+%% -*- coding: utf-8 -*-
+
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2013. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+
+%% gerl +fnu
+%% ct:run_test([{suite,"ssh_unicode_SUITE"}, {logdir,"LOG"}]).
+
+-module(ssh_unicode_SUITE).
+
+%% Note: This directive should only be used in test suites.
+-compile(export_all).
+
+-include_lib("common_test/include/ct.hrl").
+-include_lib("kernel/include/file.hrl").
+
+% Default timetrap timeout
+-define(default_timeout, ?t:minutes(1)).
+
+-define(USER, "åke高兴").
+-define(PASSWD, "ärlig日本じん").
+-define('sftp.txt', "sftp瑞点.txt").
+-define('test.txt', "testハンス.txt").
+-define('link_test.txt', "link_test語.txt").
+
+-define(bindata, unicode:characters_to_binary("foobar å 一二三四いちにさんち") ).
+
+-define(NEWLINE, <<"\r\n">>).
+
+%%--------------------------------------------------------------------
+%% Common Test interface functions -----------------------------------
+%%--------------------------------------------------------------------
+
+%% suite() ->
+%% [{ct_hooks,[ts_install_cth]}].
+
+all() ->
+ [{group, sftp},
+ {group, shell}
+ ].
+
+
+init_per_suite(Config) ->
+ case {file:native_name_encoding(), (catch crypto:start())} of
+ {utf8, ok} ->
+ ssh:start(),
+ Config;
+ {utf8, _} ->
+ {skip,"Could not start crypto!"};
+ _ ->
+ {skip,"Not unicode filename enabled emulator"}
+ end.
+
+end_per_suite(Config) ->
+ ssh:stop(),
+ crypto:stop(),
+ Config.
+
+%%--------------------------------------------------------------------
+groups() ->
+ [{shell, [], [shell_no_unicode, shell_unicode_string]},
+ {sftp, [], [open_close_file, open_close_dir, read_file, read_dir,
+ write_file, rename_file, mk_rm_dir, remove_file, links,
+ retrieve_attributes, set_attributes, async_read, async_read_bin,
+ async_write
+ %% , position, pos_read, pos_write
+ ]}].
+
+init_per_group(Group, Config) when Group==sftp
+ ; Group==shell ->
+ PrivDir = ?config(priv_dir, Config),
+ SysDir = ?config(data_dir, Config),
+ Sftpd =
+ ssh_test_lib:daemon([{system_dir, SysDir},
+ {user_dir, PrivDir},
+ {user_passwords, [{?USER, ?PASSWD}]}]),
+ [{group,Group}, {sftpd, Sftpd} | Config];
+
+init_per_group(Group, Config) ->
+ [{group,Group} | Config].
+
+
+end_per_group(erlang_server, Config) ->
+ Config;
+end_per_group(_, Config) ->
+ Config.
+
+%%--------------------------------------------------------------------
+init_per_testcase(_Case, Config) ->
+ prep(Config),
+ TmpConfig0 = lists:keydelete(watchdog, 1, Config),
+ TmpConfig = lists:keydelete(sftp, 1, TmpConfig0),
+ Dog = ct:timetrap(?default_timeout),
+
+ case ?config(group, Config) of
+ sftp ->
+ {_Pid, Host, Port} = ?config(sftpd, Config),
+ {ok, ChannelPid, Connection} =
+ ssh_sftp:start_channel(Host, Port,
+ [{user, ?USER},
+ {password, ?PASSWD},
+ {user_interaction, false},
+ {silently_accept_hosts, true}]),
+ Sftp = {ChannelPid, Connection},
+ [{sftp, Sftp}, {watchdog, Dog} | TmpConfig];
+ shell ->
+ UserDir = ?config(priv_dir, Config),
+ process_flag(trap_exit, true),
+ {_Pid, _Host, Port} = ?config(sftpd, Config),
+ ct:sleep(500),
+ IO = ssh_test_lib:start_io_server(),
+ Shell = ssh_test_lib:start_shell(Port, IO, UserDir,
+ [{silently_accept_hosts, true},
+ {user,?USER},{password,?PASSWD}]),
+%%ct:pal("IO=~p, Shell=~p, self()=~p",[IO,Shell,self()]),
+ wait_for_erlang_first_line([{io,IO}, {shell,Shell} | Config])
+ end.
+
+
+wait_for_erlang_first_line(Config) ->
+ receive
+ {'EXIT', _, _} ->
+ {fail,no_ssh_connection};
+ <<"Eshell ",_/binary>> = ErlShellStart ->
+%% ct:pal("Erlang shell start: ~p~n", [ErlShellStart]),
+ Config;
+ Other ->
+ ct:pal("Unexpected answer from ssh server: ~p",[Other]),
+ {fail,unexpected_answer}
+ after 10000 ->
+ ct:pal("No answer from ssh-server"),
+ {fail,timeout}
+ end.
+
+
+
+end_per_testcase(rename_file, Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ NewFileName = filename:join(PrivDir, ?'test.txt'),
+ file:delete(NewFileName),
+ end_per_testcase(Config);
+end_per_testcase(_TC, Config) ->
+ end_per_testcase(Config).
+
+end_per_testcase(Config) ->
+ catch exit(?config(shell,Config), kill),
+ case ?config(sftp, Config) of
+ {Sftp, Connection} ->
+ ssh_sftp:stop_channel(Sftp),
+ ssh:close(Connection);
+ _ ->
+ ok
+ end.
+
+%%--------------------------------------------------------------------
+%% Test Cases --------------------------------------------------------
+
+-define(chk_expected(Received,Expected),
+ (fun(R_,E_) when R_==E_ -> ok;
+ (R_,E_) -> ct:pal("Expected: ~p~nReceived: ~p~n", [E_,R_]),
+ E_ = R_
+ end)(Received,Expected)).
+
+-define(receive_chk(Ref,Expected),
+ (fun(E__) ->
+ receive
+ {async_reply, Ref, Received} when Received==E__ ->
+ ?chk_expected(Received, E__);
+ {async_reply, Ref, Received} when Received=/=E__ ->
+ ct:pal("Expected: ~p~nReceived: ~p~n", [E__,Received]),
+ E__ = Received;
+ Msg ->
+ ct:pal("Expected (Ref=~p): ~p", [Ref,E__]),
+ ct:fail(Msg)
+ end
+ end)(Expected)).
+
+%%--------------------------------------------------------------------
+
+
+open_close_file() ->
+ [{doc, "Test API functions open/3 and close/2"}].
+open_close_file(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+
+ lists:foreach(
+ fun(Mode) ->
+ ct:log("Mode: ~p",[Mode]),
+ %% list_dir(PrivDir),
+ ok = open_close_file(Sftp, FileName, Mode)
+ end,
+ [
+ [read],
+ [write],
+ [write, creat],
+ [write, trunc],
+ [append],
+ [read, binary]
+ ]).
+
+open_close_file(Server, File, Mode) ->
+ {ok, Handle} = ssh_sftp:open(Server, File, Mode),
+ ok = ssh_sftp:close(Server, Handle).
+
+%%--------------------------------------------------------------------
+open_close_dir() ->
+ [{doc, "Test API functions opendir/2 and close/2"}].
+open_close_dir(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ {Sftp, _} = ?config(sftp, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+
+ {ok, Handle} = ssh_sftp:opendir(Sftp, PrivDir),
+ ok = ssh_sftp:close(Sftp, Handle),
+ {error, _} = ssh_sftp:opendir(Sftp, FileName).
+
+%%--------------------------------------------------------------------
+read_file() ->
+ [{doc, "Test API funtion read_file/2"}].
+read_file(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+ ?chk_expected(ssh_sftp:read_file(Sftp,FileName), file:read_file(FileName)).
+
+%%--------------------------------------------------------------------
+read_dir() ->
+ [{doc,"Test API function list_dir/2"}].
+read_dir(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ {Sftp, _} = ?config(sftp, Config),
+ {ok, Files} = ssh_sftp:list_dir(Sftp, PrivDir),
+ ct:pal("sftp list dir: ~ts~n", [Files]).
+
+%%--------------------------------------------------------------------
+write_file() ->
+ [{doc, "Test API function write_file/2"}].
+write_file(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+ ok = ssh_sftp:write_file(Sftp, FileName, [?bindata]),
+ ?chk_expected(file:read_file(FileName), {ok,?bindata}).
+
+%%--------------------------------------------------------------------
+remove_file() ->
+ [{doc,"Test API function delete/2"}].
+remove_file(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+
+ {ok, Files} = ssh_sftp:list_dir(Sftp, PrivDir),
+ true = lists:member(filename:basename(FileName), Files),
+ ok = ssh_sftp:delete(Sftp, FileName),
+ {ok, NewFiles} = ssh_sftp:list_dir(Sftp, PrivDir),
+ false = lists:member(filename:basename(FileName), NewFiles),
+ {error, _} = ssh_sftp:delete(Sftp, FileName).
+%%--------------------------------------------------------------------
+rename_file() ->
+ [{doc, "Test API function rename_file/2"}].
+rename_file(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ NewFileName = filename:join(PrivDir, ?'test.txt'),
+
+ {Sftp, _} = ?config(sftp, Config),
+ {ok, Files} = ssh_sftp:list_dir(Sftp, PrivDir),
+ ct:pal("FileName: ~ts~nFiles: ~ts~n", [FileName, [[$\n,$ ,F]||F<-Files] ]),
+ true = lists:member(filename:basename(FileName), Files),
+ false = lists:member(filename:basename(NewFileName), Files),
+ ok = ssh_sftp:rename(Sftp, FileName, NewFileName),
+ {ok, NewFiles} = ssh_sftp:list_dir(Sftp, PrivDir),
+ ct:pal("FileName: ~ts, Files: ~ts~n", [FileName, [[$\n,F]||F<-NewFiles] ]),
+
+ false = lists:member(filename:basename(FileName), NewFiles),
+ true = lists:member(filename:basename(NewFileName), NewFiles).
+
+%%--------------------------------------------------------------------
+mk_rm_dir() ->
+ [{doc,"Test API functions make_dir/2, del_dir/2"}].
+mk_rm_dir(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ {Sftp, _} = ?config(sftp, Config),
+
+ DirName = filename:join(PrivDir, "test"),
+ ok = ssh_sftp:make_dir(Sftp, DirName),
+ ok = ssh_sftp:del_dir(Sftp, DirName),
+ NewDirName = filename:join(PrivDir, "foo/bar"),
+ {error, _} = ssh_sftp:make_dir(Sftp, NewDirName),
+ {error, _} = ssh_sftp:del_dir(Sftp, PrivDir).
+
+%%--------------------------------------------------------------------
+links() ->
+ [{doc,"Tests API function make_symlink/3"}].
+links(Config) when is_list(Config) ->
+ case os:type() of
+ {win32, _} ->
+ {skip, "Links are not fully supported by windows"};
+ _ ->
+ {Sftp, _} = ?config(sftp, Config),
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ LinkFileName = filename:join(PrivDir, ?'link_test.txt'),
+
+ ok = ssh_sftp:make_symlink(Sftp, LinkFileName, FileName),
+ {ok, FileName} = ssh_sftp:read_link(Sftp, LinkFileName)
+ end.
+
+%%--------------------------------------------------------------------
+retrieve_attributes() ->
+ [{doc, "Test API function read_file_info/3"}].
+retrieve_attributes(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+
+ {Sftp, _} = ?config(sftp, Config),
+ {ok, FileInfo} = ssh_sftp:read_file_info(Sftp, FileName),
+ {ok, NewFileInfo} = file:read_file_info(FileName),
+
+ %% TODO comparison. There are some differences now is that ok?
+ ct:pal("SFTP: ~p~nFILE: ~p~n", [FileInfo, NewFileInfo]).
+
+%%--------------------------------------------------------------------
+set_attributes() ->
+ [{doc,"Test API function write_file_info/3"}].
+set_attributes(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'test.txt'),
+
+ {Sftp, _} = ?config(sftp, Config),
+ {ok,Fd} = file:open(FileName, write),
+ io:put_chars(Fd,"foo"),
+ ok = ssh_sftp:write_file_info(Sftp, FileName, #file_info{mode=8#400}),
+ {error, eacces} = file:write_file(FileName, "hello again"),
+ ssh_sftp:write_file_info(Sftp, FileName, #file_info{mode=8#600}),
+ ok = file:write_file(FileName, "hello again").
+
+%%--------------------------------------------------------------------
+
+async_read() ->
+ [{doc,"Test API aread/3"}].
+async_read(Config) when is_list(Config) ->
+ do_async_read(Config, false).
+
+async_read_bin() ->
+ [{doc,"Test API aread/3"}].
+async_read_bin(Config) when is_list(Config) ->
+ do_async_read(Config, true).
+
+do_async_read(Config, BinaryFlag) ->
+ {Sftp, _} = ?config(sftp, Config),
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'sftp.txt'),
+ {ok,ExpDataBin} = file:read_file(FileName),
+ ExpData = case BinaryFlag of
+ true -> ExpDataBin;
+ false -> binary_to_list(ExpDataBin)
+ end,
+ {ok, Handle} = ssh_sftp:open(Sftp, FileName, [read|case BinaryFlag of
+ true -> [binary];
+ false -> []
+ end]),
+ {async, Ref} = ssh_sftp:aread(Sftp, Handle, 20),
+ ?receive_chk(Ref, {ok,ExpData}).
+
+%%--------------------------------------------------------------------
+async_write() ->
+ [{doc,"Test API awrite/3"}].
+async_write(Config) when is_list(Config) ->
+ {Sftp, _} = ?config(sftp, Config),
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'test.txt'),
+ {ok, Handle} = ssh_sftp:open(Sftp, FileName, [write]),
+ Expected = ?bindata,
+ {async, Ref} = ssh_sftp:awrite(Sftp, Handle, Expected),
+
+ receive
+ {async_reply, Ref, ok} ->
+ {ok, Data} = file:read_file(FileName),
+ ?chk_expected(Data, Expected);
+ Msg ->
+ ct:fail(Msg)
+ end.
+
+%%--------------------------------------------------------------------
+
+position() ->
+ [{doc, "Test API functions position/3"}].
+position(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'test.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+
+ Data = list_to_binary("1234567890"),
+ ssh_sftp:write_file(Sftp, FileName, [Data]),
+ {ok, Handle} = ssh_sftp:open(Sftp, FileName, [read]),
+
+ {ok, 3} = ssh_sftp:position(Sftp, Handle, {bof, 3}),
+ {ok, "4"} = ssh_sftp:read(Sftp, Handle, 1),
+
+ {ok, 10} = ssh_sftp:position(Sftp, Handle, eof),
+ eof = ssh_sftp:read(Sftp, Handle, 1),
+
+ {ok, 6} = ssh_sftp:position(Sftp, Handle, {bof, 6}),
+ {ok, "7"} = ssh_sftp:read(Sftp, Handle, 1),
+
+ {ok, 9} = ssh_sftp:position(Sftp, Handle, {cur, 2}),
+ {ok, "0"} = ssh_sftp:read(Sftp, Handle, 1),
+
+ {ok, 0} = ssh_sftp:position(Sftp, Handle, bof),
+ {ok, "1"} = ssh_sftp:read(Sftp, Handle, 1),
+
+ {ok, 1} = ssh_sftp:position(Sftp, Handle, cur),
+ {ok, "2"} = ssh_sftp:read(Sftp, Handle, 1).
+
+%%--------------------------------------------------------------------
+pos_read() ->
+ [{doc,"Test API functions pread/3 and apread/3"}].
+pos_read(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'test.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+ Data = ?bindata,
+ ssh_sftp:write_file(Sftp, FileName, [Data]),
+
+ {ok, Handle} = ssh_sftp:open(Sftp, FileName, [read]),
+ {async, Ref} = ssh_sftp:apread(Sftp, Handle, {bof,5}, 4),
+
+ ?receive_chk(Ref, {ok,binary_part(Data,5,4)}),
+ ?chk_expected(ssh_sftp:pread(Sftp,Handle,{bof,4},4), {ok,binary_part(Data,4,4)}).
+
+
+%%--------------------------------------------------------------------
+pos_write() ->
+ [{doc,"Test API functions pwrite/4 and apwrite/4"}].
+pos_write(Config) when is_list(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ FileName = filename:join(PrivDir, ?'test.txt'),
+ {Sftp, _} = ?config(sftp, Config),
+
+ {ok, Handle} = ssh_sftp:open(Sftp, FileName, [write]),
+
+ Data = unicode:characters_to_list("再见"),
+ ssh_sftp:write_file(Sftp, FileName, [Data]),
+
+ NewData = unicode:characters_to_list(" さようなら"),
+ {async, Ref} = ssh_sftp:apwrite(Sftp, Handle, {bof, 2}, NewData),
+ ?receive_chk(Ref, ok),
+
+ ok = ssh_sftp:pwrite(Sftp, Handle, eof, unicode:characters_to_list(" adjö ")),
+
+ ?chk_expected(ssh_sftp:read_file(Sftp,FileName),
+ {ok,unicode:characters_to_binary("再见 さようなら adjö ")}).
+
+%%--------------------------------------------------------------------
+sftp_nonexistent_subsystem() ->
+ [{doc, "Try to execute sftp subsystem on a server that does not support it"}].
+sftp_nonexistent_subsystem(Config) when is_list(Config) ->
+ {_,Host, Port} = ?config(sftpd, Config),
+ {error,"server failed to start sftp subsystem"} =
+ ssh_sftp:start_channel(Host, Port,
+ [{user_interaction, false},
+ {user, ?USER},
+ {password, ?PASSWD},
+ {silently_accept_hosts, true}]).
+
+%%--------------------------------------------------------------------
+shell_no_unicode(Config) ->
+ do_shell(?config(io,Config),
+ [new_prompt,
+ {type,"io:format(\"hej ~p~n\",[42])."},
+ {expect,"hej 42"}
+ ]).
+
+%%--------------------------------------------------------------------
+shell_unicode_string(Config) ->
+ do_shell(?config(io,Config),
+ [new_prompt,
+ {type,"io:format(\"こにちわ~ts~n\",[\"四二\"])."},
+ {expect,"こにちわ四二"},
+ {expect,"ok"}
+ ]).
+
+%%--------------------------------------------------------------------
+%% Internal functions ------------------------------------------------
+%%--------------------------------------------------------------------
+prep(Config) ->
+ PrivDir = ?config(priv_dir, Config),
+ TestFile = filename:join(PrivDir, ?'sftp.txt'),
+ TestFile1 = filename:join(PrivDir, ?'test.txt'),
+ TestLink = filename:join(PrivDir, ?'link_test.txt'),
+
+ file:delete(TestFile),
+ file:delete(TestFile1),
+ file:delete(TestLink),
+
+ %% Initial config
+ DataDir = ?config(data_dir, Config),
+ FileName = filename:join(DataDir, ?'sftp.txt'),
+ {ok,_BytesCopied} = file:copy(FileName, TestFile),
+ Mode = 8#00400 bor 8#00200 bor 8#00040, % read & write owner, read group
+ {ok, FileInfo} = file:read_file_info(TestFile),
+ ok = file:write_file_info(TestFile,
+ FileInfo#file_info{mode = Mode}).
+
+
+%% list_dir(Dir) ->
+%% ct:pal("prep/1: ls(~p):~n~p~n~ts",[Dir, file:list_dir(Dir),
+%% begin
+%% {ok,DL} = file:list_dir(Dir),
+%% [[$\n|FN] || FN <- DL]
+%% end]).
+
+
+%%--------------------------------------------------------------------
+do_shell(IO, List) -> do_shell(IO, 0, List).
+
+do_shell(IO, N, [new_prompt|More]) ->
+ do_shell(IO, N+1, More);
+
+do_shell(IO, N, Ops=[{Order,Arg}|More]) ->
+ receive
+ X = <<"\r\n">> ->
+%% ct:pal("Skip newline ~p",[X]),
+ do_shell(IO, N, Ops);
+
+ <<P1,"> ">> when (P1-$0)==N ->
+ do_shell_prompt(IO, N, Order, Arg, More);
+
+ <<P1,P2,"> ">> when (P1-$0)*10 + (P2-$0) == N ->
+ do_shell_prompt(IO, N, Order, Arg, More);
+
+ Err when element(1,Err)==error ->
+ ct:fail("do_shell error: ~p~n",[Err]);
+
+ RecBin when Order==expect ; Order==expect_echo ->
+%% ct:pal("received ~p",[RecBin]),
+ RecStr = string:strip(unicode:characters_to_list(RecBin)),
+ ExpStr = string:strip(Arg),
+ case lists:prefix(ExpStr, RecStr) of
+ true when Order==expect ->
+ ct:pal("Matched ~ts",[RecStr]),
+ do_shell(IO, N, More);
+ true when Order==expect_echo ->
+ ct:pal("Matched echo ~ts",[RecStr]),
+ do_shell(IO, N, More);
+ false ->
+ ct:fail("*** Expected ~p, but got ~p",[string:strip(ExpStr),RecStr])
+ end
+ after 10000 ->
+ case Order of
+ expect -> ct:fail("timeout, expected ~p",[string:strip(Arg)]);
+ type -> ct:fail("timeout, no prompt")
+ end
+ end;
+
+do_shell(_, _, []) ->
+ ok.
+
+
+do_shell_prompt(IO, N, type, Str, More) ->
+%% ct:pal("Matched prompt ~p to trigger sending of next line to server",[N]),
+ IO ! {input, self(), Str++"\r\n"},
+ ct:pal("Promt '~p> ', Sent ~ts",[N,Str++"\r\n"]),
+ do_shell(IO, N, [{expect_echo,Str}|More]); % expect echo of the sent line
+do_shell_prompt(IO, N, Op, Str, More) ->
+%% ct:pal("Matched prompt ~p",[N]),
+ do_shell(IO, N, [{Op,Str}|More]).
+
+%%--------------------------------------------------------------------
diff --git a/lib/ssh/test/ssh_unicode_SUITE_data/sftp.txt b/lib/ssh/test/ssh_unicode_SUITE_data/sftp.txt
new file mode 100644
index 0000000000..3eaaddca21
--- /dev/null
+++ b/lib/ssh/test/ssh_unicode_SUITE_data/sftp.txt
@@ -0,0 +1 @@
+åäöÅÄÖ瑞語
diff --git a/lib/ssh/test/ssh_unicode_SUITE_data/sftp瑞点.txt b/lib/ssh/test/ssh_unicode_SUITE_data/sftp瑞点.txt
new file mode 100644
index 0000000000..3eaaddca21
--- /dev/null
+++ b/lib/ssh/test/ssh_unicode_SUITE_data/sftp瑞点.txt
@@ -0,0 +1 @@
+åäöÅÄÖ瑞語
diff --git a/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key b/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key
new file mode 100644
index 0000000000..51ab6fbd88
--- /dev/null
+++ b/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key
@@ -0,0 +1,13 @@
+-----BEGIN DSA PRIVATE KEY-----
+MIIBuwIBAAKBgQCClaHzE2ul0gKSUxah5W0W8UiJLy4hXngKEqpaUq9SSdVdY2LK
+wVfKH1gt5iuaf1FfzOhsIC9G/GLnjYttXZc92cv/Gfe3gR+s0ni2++MX+T++mE/Q
+diltXv/Hp27PybS67SmiFW7I+RWnT2OKlMPtw2oUuKeztCe5UWjaj/y5FQIVAPLA
+l9RpiU30Z87NRAHY3NTRaqtrAoGANMRxw8UfdtNVR0CrQj3AgPaXOGE4d+G4Gp4X
+skvnCHycSVAjtYxebUkzUzt5Q6f/IabuLUdge3gXrc8BetvrcKbp+XZgM0/Vj2CF
+Ymmy3in6kzGZq7Fw1sZaku6AOU8vLa5woBT2vAcHLLT1bLAzj7viL048T6MfjrOP
+ef8nHvACgYBhDWFQJ1mf99sg92LalVq1dHLmVXb3PTJDfCO/Gz5NFmj9EZbAtdah
+/XcF3DeRF+eEoz48wQF/ExVxSMIhLdL+o+ElpVhlM7Yii+T7dPhkQfEul6zZXu+U
+ykSTXYUbtsfTNRFQGBW2/GfnEc0mnIxfn9v10NEWMzlq5z9wT9P0CgIVAN4wtL5W
+Lv62jKcdskxNyz2NQoBx
+-----END DSA PRIVATE KEY-----
+
diff --git a/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key.pub b/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key.pub
new file mode 100644
index 0000000000..4dbb1305b0
--- /dev/null
+++ b/lib/ssh/test/ssh_unicode_SUITE_data/ssh_host_dsa_key.pub
@@ -0,0 +1,11 @@
+---- BEGIN SSH2 PUBLIC KEY ----
+AAAAB3NzaC1kc3MAAACBAIKVofMTa6XSApJTFqHlbRbxSIkvLiFeeAoSqlpSr1JJ1V1j
+YsrBV8ofWC3mK5p/UV/M6GwgL0b8YueNi21dlz3Zy/8Z97eBH6zSeLb74xf5P76YT9B2
+KW1e/8enbs/JtLrtKaIVbsj5FadPY4qUw+3DahS4p7O0J7lRaNqP/LkVAAAAFQDywJfU
+aYlN9GfOzUQB2NzU0WqrawAAAIA0xHHDxR9201VHQKtCPcCA9pc4YTh34bganheyS+cI
+fJxJUCO1jF5tSTNTO3lDp/8hpu4tR2B7eBetzwF62+twpun5dmAzT9WPYIViabLeKfqT
+MZmrsXDWxlqS7oA5Ty8trnCgFPa8BwcstPVssDOPu+IvTjxPox+Os495/yce8AAAAIBh
+DWFQJ1mf99sg92LalVq1dHLmVXb3PTJDfCO/Gz5NFmj9EZbAtdah/XcF3DeRF+eEoz48
+wQF/ExVxSMIhLdL+o+ElpVhlM7Yii+T7dPhkQfEul6zZXu+UykSTXYUbtsfTNRFQGBW2
+/GfnEc0mnIxfn9v10NEWMzlq5z9wT9P0Cg==
+---- END SSH2 PUBLIC KEY ----
diff --git a/lib/ssh/vsn.mk b/lib/ssh/vsn.mk
index 8186f39888..9ffc59dbaf 100644
--- a/lib/ssh/vsn.mk
+++ b/lib/ssh/vsn.mk
@@ -1,5 +1,5 @@
#-*-makefile-*- ; force emacs to enter makefile-mode
-SSH_VSN = 3.0
+SSH_VSN = 3.0.1
APP_VSN = "ssh-$(SSH_VSN)"
diff --git a/lib/ssl/doc/src/notes.xml b/lib/ssl/doc/src/notes.xml
index fb32ccec7b..0b28b1ebd4 100644
--- a/lib/ssl/doc/src/notes.xml
+++ b/lib/ssl/doc/src/notes.xml
@@ -25,7 +25,41 @@
<file>notes.xml</file>
</header>
<p>This document describes the changes made to the SSL application.</p>
- <section><title>SSL 5.3.2</title>
+ <section><title>SSL 5.3.3</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Add missing validation of the server_name_indication
+ option and test for its explicit use. It was not possible
+ to set or disable the default server_name_indication as
+ the validation of the option was missing.</p>
+ <p>
+ Own Id: OTP-11567</p>
+ </item>
+ <item>
+ <p>
+ Elliptic curve selection in server mode now properly
+ selects a curve suggested by the client, if possible, and
+ the fallback alternative is changed to a more widely
+ supported curve.</p>
+ <p>
+ Own Id: OTP-11575</p>
+ </item>
+ <item>
+ <p>
+ Bug in the TLS hello extension handling caused the server
+ to behave as it did not understand secure renegotiation.</p>
+ <p>
+ Own Id: OTP-11595</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
+<section><title>SSL 5.3.2</title>
<section><title>Fixed Bugs and Malfunctions</title>
<list>
diff --git a/lib/ssl/doc/src/ssl.xml b/lib/ssl/doc/src/ssl.xml
index 80ef419fb7..910dca3889 100644
--- a/lib/ssl/doc/src/ssl.xml
+++ b/lib/ssl/doc/src/ssl.xml
@@ -460,6 +460,10 @@ fun(srp, Username :: string(), UserState :: term()) ->
</item>
<tag>{log_alert, boolean()}</tag>
<item>If false, error reports will not be displayed.</item>
+ <tag>{honor_cipher_order, boolean()}</tag>
+ <item>If true, use the server's preference for cipher selection. If false
+ (the default), use the client's preference.
+ </item>
</taglist>
</section>
diff --git a/lib/ssl/src/ssl.appup.src b/lib/ssl/src/ssl.appup.src
index c090b6ebfb..3a64841976 100644
--- a/lib/ssl/src/ssl.appup.src
+++ b/lib/ssl/src/ssl.appup.src
@@ -1,7 +1,11 @@
%% -*- erlang -*-
{"%VSN%",
[
- {<<"5.3\\*">>, [{restart_application, ssl}]},
+ {<<"5.3.2">>, [{load_module, ssl, soft_purge, soft_purge, []},
+ {load_module, ssl_connection, soft_purge, soft_purge, []},
+ {load_module, ssl_handshake, soft_purge, soft_purge, []},
+ {load_module, tls_connection, soft_purge, soft_purge, []}]},
+ {<<"5.3.1">>, [{restart_application, ssl}]},
{<<"5.2\\*">>, [{restart_application, ssl}]},
{<<"5.1\\*">>, [{restart_application, ssl}]},
{<<"5.0\\*">>, [{restart_application, ssl}]},
@@ -9,7 +13,11 @@
{<<"3\\.*">>, [{restart_application, ssl}]}
],
[
- {<<"5.3\\*">>, [{restart_application, ssl}]},
+ {<<"5.3.2">>, [{load_module, ssl, soft_purge, soft_purge, []},
+ {load_module, ssl_connection, soft_purge, soft_purge, []},
+ {load_module, ssl_handshake, soft_purge, soft_purge, []},
+ {load_module, tls_connection, soft_purge, soft_purge, []}]},
+ {<<"5.3.1">>, [{restart_application, ssl}]},
{<<"5.2\\*">>, [{restart_application, ssl}]},
{<<"5.1\\*">>, [{restart_application, ssl}]},
{<<"5.0\\*">>, [{restart_application, ssl}]},
diff --git a/lib/ssl/src/ssl.erl b/lib/ssl/src/ssl.erl
index cff842cb2f..4646468cb6 100644
--- a/lib/ssl/src/ssl.erl
+++ b/lib/ssl/src/ssl.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1999-2013. All Rights Reserved.
+%% Copyright Ericsson AB 1999-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -608,39 +608,41 @@ handle_options(Opts0, _Role) ->
end,
SSLOptions = #ssl_options{
- versions = Versions,
- verify = validate_option(verify, Verify),
- verify_fun = VerifyFun,
- fail_if_no_peer_cert = FailIfNoPeerCert,
- verify_client_once = handle_option(verify_client_once, Opts, false),
- depth = handle_option(depth, Opts, 1),
- cert = handle_option(cert, Opts, undefined),
- certfile = CertFile,
- key = handle_option(key, Opts, undefined),
- keyfile = handle_option(keyfile, Opts, CertFile),
- password = handle_option(password, Opts, ""),
- cacerts = CaCerts,
- cacertfile = handle_option(cacertfile, Opts, CaCertDefault),
- dh = handle_option(dh, Opts, undefined),
- dhfile = handle_option(dhfile, Opts, undefined),
- user_lookup_fun = handle_option(user_lookup_fun, Opts, undefined),
- psk_identity = handle_option(psk_identity, Opts, undefined),
- srp_identity = handle_option(srp_identity, Opts, undefined),
- ciphers = handle_option(ciphers, Opts, []),
- %% Server side option
- reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun),
- reuse_sessions = handle_option(reuse_sessions, Opts, true),
- secure_renegotiate = handle_option(secure_renegotiate, Opts, false),
- renegotiate_at = handle_option(renegotiate_at, Opts, ?DEFAULT_RENEGOTIATE_AT),
- hibernate_after = handle_option(hibernate_after, Opts, undefined),
- erl_dist = handle_option(erl_dist, Opts, false),
- next_protocols_advertised =
+ versions = Versions,
+ verify = validate_option(verify, Verify),
+ verify_fun = VerifyFun,
+ fail_if_no_peer_cert = FailIfNoPeerCert,
+ verify_client_once = handle_option(verify_client_once, Opts, false),
+ depth = handle_option(depth, Opts, 1),
+ cert = handle_option(cert, Opts, undefined),
+ certfile = CertFile,
+ key = handle_option(key, Opts, undefined),
+ keyfile = handle_option(keyfile, Opts, CertFile),
+ password = handle_option(password, Opts, ""),
+ cacerts = CaCerts,
+ cacertfile = handle_option(cacertfile, Opts, CaCertDefault),
+ dh = handle_option(dh, Opts, undefined),
+ dhfile = handle_option(dhfile, Opts, undefined),
+ user_lookup_fun = handle_option(user_lookup_fun, Opts, undefined),
+ psk_identity = handle_option(psk_identity, Opts, undefined),
+ srp_identity = handle_option(srp_identity, Opts, undefined),
+ ciphers = handle_option(ciphers, Opts, []),
+ %% Server side option
+ reuse_session = handle_option(reuse_session, Opts, ReuseSessionFun),
+ reuse_sessions = handle_option(reuse_sessions, Opts, true),
+ secure_renegotiate = handle_option(secure_renegotiate, Opts, false),
+ renegotiate_at = handle_option(renegotiate_at, Opts, ?DEFAULT_RENEGOTIATE_AT),
+ hibernate_after = handle_option(hibernate_after, Opts, undefined),
+ erl_dist = handle_option(erl_dist, Opts, false),
+ next_protocols_advertised =
handle_option(next_protocols_advertised, Opts, undefined),
- next_protocol_selector =
+ next_protocol_selector =
make_next_protocol_selector(
handle_option(client_preferred_next_protocols, Opts, undefined)),
- log_alert = handle_option(log_alert, Opts, true)
- },
+ log_alert = handle_option(log_alert, Opts, true),
+ server_name_indication = handle_option(server_name_indication, Opts, undefined),
+ honor_cipher_order = handle_option(honor_cipher_order, Opts, false)
+ },
CbInfo = proplists:get_value(cb_info, Opts, {gen_tcp, tcp, tcp_closed, tcp_error}),
SslOptions = [protocol, versions, verify, verify_fun,
@@ -651,7 +653,8 @@ handle_options(Opts0, _Role) ->
reuse_session, reuse_sessions, ssl_imp,
cb_info, renegotiate_at, secure_renegotiate, hibernate_after,
erl_dist, next_protocols_advertised,
- client_preferred_next_protocols, log_alert],
+ client_preferred_next_protocols, log_alert,
+ server_name_indication, honor_cipher_order],
SockOpts = lists:foldl(fun(Key, PropList) ->
proplists:delete(Key, PropList)
@@ -833,6 +836,14 @@ validate_option(next_protocols_advertised = Opt, Value) when is_list(Value) ->
validate_option(next_protocols_advertised, undefined) ->
undefined;
+validate_option(server_name_indication, Value) when is_list(Value) ->
+ Value;
+validate_option(server_name_indication, disable) ->
+ disable;
+validate_option(server_name_indication, undefined) ->
+ undefined;
+validate_option(honor_cipher_order, Value) when is_boolean(Value) ->
+ Value;
validate_option(Opt, Value) ->
throw({error, {options, {Opt, Value}}}).
diff --git a/lib/ssl/src/ssl_connection.erl b/lib/ssl/src/ssl_connection.erl
index b7c1b9e8d0..82106935cb 100644
--- a/lib/ssl/src/ssl_connection.erl
+++ b/lib/ssl/src/ssl_connection.erl
@@ -1597,7 +1597,7 @@ default_hashsign(_Version, KeyExchange)
select_curve(#state{client_ecc = {[Curve|_], _}}) ->
{namedCurve, Curve};
select_curve(_) ->
- {namedCurve, ?secp256k1}.
+ {namedCurve, ?secp256r1}.
is_anonymous(Algo) when Algo == dh_anon;
Algo == ecdh_anon;
diff --git a/lib/ssl/src/ssl_connection.hrl b/lib/ssl/src/ssl_connection.hrl
index 27489ca325..adb2e1debe 100644
--- a/lib/ssl/src/ssl_connection.hrl
+++ b/lib/ssl/src/ssl_connection.hrl
@@ -41,7 +41,7 @@
data_tag :: atom(), % ex tcp.
close_tag :: atom(), % ex tcp_closed
error_tag :: atom(), % ex tcp_error
- host :: string() | inet:ipaddress(),
+ host :: string() | inet:ip_address(),
port :: integer(),
socket :: port(),
ssl_options :: #ssl_options{},
diff --git a/lib/ssl/src/ssl_handshake.erl b/lib/ssl/src/ssl_handshake.erl
index da72ffc043..7b4cf8eb06 100644
--- a/lib/ssl/src/ssl_handshake.erl
+++ b/lib/ssl/src/ssl_handshake.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2013-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2013-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -56,7 +56,7 @@
%% Extensions handling
-export([client_hello_extensions/6,
- handle_client_hello_extensions/8, %% Returns server hello extensions
+ handle_client_hello_extensions/9, %% Returns server hello extensions
handle_server_hello_extensions/9, select_curve/2
]).
@@ -164,7 +164,7 @@ next_protocol(SelectedProtocol) ->
%%--------------------------------------------------------------------
-spec client_certificate_verify(undefined | der_cert(), binary(),
- tls_version(), term(), private_key(),
+ tls_version(), term(), public_key:private_key(),
tls_handshake_history()) ->
#certificate_verify{} | ignore | #alert{}.
%%
@@ -207,12 +207,12 @@ certificate_request(CipherSuite, CertDbHandle, CertDbRef, Version) ->
{premaster_secret, binary(), public_key_info()} |
{dh, binary()} |
{dh, {binary(), binary()}, #'DHParameter'{}, {HashAlgo::atom(), SignAlgo::atom()},
- binary(), binary(), private_key()} |
+ binary(), binary(), public_key:private_key()} |
{ecdh, #'ECPrivateKey'{}} |
{psk, binary()} |
{dhe_psk, binary(), binary()} |
{srp, {binary(), binary()}, #srp_user{}, {HashAlgo::atom(), SignAlgo::atom()},
- binary(), binary(), private_key()}) ->
+ binary(), binary(), public_key:private_key()}) ->
#client_key_exchange{} | #server_key_exchange{}.
%%
@@ -1029,14 +1029,15 @@ cipher_suites(Suites, true) ->
select_session(SuggestedSessionId, CipherSuites, Compressions, Port, #session{ecc = ECCCurve} =
Session, Version,
- #ssl_options{ciphers = UserSuites} = SslOpts, Cache, CacheCb, Cert) ->
+ #ssl_options{ciphers = UserSuites, honor_cipher_order = HCO} = SslOpts,
+ Cache, CacheCb, Cert) ->
{SessionId, Resumed} = ssl_session:server_id(Port, SuggestedSessionId,
SslOpts, Cert,
Cache, CacheCb),
case Resumed of
undefined ->
Suites = available_suites(Cert, UserSuites, Version, ECCCurve),
- CipherSuite = select_cipher_suite(CipherSuites, Suites),
+ CipherSuite = select_cipher_suite(CipherSuites, Suites, HCO),
Compression = select_compression(Compressions),
{new, Session#session{session_id = SessionId,
cipher_suite = CipherSuite,
@@ -1088,17 +1089,19 @@ certificate_authorities_from_db(CertDbHandle, CertDbRef) ->
%%-------------Extension handling --------------------------------
-handle_client_hello_extensions(RecordCB, Random,
- #hello_extensions{renegotiation_info = Info,
- srp = SRP,
- ec_point_formats = ECCFormat,
- next_protocol_negotiation = NextProtocolNegotiation}, Version,
- #ssl_options{secure_renegotiate = SecureRenegotation} = Opts,
- #session{cipher_suite = CipherSuite, compression_method = Compression} = Session0,
- ConnectionStates0, Renegotiation) ->
+handle_client_hello_extensions(RecordCB, Random, ClientCipherSuites,
+ #hello_extensions{renegotiation_info = Info,
+ srp = SRP,
+ ec_point_formats = ECCFormat,
+ next_protocol_negotiation = NextProtocolNegotiation}, Version,
+ #ssl_options{secure_renegotiate = SecureRenegotation} = Opts,
+ #session{cipher_suite = NegotiatedCipherSuite,
+ compression_method = Compression} = Session0,
+ ConnectionStates0, Renegotiation) ->
Session = handle_srp_extension(SRP, Session0),
ConnectionStates = handle_renegotiation_extension(server, RecordCB, Version, Info,
- Random, CipherSuite, Compression,
+ Random, NegotiatedCipherSuite,
+ ClientCipherSuites, Compression,
ConnectionStates0, Renegotiation, SecureRenegotation),
ProtocolsToAdvertise = handle_next_protocol_extension(NextProtocolNegotiation, Renegotiation, Opts),
@@ -1117,7 +1120,8 @@ handle_server_hello_extensions(RecordCB, Random, CipherSuite, Compression,
#ssl_options{secure_renegotiate = SecureRenegotation,
next_protocol_selector = NextProtoSelector},
ConnectionStates0, Renegotiation) ->
- ConnectionStates = handle_renegotiation_extension(client, RecordCB, Version, Info, Random, CipherSuite,
+ ConnectionStates = handle_renegotiation_extension(client, RecordCB, Version, Info, Random,
+ CipherSuite, undefined,
Compression, ConnectionStates0,
Renegotiation, SecureRenegotation),
case handle_next_protocol(NextProtocolNegotiation, NextProtoSelector, Renegotiation) of
@@ -1287,7 +1291,7 @@ select_curve(#elliptic_curves{elliptic_curve_list = ClientCurves},
select_curve(undefined, _) ->
%% Client did not send ECC extension use default curve if
%% ECC cipher is negotiated
- {namedCurve, ?secp256k1};
+ {namedCurve, ?secp256r1};
select_curve(_, []) ->
no_curve;
select_curve(Curves, [Curve| Rest]) ->
@@ -1415,15 +1419,16 @@ calc_master_secret({3,0}, _PrfAlgo, PremasterSecret, ClientRandom, ServerRandom)
calc_master_secret({3,_}, PrfAlgo, PremasterSecret, ClientRandom, ServerRandom) ->
tls_v1:master_secret(PrfAlgo, PremasterSecret, ClientRandom, ServerRandom).
-handle_renegotiation_extension(Role, RecordCB, Version, Info, Random, CipherSuite, Compression,
+handle_renegotiation_extension(Role, RecordCB, Version, Info, Random, NegotiatedCipherSuite,
+ ClientCipherSuites, Compression,
ConnectionStates0, Renegotiation, SecureRenegotation) ->
case handle_renegotiation_info(RecordCB, Role, Info, ConnectionStates0,
Renegotiation, SecureRenegotation,
- [CipherSuite]) of
+ ClientCipherSuites) of
{ok, ConnectionStates} ->
hello_pending_connection_states(RecordCB, Role,
Version,
- CipherSuite,
+ NegotiatedCipherSuite,
Random,
Compression,
ConnectionStates);
@@ -1792,6 +1797,11 @@ handle_srp_extension(#srp{username = Username}, Session) ->
%%-------------Misc --------------------------------
+select_cipher_suite(CipherSuites, Suites, false) ->
+ select_cipher_suite(CipherSuites, Suites);
+select_cipher_suite(CipherSuites, Suites, true) ->
+ select_cipher_suite(Suites, CipherSuites).
+
select_cipher_suite([], _) ->
no_suite;
select_cipher_suite([Suite | ClientSuites], SupportedSuites) ->
diff --git a/lib/ssl/src/ssl_internal.hrl b/lib/ssl/src/ssl_internal.hrl
index 0186f9fca2..102215119d 100644
--- a/lib/ssl/src/ssl_internal.hrl
+++ b/lib/ssl/src/ssl_internal.hrl
@@ -35,7 +35,6 @@
-type certdb_ref() :: reference().
-type db_handle() :: term().
-type der_cert() :: binary().
--type private_key() :: #'RSAPrivateKey'{} | #'DSAPrivateKey'{} | #'ECPrivateKey'{}.
-type issuer() :: tuple().
-type serialnumber() :: integer().
-type cert_key() :: {reference(), integer(), issuer()}.
@@ -114,7 +113,10 @@
next_protocols_advertised = undefined, %% [binary()],
next_protocol_selector = undefined, %% fun([binary()]) -> binary())
log_alert :: boolean(),
- server_name_indication = undefined
+ server_name_indication = undefined,
+ %% Should the server prefer its own cipher order over the one provided by
+ %% the client?
+ honor_cipher_order = false
}).
-record(config, {ssl, %% SSL parameters
diff --git a/lib/ssl/src/tls_connection.erl b/lib/ssl/src/tls_connection.erl
index 8e6f80da1e..ffa04ee8ba 100644
--- a/lib/ssl/src/tls_connection.erl
+++ b/lib/ssl/src/tls_connection.erl
@@ -199,7 +199,9 @@ hello(start, #state{host = Host, port = Port, role = client,
next_state(hello, hello, Record, State);
hello(Hello = #client_hello{client_version = ClientVersion,
- extensions = #hello_extensions{hash_signs = HashSigns}},
+ extensions = #hello_extensions{hash_signs = HashSigns,
+ ec_point_formats = EcPointFormats,
+ elliptic_curves = EllipticCurves}},
State = #state{connection_states = ConnectionStates0,
port = Port, session = #session{own_certificate = Cert} = Session0,
renegotiation = {Renegotiation, _},
@@ -210,9 +212,7 @@ hello(Hello = #client_hello{client_version = ClientVersion,
case tls_handshake:hello(Hello, SslOpts, {Port, Session0, Cache, CacheCb,
ConnectionStates0, Cert}, Renegotiation) of
{Version, {Type, Session},
- ConnectionStates,
- #hello_extensions{ec_point_formats = EcPointFormats,
- elliptic_curves = EllipticCurves} = ServerHelloExt} ->
+ ConnectionStates, ServerHelloExt} ->
ssl_connection:hello({common_client_hello, Type, ServerHelloExt, HashSign},
State#state{connection_states = ConnectionStates,
negotiated_version = Version,
diff --git a/lib/ssl/src/tls_handshake.erl b/lib/ssl/src/tls_handshake.erl
index 003614b448..01abefca46 100644
--- a/lib/ssl/src/tls_handshake.erl
+++ b/lib/ssl/src/tls_handshake.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -52,9 +52,9 @@ client_hello(Host, Port, ConnectionStates,
Pending = ssl_record:pending_connection_state(ConnectionStates, read),
SecParams = Pending#connection_state.security_parameters,
CipherSuites = ssl_handshake:available_suites(UserSuites, Version),
-
- Extensions = ssl_handshake:client_hello_extensions(Host, Version, CipherSuites,
- SslOpts, ConnectionStates, Renegotiation),
+ Extensions = ssl_handshake:client_hello_extensions(Host, Version,
+ CipherSuites,
+ SslOpts, ConnectionStates, Renegotiation),
Id = ssl_session:client_id({Host, Port, SslOpts}, Cache, CacheCb, OwnCert),
@@ -87,8 +87,8 @@ hello(#server_hello{server_version = Version, random = Random,
ConnectionStates0, Renegotiation) ->
case tls_record:is_acceptable_version(Version, SupportedVersions) of
true ->
- handle_hello_extensions(Version, SessionId, Random, CipherSuite,
- Compression, HelloExt, SslOpt, ConnectionStates0, Renegotiation);
+ handle_server_hello_extensions(Version, SessionId, Random, CipherSuite,
+ Compression, HelloExt, SslOpt, ConnectionStates0, Renegotiation);
false ->
?ALERT_REC(?FATAL, ?PROTOCOL_VERSION)
end;
@@ -113,9 +113,9 @@ hello(#client_hello{client_version = ClientVersion,
no_suite ->
?ALERT_REC(?FATAL, ?INSUFFICIENT_SECURITY);
_ ->
- handle_hello_extensions(Version, Type, Random, HelloExt,
- SslOpts, Session1, ConnectionStates0,
- Renegotiation)
+ handle_client_hello_extensions(Version, Type, Random, CipherSuites, HelloExt,
+ SslOpts, Session1, ConnectionStates0,
+ Renegotiation)
end;
false ->
?ALERT_REC(?FATAL, ?PROTOCOL_VERSION)
@@ -217,8 +217,10 @@ enc_handshake(HandshakeMsg, Version) ->
ssl_handshake:encode_handshake(HandshakeMsg, Version).
-handle_hello_extensions(Version, Type, Random, HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation) ->
- try ssl_handshake:handle_client_hello_extensions(tls_record, Random, HelloExt, Version, SslOpts,
+handle_client_hello_extensions(Version, Type, Random, CipherSuites,
+ HelloExt, SslOpts, Session0, ConnectionStates0, Renegotiation) ->
+ try ssl_handshake:handle_client_hello_extensions(tls_record, Random, CipherSuites,
+ HelloExt, Version, SslOpts,
Session0, ConnectionStates0, Renegotiation) of
{Session, ConnectionStates, ServerHelloExt} ->
{Version, {Type, Session}, ConnectionStates, ServerHelloExt}
@@ -227,7 +229,7 @@ handle_hello_extensions(Version, Type, Random, HelloExt, SslOpts, Session0, Conn
end.
-handle_hello_extensions(Version, SessionId, Random, CipherSuite,
+handle_server_hello_extensions(Version, SessionId, Random, CipherSuite,
Compression, HelloExt, SslOpt, ConnectionStates0, Renegotiation) ->
case ssl_handshake:handle_server_hello_extensions(tls_record, Random, CipherSuite,
Compression, HelloExt, Version,
diff --git a/lib/ssl/src/tls_v1.erl b/lib/ssl/src/tls_v1.erl
index 2395e98642..7c7fdd64c3 100644
--- a/lib/ssl/src/tls_v1.erl
+++ b/lib/ssl/src/tls_v1.erl
@@ -368,11 +368,19 @@ finished_label(server) ->
%% list ECC curves in prefered order
ecc_curves(_Minor) ->
- [?sect571r1,?sect571k1,?secp521r1,?sect409k1,?sect409r1,
- ?secp384r1,?sect283k1,?sect283r1,?secp256k1,?secp256r1,
- ?sect239k1,?sect233k1,?sect233r1,?secp224k1,?secp224r1,
- ?sect193r1,?sect193r2,?secp192k1,?secp192r1,?sect163k1,
- ?sect163r1,?sect163r2,?secp160k1,?secp160r1,?secp160r2].
+ TLSCurves = [sect571r1,sect571k1,secp521r1,brainpoolP512r1,
+ sect409k1,sect409r1,brainpoolP384r1,secp384r1,
+ sect283k1,sect283r1,brainpoolP256r1,secp256k1,secp256r1,
+ sect239k1,sect233k1,sect233r1,secp224k1,secp224r1,
+ sect193r1,sect193r2,secp192k1,secp192r1,sect163k1,
+ sect163r1,sect163r2,secp160k1,secp160r1,secp160r2],
+ CryptoCurves = crypto:ec_curves(),
+ lists:foldr(fun(Curve, Curves) ->
+ case proplists:get_bool(Curve, CryptoCurves) of
+ true -> [pubkey_cert_records:namedCurves(Curve)|Curves];
+ false -> Curves
+ end
+ end, [], TLSCurves).
%% ECC curves from draft-ietf-tls-ecc-12.txt (Oct. 17, 2005)
oid_to_enum(?sect163k1) -> 1;
@@ -399,7 +407,10 @@ oid_to_enum(?secp224r1) -> 21;
oid_to_enum(?secp256k1) -> 22;
oid_to_enum(?secp256r1) -> 23;
oid_to_enum(?secp384r1) -> 24;
-oid_to_enum(?secp521r1) -> 25.
+oid_to_enum(?secp521r1) -> 25;
+oid_to_enum(?brainpoolP256r1) -> 26;
+oid_to_enum(?brainpoolP384r1) -> 27;
+oid_to_enum(?brainpoolP512r1) -> 28.
enum_to_oid(1) -> ?sect163k1;
enum_to_oid(2) -> ?sect163r1;
@@ -425,7 +436,10 @@ enum_to_oid(21) -> ?secp224r1;
enum_to_oid(22) -> ?secp256k1;
enum_to_oid(23) -> ?secp256r1;
enum_to_oid(24) -> ?secp384r1;
-enum_to_oid(25) -> ?secp521r1.
+enum_to_oid(25) -> ?secp521r1;
+enum_to_oid(26) -> ?brainpoolP256r1;
+enum_to_oid(27) -> ?brainpoolP384r1;
+enum_to_oid(28) -> ?brainpoolP512r1.
sufficent_ec_support() ->
CryptoSupport = crypto:supports(),
diff --git a/lib/ssl/test/ssl_basic_SUITE.erl b/lib/ssl/test/ssl_basic_SUITE.erl
index 54029ebe6d..ddc511c652 100644
--- a/lib/ssl/test/ssl_basic_SUITE.erl
+++ b/lib/ssl/test/ssl_basic_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -110,7 +110,10 @@ options_tests() ->
empty_protocol_versions,
ipv6,
reuseaddr,
- tcp_reuseaddr].
+ tcp_reuseaddr,
+ honor_server_cipher_order,
+ honor_client_cipher_order
+].
api_tests() ->
[connection_info,
@@ -130,7 +133,8 @@ api_tests() ->
listen_socket,
ssl_accept_timeout,
ssl_recv_timeout,
- versions_option
+ versions_option,
+ server_name_indication_option
].
session_tests() ->
@@ -143,6 +147,7 @@ session_tests() ->
renegotiate_tests() ->
[client_renegotiate,
server_renegotiate,
+ client_secure_renegotiate,
client_renegotiate_reused_session,
server_renegotiate_reused_session,
client_no_wrap_sequence_number,
@@ -1978,6 +1983,37 @@ client_renegotiate(Config) when is_list(Config) ->
ssl_test_lib:close(Client).
%%--------------------------------------------------------------------
+client_secure_renegotiate() ->
+ [{doc,"Test ssl:renegotiate/1 on client."}].
+client_secure_renegotiate(Config) when is_list(Config) ->
+ ServerOpts = ?config(server_opts, Config),
+ ClientOpts = ?config(client_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Data = "From erlang to erlang",
+
+ Server =
+ ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, erlang_ssl_receive, [Data]}},
+ {options, [{secure_renegotiate, true} | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE,
+ renegotiate, [Data]}},
+ {options, [{reuse_sessions, false},
+ {secure_renegotiate, true}| ClientOpts]}]),
+
+ ssl_test_lib:check_result(Client, ok, Server, ok),
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+
+%%--------------------------------------------------------------------
server_renegotiate() ->
[{doc,"Test ssl:renegotiate/1 on server."}].
server_renegotiate(Config) when is_list(Config) ->
@@ -2410,6 +2446,51 @@ tcp_reuseaddr(Config) when is_list(Config) ->
%%--------------------------------------------------------------------
+honor_server_cipher_order() ->
+ [{doc,"Test API honor server cipher order."}].
+honor_server_cipher_order(Config) when is_list(Config) ->
+ ClientCiphers = [{rsa, aes_128_cbc, sha}, {rsa, aes_256_cbc, sha}],
+ ServerCiphers = [{rsa, aes_256_cbc, sha}, {rsa, aes_128_cbc, sha}],
+honor_cipher_order(Config, true, ServerCiphers, ClientCiphers, {rsa, aes_256_cbc, sha}).
+
+honor_client_cipher_order() ->
+ [{doc,"Test API honor server cipher order."}].
+honor_client_cipher_order(Config) when is_list(Config) ->
+ ClientCiphers = [{rsa, aes_128_cbc, sha}, {rsa, aes_256_cbc, sha}],
+ ServerCiphers = [{rsa, aes_256_cbc, sha}, {rsa, aes_128_cbc, sha}],
+honor_cipher_order(Config, false, ServerCiphers, ClientCiphers, {rsa, aes_128_cbc, sha}).
+
+honor_cipher_order(Config, Honor, ServerCiphers, ClientCiphers, Expected) ->
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {?MODULE, connection_info_result, []}},
+ {options, [{ciphers, ServerCiphers}, {honor_cipher_order, Honor}
+ | ServerOpts]}]),
+ Port = ssl_test_lib:inet_port(Server),
+ Client = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {?MODULE, connection_info_result, []}},
+ {options, [{ciphers, ClientCiphers}, {honor_cipher_order, Honor}
+ | ClientOpts]}]),
+
+ Version =
+ tls_record:protocol_version(tls_record:highest_protocol_version([])),
+
+ ServerMsg = ClientMsg = {ok, {Version, Expected}},
+
+ ssl_test_lib:check_result(Server, ServerMsg, Client, ClientMsg),
+
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client).
+
+%%--------------------------------------------------------------------
+
hibernate() ->
[{doc,"Check that an SSL connection that is started with option "
"{hibernate_after, 1000} indeed hibernates after 1000ms of "
@@ -2804,6 +2885,47 @@ versions_option(Config) when is_list(Config) ->
end,
ssl_test_lib:check_result(ErrClient, {error, {tls_alert, "protocol version"}}).
+
+
+%%--------------------------------------------------------------------
+
+server_name_indication_option() ->
+ [{doc,"Test API server_name_indication option to connect."}].
+server_name_indication_option(Config) when is_list(Config) ->
+ ClientOpts = ?config(client_opts, Config),
+ ServerOpts = ?config(server_opts, Config),
+
+ {ClientNode, ServerNode, Hostname} = ssl_test_lib:run_where(Config),
+ Server = ssl_test_lib:start_server([{node, ServerNode}, {port, 0},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options, ServerOpts}]),
+ Port = ssl_test_lib:inet_port(Server),
+
+ Client0 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options,
+ [{server_name_indication, disable} |
+ ClientOpts]}
+ ]),
+
+ ssl_test_lib:check_result(Server, ok, Client0, ok),
+ Server ! listen,
+
+ Client1 = ssl_test_lib:start_client([{node, ClientNode}, {port, Port},
+ {host, Hostname},
+ {from, self()},
+ {mfa, {ssl_test_lib, send_recv_result_active, []}},
+ {options,
+ [{server_name_indication, Hostname} | ClientOpts]
+ }]),
+ ssl_test_lib:check_result(Server, ok, Client1, ok),
+ ssl_test_lib:close(Server),
+ ssl_test_lib:close(Client0),
+ ssl_test_lib:close(Client1).
+
%%--------------------------------------------------------------------
%% Internal functions ------------------------------------------------
%%--------------------------------------------------------------------
diff --git a/lib/ssl/test/ssl_dist_SUITE.erl b/lib/ssl/test/ssl_dist_SUITE.erl
index d3b523ca8c..1a1b2af8d4 100644
--- a/lib/ssl/test/ssl_dist_SUITE.erl
+++ b/lib/ssl/test/ssl_dist_SUITE.erl
@@ -324,7 +324,7 @@ start_ssl_node_raw(Name, Args) ->
[binary, {packet, 4}, {active, false}]),
{ok, ListenPort} = inet:port(LSock),
CmdLine = mk_node_cmdline(ListenPort, Name, Args),
- ?t:format("Attempting to start ssl node ~s: ~s~n", [Name, CmdLine]),
+ ?t:format("Attempting to start ssl node ~ts: ~ts~n", [Name, CmdLine]),
case open_port({spawn, CmdLine}, []) of
Port when is_port(Port) ->
unlink(Port),
diff --git a/lib/ssl/test/ssl_test_lib.erl b/lib/ssl/test/ssl_test_lib.erl
index 74fadc0cc7..7ed9adfcd9 100644
--- a/lib/ssl/test/ssl_test_lib.erl
+++ b/lib/ssl/test/ssl_test_lib.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -146,7 +146,7 @@ remove_close_msg(ReconnectTimes) ->
end.
start_client(Args) ->
- Result = spawn_link(?MODULE, run_client, [lists:delete(return_socket, Args)]),
+ Result = spawn_link(?MODULE, run_client_init, [lists:delete(return_socket, Args)]),
receive
{ connected, Socket } ->
case lists:member(return_socket, Args) of
@@ -155,6 +155,10 @@ start_client(Args) ->
end
end.
+run_client_init(Opts) ->
+ put(retries, 0),
+ run_client(Opts).
+
run_client(Opts) ->
Node = proplists:get_value(node, Opts),
Host = proplists:get_value(host, Opts),
@@ -189,9 +193,19 @@ run_client(Opts) ->
{gen_tcp, closed} ->
ok
end;
+ {error, econnrefused = Reason} ->
+ case get(retries) of
+ N when N < 5 ->
+ put(retries, N+1),
+ ct:sleep(?SLEEP),
+ run_client(Opts);
+ _ ->
+ ct:log("Client faild several times: connection failed: ~p ~n", [Reason]),
+ Pid ! {self(), {error, Reason}}
+ end;
{error, Reason} ->
ct:log("Client: connection failed: ~p ~n", [Reason]),
- Pid ! {self(), {error, Reason}}
+ Pid ! {self(), {error, Reason}}
end.
close(Pid) ->
diff --git a/lib/ssl/test/ssl_to_openssl_SUITE.erl b/lib/ssl/test/ssl_to_openssl_SUITE.erl
index 21f0172dba..68784a175e 100644
--- a/lib/ssl/test/ssl_to_openssl_SUITE.erl
+++ b/lib/ssl/test/ssl_to_openssl_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -154,22 +154,31 @@ special_init(TestCase, Config)
TestCase == erlang_client_openssl_server_nowrap_seqnum;
TestCase == erlang_server_openssl_client_nowrap_seqnum
->
- check_sane_openssl_renegotaite(Config);
+ {ok, Version} = application:get_env(ssl, protocol_version),
+ check_sane_openssl_renegotaite(Config, Version);
special_init(ssl2_erlang_server_openssl_client, Config) ->
check_sane_openssl_sslv2(Config);
special_init(TestCase, Config)
when TestCase == erlang_client_openssl_server_npn;
- TestCase == erlang_server_openssl_client_npn;
- TestCase == erlang_server_openssl_client_npn_renegotiate;
- TestCase == erlang_client_openssl_server_npn_renegotiate;
+ TestCase == erlang_server_openssl_client_npn;
TestCase == erlang_server_openssl_client_npn_only_server;
TestCase == erlang_server_openssl_client_npn_only_client;
TestCase == erlang_client_openssl_server_npn_only_client;
TestCase == erlang_client_openssl_server_npn_only_server ->
check_openssl_npn_support(Config);
+special_init(TestCase, Config)
+ when TestCase == erlang_server_openssl_client_npn_renegotiate;
+ TestCase == erlang_client_openssl_server_npn_renegotiate ->
+ {ok, Version} = application:get_env(ssl, protocol_version),
+ case check_sane_openssl_renegotaite(Config, Version) of
+ {skip, _} = Skip ->
+ Skip;
+ _ ->
+ check_openssl_npn_support(Config)
+ end;
special_init(_, Config) ->
Config.
@@ -903,8 +912,16 @@ ssl2_erlang_server_openssl_client(Config) when is_list(Config) ->
{'EXIT', OpenSslPort, _} = Exit ->
ct:log("Received: ~p ~n", [Exit]),
ok
-
end,
+ receive
+ {'EXIT', _, _} = UnkownExit ->
+ Msg = lists:flatten(io_lib:format("Received: ~p ~n", [UnkownExit])),
+ ct:log(Msg),
+ ct:comment(Msg),
+ ok
+ after 0 ->
+ ok
+ end,
ssl_test_lib:check_result(Server, {error, {tls_alert, "protocol version"}}),
process_flag(trap_exit, false).
@@ -1315,8 +1332,25 @@ check_openssl_npn_support(Config) ->
Config
end.
+check_sane_openssl_renegotaite(Config, Version) when Version == 'tlsv1.1';
+ Version == 'tlsv1.2' ->
+ case os:cmd("openssl version") of
+ "OpenSSL 1.0.1c" ++ _ ->
+ {skip, "Known renegotiation bug in OpenSSL"};
+ "OpenSSL 1.0.1b" ++ _ ->
+ {skip, "Known renegotiation bug in OpenSSL"};
+ "OpenSSL 1.0.1a" ++ _ ->
+ {skip, "Known renegotiation bug in OpenSSL"};
+ "OpenSSL 1.0.1" ++ _ ->
+ {skip, "Known renegotiation bug in OpenSSL"};
+ _ ->
+ check_sane_openssl_renegotaite(Config)
+ end;
+check_sane_openssl_renegotaite(Config, _) ->
+ check_sane_openssl_renegotaite(Config).
+
check_sane_openssl_renegotaite(Config) ->
- case os:cmd("openssl version") of
+ case os:cmd("openssl version") of
"OpenSSL 0.9.8" ++ _ ->
{skip, "Known renegotiation bug in OpenSSL"};
"OpenSSL 0.9.7" ++ _ ->
diff --git a/lib/ssl/vsn.mk b/lib/ssl/vsn.mk
index a2dd3f5930..a6e0efed25 100644
--- a/lib/ssl/vsn.mk
+++ b/lib/ssl/vsn.mk
@@ -1 +1 @@
-SSL_VSN = 5.3.2
+SSL_VSN = 5.3.3
diff --git a/lib/stdlib/src/c.erl b/lib/stdlib/src/c.erl
index fb6b8c8661..c2256c0cf9 100644
--- a/lib/stdlib/src/c.erl
+++ b/lib/stdlib/src/c.erl
@@ -330,13 +330,18 @@ choice(F) ->
end.
get_line(P, Default) ->
- case io:get_line(P) of
+ case line_string(io:get_line(P)) of
"\n" ->
Default;
L ->
L
end.
+%% If the standard input is set to binary mode
+%% convert it to a list so we can properly match.
+line_string(Binary) when is_binary(Binary) -> unicode:characters_to_list(Binary);
+line_string(Other) -> Other.
+
mfa_string(Fun) when is_function(Fun) ->
{module,M} = erlang:fun_info(Fun, module),
{name,F} = erlang:fun_info(Fun, name),
@@ -450,7 +455,7 @@ m() ->
foreach(fun ({Mod,File}) -> mformat(Mod, File) end, sort(code:all_loaded())).
mformat(A1, A2) ->
- format("~-20s ~s\n", [A1,A2]).
+ format("~-20s ~ts\n", [A1,A2]).
%% erlangrc(Home)
%% Try to run a ".erlang" file, first in the current directory
@@ -716,7 +721,7 @@ ls(Dir) ->
{error, enotdir} ->
ls_print([Dir]);
{error, Error} ->
- format("~s\n", [file:format_error(Error)])
+ format("~ts\n", [file:format_error(Error)])
end.
ls_print([]) -> ok;
diff --git a/lib/stdlib/src/erl_lint.erl b/lib/stdlib/src/erl_lint.erl
index cf01e1f8cf..f0d50df4c7 100644
--- a/lib/stdlib/src/erl_lint.erl
+++ b/lib/stdlib/src/erl_lint.erl
@@ -844,8 +844,9 @@ behaviour_callbacks(Line, B, St0) ->
{[], St1}
end.
-behaviour_missing_callbacks([{{Line,B},Bfs}|T], #lint{exports=Exp}=St0) ->
- Missing = ordsets:subtract(ordsets:from_list(Bfs), gb_sets:to_list(Exp)),
+behaviour_missing_callbacks([{{Line,B},Bfs}|T], St0) ->
+ Exports = gb_sets:to_list(exports(St0)),
+ Missing = ordsets:subtract(ordsets:from_list(Bfs), Exports),
St = foldl(fun (F, S0) ->
add_warning(Line, {undefined_behaviour_func,F,B}, S0)
end, St0, Missing),
@@ -1149,6 +1150,14 @@ export_type(Line, ETs, #lint{usage = Usage, exp_types = ETs0} = St0) ->
add_error(Line, {bad_export_type, ETs}, St0)
end.
+-spec exports(lint_state()) -> gb_set().
+
+exports(#lint{compile = Opts, defined = Defs, exports = Es}) ->
+ case lists:member(export_all, Opts) of
+ true -> Defs;
+ false -> Es
+ end.
+
-type import() :: {module(), [fa()]} | module().
-spec import(line(), import(), lint_state()) -> lint_state().
diff --git a/lib/stdlib/src/orddict.erl b/lib/stdlib/src/orddict.erl
index da60fc1bb6..c98d78b34d 100644
--- a/lib/stdlib/src/orddict.erl
+++ b/lib/stdlib/src/orddict.erl
@@ -56,8 +56,10 @@ to_list(Dict) -> Dict.
List :: [{Key :: term(), Value :: term()}],
Orddict :: orddict().
+from_list([]) -> [];
+from_list([{_,_}]=Pair) -> Pair;
from_list(Pairs) ->
- lists:foldl(fun ({K,V}, D) -> store(K, V, D) end, [], Pairs).
+ lists:ukeysort(1, reverse_pairs(Pairs, [])).
-spec size(Orddict) -> non_neg_integer() when
Orddict :: orddict().
@@ -235,3 +237,7 @@ merge(F, [{K1,V1}|D1], [{_K2,V2}|D2]) -> %K1 == K2
[{K1,F(K1, V1, V2)}|merge(F, D1, D2)];
merge(F, [], D2) when is_function(F, 3) -> D2;
merge(F, D1, []) when is_function(F, 3) -> D1.
+
+reverse_pairs([{_,_}=H|T], Acc) ->
+ reverse_pairs(T, [H|Acc]);
+reverse_pairs([], Acc) -> Acc.
diff --git a/lib/stdlib/test/erl_lint_SUITE.erl b/lib/stdlib/test/erl_lint_SUITE.erl
index a71d7f3018..6e9a9dd7bf 100644
--- a/lib/stdlib/test/erl_lint_SUITE.erl
+++ b/lib/stdlib/test/erl_lint_SUITE.erl
@@ -2859,7 +2859,15 @@ behaviour_basic(Config) when is_list(Config) ->
stop(_) -> ok.
">>,
[],
- []}
+ []},
+
+ {behaviour4,
+ <<"-behavior(application). %% Test callbacks with export_all
+ -compile(export_all).
+ stop(_) -> ok.
+ ">>,
+ [],
+ {warnings,[{1,erl_lint,{undefined_behaviour_func,{start,2},application}}]}}
],
?line [] = run(Config, Ts),
ok.
diff --git a/lib/stdlib/test/shell_SUITE.erl b/lib/stdlib/test/shell_SUITE.erl
index 233ba0764f..692dfe0faa 100644
--- a/lib/stdlib/test/shell_SUITE.erl
+++ b/lib/stdlib/test/shell_SUITE.erl
@@ -146,7 +146,7 @@ start_restricted_from_shell(Config) when is_list(Config) ->
"test_restricted) end.">>),
?line {ok, test_restricted} =
application:get_env(stdlib, restricted_shell),
- ?line "Module" ++ _ = t(<<"begin m() end.">>),
+ ?line "Module" ++ _ = t({<<"begin m() end.">>, utf8}),
?line "exception exit: restricted shell does not allow c(foo)" =
comm_err(<<"begin c(foo) end.">>),
?line "exception exit: restricted shell does not allow init:stop()" =
@@ -225,7 +225,7 @@ start_restricted_on_command_line(Config) when is_list(Config) ->
?line {ok,Node2} = start_node(shell_suite_helper_2,
"-pa "++?config(priv_dir,Config)++
" -stdlib restricted_shell test_restricted2"),
- ?line "Module" ++ _ = t({Node2,<<"begin m() end.">>}),
+ ?line "Module" ++ _ = t({Node2,<<"begin m() end.">>, utf8}),
?line "exception exit: restricted shell does not allow c(foo)" =
comm_err({Node2,<<"begin c(foo) end.">>}),
?line "exception exit: restricted shell does not allow init:stop()" =
@@ -2927,14 +2927,14 @@ t1(Parent, {Bin,Enc}, F) ->
server_loop(S)
catch exit:R -> Parent ! {self(), R};
throw:{?MODULE,LoopReply,latin1} ->
- L0 = binary_to_list(list_to_binary(LoopReply)),
- [$\n | L1] = lists:dropwhile(fun(X) -> X =/= $\n end, L0),
- Parent ! {self(), dotify(L1)};
+ L0 = binary_to_list(list_to_binary(LoopReply)),
+ [$\n | L1] = lists:dropwhile(fun(X) -> X =/= $\n end, L0),
+ Parent ! {self(), dotify(L1)};
throw:{?MODULE,LoopReply,_Uni} ->
- Tmp = unicode:characters_to_binary(LoopReply),
- L0 = unicode:characters_to_list(Tmp),
- [$\n | L1] = lists:dropwhile(fun(X) -> X =/= $\n end, L0),
- Parent ! {self(), dotify(L1)}
+ Tmp = unicode:characters_to_binary(LoopReply),
+ L0 = unicode:characters_to_list(Tmp),
+ [$\n | L1] = lists:dropwhile(fun(X) -> X =/= $\n end, L0),
+ Parent ! {self(), dotify(L1)}
after group_leader(S#state.leader, self())
end.
diff --git a/lib/syntax_tools/doc/src/notes.xml b/lib/syntax_tools/doc/src/notes.xml
index 4b3d578c78..a9d3f68d1d 100644
--- a/lib/syntax_tools/doc/src/notes.xml
+++ b/lib/syntax_tools/doc/src/notes.xml
@@ -31,6 +31,38 @@
<p>This document describes the changes made to the Syntax_Tools
application.</p>
+<section><title>Syntax_Tools 1.6.13</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ In syntax_tools-1.6.12 (OTP R16B03) a bug was introduced
+ which broke reverting of local implicit funs. Implicit
+ funs were mistakenly thought to be using abstract terms
+ for their name and arity. This has now been corrected.
+ (Thanks to Anthony Ramine)</p>
+ <p>
+ Own Id: OTP-11576</p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> The default encoding of Erlang files has been changed
+ from ISO-8859-1 to UTF-8. </p> <p> The encoding of XML
+ files has also been changed to UTF-8. </p>
+ <p>
+ Own Id: OTP-10907</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Syntax_Tools 1.6.12</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/syntax_tools/src/erl_syntax.erl b/lib/syntax_tools/src/erl_syntax.erl
index 5911502960..4f7f9e83ac 100644
--- a/lib/syntax_tools/src/erl_syntax.erl
+++ b/lib/syntax_tools/src/erl_syntax.erl
@@ -512,7 +512,7 @@
%% @see macro/2
%% @see match_expr/2
%% @see module_qualifier/2
-%% @see named_fun_expr/1
+%% @see named_fun_expr/2
%% @see nil/0
%% @see operator/1
%% @see parentheses/1
@@ -5493,7 +5493,13 @@ revert_implicit_fun(Node) ->
arity_qualifier ->
F = arity_qualifier_body(Name),
A = arity_qualifier_argument(Name),
- {'fun', Pos, {function, F, A}};
+ case {type(F), type(A)} of
+ {atom, integer} ->
+ {'fun', Pos,
+ {function, concrete(F), concrete(A)}};
+ _ ->
+ Node
+ end;
module_qualifier ->
M = module_qualifier_argument(Name),
Name1 = module_qualifier_body(Name),
@@ -5693,7 +5699,7 @@ named_fun_expr_name(Node) ->
%% =====================================================================
%% @doc Returns the list of clause subtrees of a `named_fun_expr' node.
%%
-%% @see named_fun_expr/1
+%% @see named_fun_expr/2
-spec named_fun_expr_clauses(syntaxTree()) -> [syntaxTree()].
@@ -5716,7 +5722,7 @@ named_fun_expr_clauses(Node) ->
%% syntax tree `C' of type `clause' such that
%% `clause_patterns(C)' is a nonempty list.
%%
-%% @see named_fun_expr/1
+%% @see named_fun_expr/2
%% @see named_fun_expr_clauses/1
%% @see clause/3
%% @see clause_patterns/1
diff --git a/lib/syntax_tools/src/erl_tidy.erl b/lib/syntax_tools/src/erl_tidy.erl
index 0c149634f6..7444d8dc67 100644
--- a/lib/syntax_tools/src/erl_tidy.erl
+++ b/lib/syntax_tools/src/erl_tidy.erl
@@ -269,6 +269,13 @@ file(Name) ->
%% is typically most useful if the `verbose' flag is enabled, to
%% generate reports about the program files without affecting
%% them. The default value is `false'.</dd>
+%%
+%% <dt>{stdout, boolean()}</dt>
+%%
+%% <dd>If the value is `true', instead of the file being written
+%% to disk it will be printed to stdout. The default value is
+%% `false'.</dd>
+%%
%% </dl>
%%
%% See the function `module/2' for further options.
@@ -309,9 +316,15 @@ file_2(Name, Opts) ->
true ->
ok;
false ->
- write_module(Tree, Name, Opts1),
- ok
- end.
+ case proplists:get_bool(stdout, Opts1) of
+ true ->
+ print_module(Tree, Opts1),
+ ok;
+ false ->
+ write_module(Tree, Name, Opts1),
+ ok
+ end
+ end.
read_module(Name, Opts) ->
verbose("reading module `~ts'.", [filename(Name)], Opts),
@@ -399,6 +412,10 @@ write_module(Tree, Name, Opts) ->
throw(R)
end.
+print_module(Tree, Opts) ->
+ Printer = proplists:get_value(printer, Opts),
+ io:format(Printer(Tree, Opts)).
+
output(FD, Printer, Tree, Opts) ->
io:put_chars(FD, Printer(Tree, Opts)),
io:nl(FD).
diff --git a/lib/syntax_tools/test/syntax_tools_SUITE.erl b/lib/syntax_tools/test/syntax_tools_SUITE.erl
index fd381f0b25..b673b70a95 100644
--- a/lib/syntax_tools/test/syntax_tools_SUITE.erl
+++ b/lib/syntax_tools/test/syntax_tools_SUITE.erl
@@ -24,12 +24,12 @@
init_per_group/2,end_per_group/2]).
%% Test cases
--export([smoke_test/1]).
+-export([smoke_test/1,revert/1]).
suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
- [smoke_test].
+ [smoke_test,revert].
groups() ->
[].
@@ -73,12 +73,37 @@ print_error_markers(F, File) ->
case erl_syntax:type(F) of
error_marker ->
{L,M,Info} = erl_syntax:error_marker_info(F),
- io:format("~s:~p: ~s", [File,L,M:format_error(Info)]);
+ io:format("~ts:~p: ~s", [File,L,M:format_error(Info)]);
_ ->
ok
end.
+%% Read with erl_parse, wrap and revert with erl_syntax and check for equality.
+revert(Config) when is_list(Config) ->
+ Dog = ?t:timetrap(?t:minutes(12)),
+ Wc = filename:join([code:lib_dir("stdlib"),"src","*.erl"]),
+ Fs = filelib:wildcard(Wc),
+ Path = [filename:join(code:lib_dir(stdlib), "include"),
+ filename:join(code:lib_dir(kernel), "include")],
+ io:format("~p files\n", [length(Fs)]),
+ case p_run(fun (File) -> revert_file(File, Path) end, Fs) of
+ 0 -> ok;
+ N -> ?line ?t:fail({N,errors})
+ end,
+ ?line ?t:timetrap_cancel(Dog).
+
+revert_file(File, Path) ->
+ case epp:parse_file(File, Path, []) of
+ {ok,Fs0} ->
+ Fs1 = erl_syntax:form_list(Fs0),
+ Fs2 = erl_syntax_lib:map(fun (Node) -> Node end, Fs1),
+ Fs3 = erl_syntax:form_list_elements(Fs2),
+ Fs4 = [ erl_syntax:revert(Form) || Form <- Fs3 ],
+ {ok,_} = compile:forms(Fs4, [report,strong_validation]),
+ ok
+ end.
+
p_run(Test, List) ->
N = erlang:system_info(schedulers),
p_run_loop(Test, List, N, [], 0).
diff --git a/lib/syntax_tools/vsn.mk b/lib/syntax_tools/vsn.mk
index 6cafc4dd55..26153a55f1 100644
--- a/lib/syntax_tools/vsn.mk
+++ b/lib/syntax_tools/vsn.mk
@@ -1 +1 @@
-SYNTAX_TOOLS_VSN = 1.6.12
+SYNTAX_TOOLS_VSN = 1.6.13
diff --git a/lib/test_server/src/configure.in b/lib/test_server/src/configure.in
index 3815027721..067663feb4 100644
--- a/lib/test_server/src/configure.in
+++ b/lib/test_server/src/configure.in
@@ -38,6 +38,35 @@ AC_ARG_ENABLE(debug-mode,
*) CFLAGS=$DEBUG_FLAGS ;;
esac ], )
+AC_ARG_ENABLE(m64-build,
+AS_HELP_STRING([--enable-m64-build],
+ [build 64-bit binaries using the -m64 flag to (g)cc]),
+[ case "$enableval" in
+ no) enable_m64_build=no ;;
+ *) enable_m64_build=yes ;;
+ esac
+],enable_m64_build=no)
+
+AC_ARG_ENABLE(m32-build,
+AS_HELP_STRING([--enable-m32-build],
+ [build 32-bit binaries using the -m32 flag to (g)cc]),
+[ case "$enableval" in
+ no) enable_m32_build=no ;;
+ *) enable_m32_build=yes ;;
+ esac
+],enable_m32_build=no)
+
+no_mXX_LDFLAGS="$LDFLAGS"
+
+if test X${enable_m64_build} = Xyes; then
+ CFLAGS="-m64 $CFLAGS"
+ LDFLAGS="-m64 $LDFLAGS"
+fi
+if test X${enable_m32_build} = Xyes; then
+ CFLAGS="-m32 $CFLAGS"
+ LDFLAGS="-m32 $LDFLAGS"
+fi
+
AC_CHECK_LIB(m, sin)
#--------------------------------------------------------------------
@@ -132,6 +161,12 @@ case $system in
AC_CHECK_HEADER(dld.h, [
SHLIB_LD="ld"
SHLIB_LDFLAGS="-shared"])
+ if test X${enable_m64_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 64-bit dynamic drivers)
+ fi
+ if test X${enable_m32_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 32-bit dynamic drivers)
+ fi
fi
SHLIB_EXTRACT_ALL=""
;;
@@ -142,11 +177,17 @@ case $system in
SHLIB_LD="ld"
SHLIB_LDFLAGS="$LDFLAGS -Bshareable -x"
SHLIB_SUFFIX=".so"
+ if test X${enable_m64_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 64-bit dynamic drivers)
+ fi
+ if test X${enable_m32_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 32-bit dynamic drivers)
+ fi
], [
# No dynamic loading.
SHLIB_CFLAGS=""
SHLIB_LD="ld"
- SHLIB_LDFLAGS="$LDFLAGS"
+ SHLIB_LDFLAGS=""
SHLIB_SUFFIX=""
AC_MSG_ERROR(don't know how to compile and link dynamic drivers)
])
@@ -155,7 +196,13 @@ case $system in
*-solaris2*|*-sysv4*)
SHLIB_CFLAGS="-KPIC"
SHLIB_LD="/usr/ccs/bin/ld"
- SHLIB_LDFLAGS="$LDFLAGS -G -z text"
+ SHLIB_LDFLAGS="$no_mXX_LDFLAGS -G -z text"
+ if test X${enable_m64_build} = Xyes; then
+ SHLIB_LDFLAGS="-64 $SHLIB_LDFLAGS"
+ fi
+ if test X${enable_m32_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 32-bit dynamic drivers)
+ fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL="-z allextract"
;;
@@ -170,6 +217,12 @@ case $system in
SHLIB_CFLAGS="-fPIC"
SHLIB_LD="ld"
SHLIB_LDFLAGS="$LDFLAGS -shared"
+ if test X${enable_m64_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 64-bit dynamic drivers)
+ fi
+ if test X${enable_m32_build} = Xyes; then
+ AC_MSG_ERROR(don't know how to link 32-bit dynamic drivers)
+ fi
SHLIB_SUFFIX=".so"
SHLIB_EXTRACT_ALL=""
;;
diff --git a/lib/test_server/src/test_server_ctrl.erl b/lib/test_server/src/test_server_ctrl.erl
index 352e58f91c..e24d6ceacb 100644
--- a/lib/test_server/src/test_server_ctrl.erl
+++ b/lib/test_server/src/test_server_ctrl.erl
@@ -4840,7 +4840,7 @@ start_node(Name, Type, Options) ->
case controller_call({start_node,Name,Type,Options}, T) of
{{ok,Nodename}, Host, Cmd, Info, Warning} ->
format(minor,
- "Successfully started node ~w on ~tp with command: ~tp",
+ "Successfully started node ~w on ~tp with command: ~ts",
[Nodename, Host, Cmd]),
format(major, "=node_start ~w", [Nodename]),
case Info of
@@ -4856,7 +4856,7 @@ start_node(Name, Type, Options) ->
{ok, Nodename};
{fail,{Ret, Host, Cmd}} ->
format(minor,
- "Failed to start node ~tp on ~tp with command: ~tp~n"
+ "Failed to start node ~tp on ~tp with command: ~ts~n"
"Reason: ~p",
[Name, Host, Cmd, Ret]),
{fail,Ret};
@@ -4865,7 +4865,7 @@ start_node(Name, Type, Options) ->
Ret;
{Ret, Host, Cmd} ->
format(minor,
- "Failed to start node ~tp on ~tp with command: ~tp~n"
+ "Failed to start node ~tp on ~tp with command: ~ts~n"
"Reason: ~p",
[Name, Host, Cmd, Ret]),
Ret
diff --git a/lib/test_server/src/ts_install.erl b/lib/test_server/src/ts_install.erl
index e9e559df5d..bc62015ac3 100644
--- a/lib/test_server/src/ts_install.erl
+++ b/lib/test_server/src/ts_install.erl
@@ -112,6 +112,12 @@ get_vars([], name, [], Result) ->
get_vars(_, _, _, _) ->
{error, fatal_bad_conf_vars}.
+config_flags() ->
+ case os:getenv("CONFIG_FLAGS") of
+ false -> [];
+ CF -> string:tokens(CF, " \t\n")
+ end.
+
unix_autoconf(XConf) ->
Configure = filename:absname("configure"),
Flags = proplists:get_value(crossflags,XConf,[]),
@@ -122,11 +128,14 @@ unix_autoconf(XConf) ->
erlang:system_info(threads) /= false],
Debug = [" --enable-debug-mode" ||
string:str(erlang:system_info(system_version),"debug") > 0],
- Args = Host ++ Build ++ Threads ++ Debug,
+ MXX_Build = [Y || Y <- config_flags(),
+ Y == "--enable-m64-build"
+ orelse Y == "--enable-m32-build"],
+ Args = Host ++ Build ++ Threads ++ Debug ++ " " ++ MXX_Build,
case filelib:is_file(Configure) of
true ->
OSXEnv = macosx_cflags(),
- io:format("Running ~sEnv: ~p~n",
+ io:format("Running ~s~nEnv: ~p~n",
[lists:flatten(Configure ++ Args),Env++OSXEnv]),
Port = open_port({spawn, lists:flatten(["\"",Configure,"\"",Args])},
[stream, eof, {env,Env++OSXEnv}]),
@@ -135,7 +144,6 @@ unix_autoconf(XConf) ->
{error, no_configure_script}
end.
-
get_xcomp_flag(Flag, Flags) ->
get_xcomp_flag(Flag, Flag, Flags).
get_xcomp_flag(Flag, Tag, Flags) ->
diff --git a/lib/test_server/src/ts_lib.erl b/lib/test_server/src/ts_lib.erl
index 52bb346043..5368960446 100644
--- a/lib/test_server/src/ts_lib.erl
+++ b/lib/test_server/src/ts_lib.erl
@@ -145,16 +145,13 @@ suite_order(sasl) -> 16;
suite_order(tools) -> 18;
suite_order(runtime_tools) -> 19;
suite_order(parsetools) -> 20;
-suite_order(pman) -> 21;
suite_order(debugger) -> 22;
-suite_order(toolbar) -> 23;
suite_order(ic) -> 24;
suite_order(orber) -> 26;
suite_order(inets) -> 28;
suite_order(asn1) -> 30;
suite_order(os_mon) -> 32;
suite_order(snmp) -> 38;
-suite_order(mnesia_session) -> 42;
suite_order(mnesia) -> 44;
suite_order(system) -> 999; %% IMPORTANT: system SHOULD always be last!
suite_order(_) -> 200.
@@ -167,7 +164,7 @@ subst_file(In, Out, Vars) ->
case file:read_file(In) of
{ok, Bin} ->
Subst = subst(b2s(Bin), Vars, []),
- case file:write_file(Out, Subst) of
+ case file:write_file(Out, unicode:characters_to_binary(Subst)) of
ok ->
ok;
{error, Reason} ->
diff --git a/lib/test_server/src/ts_make.erl b/lib/test_server/src/ts_make.erl
index f3266f5836..8727f7ebfe 100644
--- a/lib/test_server/src/ts_make.erl
+++ b/lib/test_server/src/ts_make.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
+%% Copyright Ericsson AB 1997-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -67,7 +67,7 @@ get_port_data(Port, Last0, Complete0) ->
end.
update_last([C|Rest], Line, true) ->
- io:put_chars(Line),
+ io:put_chars(list_to_binary(Line)), %% Utf-8 list to utf-8 binary
io:nl(),
update_last([C|Rest], [], false);
update_last([$\r|Rest], Result, Complete) ->
@@ -79,7 +79,7 @@ update_last([C|Rest], Result, Complete) ->
update_last([], Result, Complete) ->
{Result, Complete};
update_last(eof, Result, _) ->
- Result.
+ unicode:characters_to_list(list_to_binary(Result)).
run_make_script({win32, _}, Make, Dir, Makefile) ->
{"run_make.bat",
diff --git a/lib/test_server/src/ts_run.erl b/lib/test_server/src/ts_run.erl
index 60c9a7a4b7..d96abfc55a 100644
--- a/lib/test_server/src/ts_run.erl
+++ b/lib/test_server/src/ts_run.erl
@@ -224,7 +224,7 @@ make_command(Vars, Spec, State) ->
CrashFile = filename:join(Cwd,State#state.file ++ "_erl_crash.dump"),
case filelib:is_file(CrashFile) of
true ->
- io:format("ts_run: Deleting dump: ~s\n",[CrashFile]),
+ io:format("ts_run: Deleting dump: ~ts\n",[CrashFile]),
file:delete(CrashFile);
false ->
ok
@@ -258,8 +258,8 @@ make_command(Vars, Spec, State) ->
run_batch(Vars, _Spec, State) ->
process_flag(trap_exit, true),
Command = State#state.command ++ " -noinput -s erlang halt",
- ts_lib:progress(Vars, 1, "Command: ~s~n", [Command]),
- io:format(user, "Command: ~s~n",[Command]),
+ ts_lib:progress(Vars, 1, "Command: ~ts~n", [Command]),
+ io:format(user, "Command: ~ts~n",[Command]),
Port = open_port({spawn, Command}, [stream, in, eof]),
Timeout = 30000 * case os:getenv("TS_RUN_VALGRIND") of
false -> 1;
diff --git a/lib/toolbar/AUTHORS b/lib/toolbar/AUTHORS
deleted file mode 100644
index c5a649d938..0000000000
--- a/lib/toolbar/AUTHORS
+++ /dev/null
@@ -1,3 +0,0 @@
-Original Authors and Contributors:
-
-Gunilla Arendt \ No newline at end of file
diff --git a/lib/toolbar/Makefile b/lib/toolbar/Makefile
deleted file mode 100644
index 5326457976..0000000000
--- a/lib/toolbar/Makefile
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2009. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-SUB_DIRECTORIES = src doc/src
-
-include vsn.mk
-VSN = $(TOOLBAR_VSN)
-
-SPECIAL_TARGETS =
-
-# ----------------------------------------------------
-# Default Subdir Targets
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_subdir.mk
diff --git a/lib/toolbar/doc/html/.gitignore b/lib/toolbar/doc/html/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/toolbar/doc/html/.gitignore
+++ /dev/null
diff --git a/lib/toolbar/doc/man3/.gitignore b/lib/toolbar/doc/man3/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/toolbar/doc/man3/.gitignore
+++ /dev/null
diff --git a/lib/toolbar/doc/pdf/.gitignore b/lib/toolbar/doc/pdf/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/toolbar/doc/pdf/.gitignore
+++ /dev/null
diff --git a/lib/toolbar/doc/src/Makefile b/lib/toolbar/doc/src/Makefile
deleted file mode 100644
index 2239421556..0000000000
--- a/lib/toolbar/doc/src/Makefile
+++ /dev/null
@@ -1,115 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../../vsn.mk
-VSN=$(TOOLBAR_VSN)
-APPLICATION=toolbar
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
-
-# ----------------------------------------------------
-# Target Specs
-# ----------------------------------------------------
-XML_APPLICATION_FILES = ref_man.xml
-XML_REF3_FILES = toolbar.xml
-
-XML_PART_FILES = part.xml part_notes.xml
-XML_CHAPTER_FILES = toolbar_chapter.xml notes.xml
-
-BOOK_FILES = book.xml
-
-XML_FILES = \
- $(BOOK_FILES) $(XML_CHAPTER_FILES) \
- $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES)
-
-GIF_FILES = \
- bar.gif \
- create_tool.gif \
- note.gif
-
-# ----------------------------------------------------
-
-HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
-
-INFO_FILE = ../../info
-
-MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
-
-HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
-
-TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-XML_FLAGS +=
-DVIPS_FLAGS +=
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-$(HTMLDIR)/%.gif: %.gif
- $(INSTALL_DATA) $< $@
-
-docs: pdf html man
-
-$(TOP_PDF_FILE): $(XML_FILES)
-
-pdf: $(TOP_PDF_FILE)
-
-html: gifs $(HTML_REF_MAN_FILE)
-
-man: $(MAN3_FILES)
-
-gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
-
-debug opt:
-
-clean clean_docs:
- rm -rf $(HTMLDIR)/*
- rm -f $(MAN3DIR)/*
- rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
- rm -f errs core *~
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_docs_spec: docs
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DATA) $(TOP_PDF_FILE) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(HTMLDIR)/* \
- "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(INFO_FILE) "$(RELSYSDIR)"
- $(INSTALL_DIR) "$(RELEASE_PATH)/man/man3"
- $(INSTALL_DATA) $(MAN3DIR)/* "$(RELEASE_PATH)/man/man3"
-
-release_spec:
-
diff --git a/lib/toolbar/doc/src/bar.gif b/lib/toolbar/doc/src/bar.gif
deleted file mode 100644
index c249d891dd..0000000000
--- a/lib/toolbar/doc/src/bar.gif
+++ /dev/null
Binary files differ
diff --git a/lib/toolbar/doc/src/bar.ps b/lib/toolbar/doc/src/bar.ps
deleted file mode 100644
index 850ebdbee5..0000000000
--- a/lib/toolbar/doc/src/bar.ps
+++ /dev/null
@@ -1,846 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: /home/kent/otp/toolbar/doc/bar.ps
-%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
-%%BoundingBox: 165 346 447 446
-%%Pages: 1
-%%DocumentFonts:
-%%EndComments
-%%EndProlog
-
-%%Page: 1 1
-
-% remember original state
-/origstate save def
-
-% build a temporary dictionary
-20 dict begin
-
-% define string to hold a scanline's worth of data
-/pix 282 string def
-
-% define space for color conversions
-/grays 282 string def % space for gray scale line
-/npixls 0 def
-/rgbindx 0 def
-
-% lower left corner
-165 346 translate
-
-% size of image (on paper, in 1/72inch coords)
-282.02400 100.00800 scale
-
-282 100 8 % dimensions of data
-[282 0 0 -100 0 100] % mapping matrix
-{currentfile pix readhexstring pop}
-image
-
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c000
-c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffff7300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-14141414141414141414141414141414141414141414141414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-14141414141414141414141414141414141414141414141414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffffffffffffffffffffffffffffff00ffffffffffffffffffffff
-ffffffff001414ffffffffffffffffffffffffffffff001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c0c0c0c0c0c0c0c0c0
-c0c0c073001414ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141457575757571414141414141457141414141414ffffffffffff1414
-14141414ffff1414141414141414141414141414141414141414141414141414ffffffff
-ffffffff1414141414141414141414141414ffff14141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c00000000000000000
-00c0c073001414ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414575757575714141414145714141414141414ffff141414141414
-14141414ffff1414141414141414141414141414141414141414141414141414141414ff
-ff1414141414141414141414141414141414ffff14141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c00000000000000000
-00c0c073001414ffc0c0c00000c0c0c0c00000c0c073001414c0c0c07300
-c0ffc0c0c01414141414145757575757141414571414141414141414ffff1414141414ff
-ff14ffffffff1414ffffffff1414ffff14ffff141414ffff14ffff1414141414141414ff
-ff14141414ffffffff141414ffffffff1414ffff1414ffffffff14141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c0c00000c0c00000c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141457575757571457141414141414141414ffff1414141414ff
-ffffffffffff14ffff1414ffff14ffffff14ffff14ffff14ffffff1414141414141414ff
-ff141414ffff1414ffff14ffff1414ffff14ffff14ffff1414ffff141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c0c0c000000000c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414575757145714141414141414141414ffffffffffff14ff
-ffff1414ffff1414141414ffff14ffff1414ffff14ffff1414ffff1414141414141414ff
-ff141414ffff1414ffff14ffff1414ffff14ffff14ffffff141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c0c0c0c00000c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414145714575757141414141414141414ffff1414141414ff
-ff141414ffff1414ffffffffff14ffff1414ffff14ffff1414ffff1414141414141414ff
-ff141414ffff1414ffff14ffff1414ffff14ffff141414ffffff14141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c0c0c000000000c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414571457575757571414141414141414ffff1414141414ff
-ff141414ffff14ffff1414ffff14ffff1414ffff14ffff1414ffff1414141414141414ff
-ff141414ffff1414ffff14ffff1414ffff14ffff14141414ffffff141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c0c00000c0c00000c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141457141414575757575714141414141414ffff1414141414ff
-ff141414ffff14ffff1414ffff14ffff1414ffff14ffff14ffffff1414141414141414ff
-ff141414ffff1414ffff14ffff1414ffff14ffff14ffff1414ffff141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0000000000000c0c0c0c07300ffc0c000c0c0c0c0c0c0c0
-00c0c073001414ffc0c0c00000c0c0c0c00000c0c073001414c0c0c07300
-c0ffc0c0c01414141414145714141414145757575757141414141414ffffffffffff14ff
-ff141414ffff1414ffffff14ffffffff1414ffff1414ffff14ffff1414141414141414ff
-ff14141414ffffffff141414ffffffff1414ffff1414ffffffff14141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0000000000000c0c0c0c07300ffc0c00000000000000000
-00c0c073001414ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c014141414145714141414141414575757575714141414141414141414141414
-14141414141414141414141414141414141414141414141414ffff141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ffc0c0c0c0c0c0c0c0c0c0c0c0c07300ffc0c0c0c0c0c0c0c0c0c0
-c0c0c073001414ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414ffff1414ffff141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414ff737373737373737373737373737300ff73737373737373737373
-73737373001414ff7373737373737373737373737373001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-14141414141414141414141414141414141414141414ffffffff14141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414000000000000000000000000000000000000000000000000000000
-00000000001414000000000000000000000000000000001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-14141414141414141414141414141414141414141414141414c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffc0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff82c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d90000000000d9d9d9d9d900d9d9d9d9000000d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9000000d9d9d9d9d9d900d9d9d9d90000
-00d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9000000d9d9d9d9000000d9d9d9d9d9d9
-00d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-000000d9d9d9d9d9d900d9d9d900d90000d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d900d9d9
-d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-00d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900
-d9d9d900d9d9d9d9d900d9d9d90000d9d900d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900000000d9d9d9d9d9d900d9d9d9d9d9d900d9d9d900d9d9
-d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-00d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d900
-d9d9d900d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d9000000
-0000d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-00d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900
-00000000d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d900d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900
-d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d900d9d9
-d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-00d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900
-d9d9d900d9d9d9d9d900d9d9d90000d9d900d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d9d90000
-00d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9000000d9d9d9d9000000d9d9d9d9d9d9
-00d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-000000d9d9d9d9d9d900d9d9d900d90000d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffff8282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282c0c0c07300
-c0ffc0c0c0ff828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffff57c0c0c07300
-c0ffc0c0c0ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d957c0c0c07300
-c0ffc0c0c0ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d957c0c0c07300
-c0ffc0c0c0ffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9dbbdd0dbd9d9d9d9d9d9d9dec7a9ded9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d7d7d7474747474747474727272747474747474747474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d95757bebebebe
-bebebebebebebebebebebebebebebebebebebebebe5757d957c0c0c07300
-c0ffc0c0c0ffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9dcd0a9dadad9dbdbd9d9dcd0a9d0dcd9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d7d747474747472727272727272727272747474747474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9575757bebebe
-bebebebebebebebebebebebebebebebebebebebe575757d957c0c0c07300
-c0ffc0c0c0ffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9dad0c3bdb3dadcd4d5dbdbc7b3d0e1d5d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebe000000000000000000bebebebebebebebebebed9ffff
-d9d9bebebebebed7d7d7bebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d74747474727272727272727272777777727274747474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9be575757bebe
-bebebebebebebebebebebebebebebebebebebe57575757d957c0c0c07300
-c0ffc0c0c0ffd9d9bebebe000000000000000000000000000000000000007dbebebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9dcc79ce1bda9bd6f60a9bdbddbe5a9a9d0dad5d4d4d4d9
-ffffd9d9bebebebebebebebebebe007f7f7f7f7f7f7f00bebebebebebebebebebed9ffff
-d9d9bebebebed7d7d7d7d7bebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d747474727272727272727277779e769e777772727474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9bebe575757be
-bebebebebebebebebebebebebebebebebebe57575757bed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9dbd083bde5bd8f536f9cc3dedea96fa9bddcd5d4d4d4d9
-ffffd9d9bebebebebebebebebebe007f7f7f7f7f7f7f00bebebebebebebebebebed9ffff
-d9d9bebebed7d7d7d7d7d7d7bebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebe000000000000000000000000000000000000000000bebebebed9ffffd9d97d7d
-7d747472727272727272727777779e9e7695897777727274747474d9ffffd9d9bebebebe
-000000000000bebebebebebebebebe000000000000bebebebed9ffffd9d9bebebe575757
-bebebebebe00000000000000bebebebebe57575757bebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00000000000000000000000000000000007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9e1b379ded6831f6083d0e58379deded9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebe000000000000000000bebebebebebebebebebed9ffff
-d9d9bebebed7d7d7d7d7d7d7bebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7d7472727272727272727777779e9e7697a6829e77777272747474d9ffffd9d9bebebebe
-002727272700bebebebebebebebebe005757575700bebebebed9ffffd9d9bebebebe5757
-57bebebe0000ffffffffff000000bebe57575757bebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9dcd03cc3d948531f3cdcda60c3ded9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebe00bebebebebebebebebebebebebebed9ffff
-d9d9bebebed7d7d7d7d7d7d7bebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7474727272727272727777777789899d00008d899e777272727474d9ffffd9d9bebebebe
-002727272700bebebebebebebebebe005757575700bebebebed9ffffd9d9bebebebebe57
-5757be0000ffffffffffffffff00be57575757bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d0027ffff2727ff2727ffff2727ffff27007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9d9ea79a99c489c3c11a99c83e5d9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebe00bebebebebebebebebebebebebebed9ffff
-d9d9bebebebed7d7d7d7d7bebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7472727272727272777777897f8d7f7f40007f9782827772727274d9ffffd9d9bebebebe
-002727272700bebebebebebebebebe005757575700bebebebed9ffffd9d9bebebebebebe
-57575700ffffffffffffffffffff57575757bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9d9e1a9606f1f532a116f48bdded9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebe00000000000000000000000000000000bebebebebebebed9ffff
-d9d9bebebebebed7d7d7bebebebebebebebebebebebed7d7d7bebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7272727272727277779e9e897f005600000000007f959e72727274d9ffffd9d9bebebebe
-002727272700bebebebebebebebebe005757575700bebebebed9ffffd9d9bebebebebebe
-be575757ffff00ffffffff00ff57575700bebebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d0027ffff2727ff2727ffff2727ffff27007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9d9d9ea9c3648362a1148d0ded9d9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebe00bebebebebebebebebebebebebebe00bebebebebebebed9ffff
-d9d9bebebebebebebe00bebebebebebebebebebebed7d7d7d7d7bebebebebed9ffffd9d9
-bebebebe000000000000000000000000000000000000000000bebebebed9ffffd9d97d74
-727272727272779e9e9e8976970000000000000000009e77727272d9ffffd9d9bebebebe
-000000000000bebebebe0000000000000000000000bebebebed9ffffd9d9bebebebebebe
-0000575757ffff00ffff00ff575757000000bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9dae5a9534883363c1f1fb3dedcd9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebe00bebebebebebebebebebebebebebe00bebebebebebebed9ffff
-d9d9bebebebebebebe00bebebebebebebebebebed7d7d7d7d7d7d7bebebebed9ffffd9d9
-bebebebe00515151510051ffff510051000051005151515100bebebebed9ffffd9d97d72
-727272779e8982828282827d000000000000000000008977727272d9ffffd9d9bebebebe
-007f7f7f7f00bebebebe0027272727007f7f7f7f00bebebebed9ffffd9d9bebebebebebe
-000000575757ffffffffff57575700000000bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d0027ffff2727ff2727ffff2727ffff27007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9e59c36606083603c2a1f5379dbdbd9d9d9d5d4d4d4d9
-ffffd9d9bebe000000000000000000bebebebebebe000000000000000000bebebed9ffff
-d9d9bebebebebebebebe00bebebebebebebebebed7d7d7d7d7d7d7bebebebed9ffffd9d9
-bebebebe005151515100ffffffff0000000000005151515100bebebebed9ffffd9d97d72
-727777779e893197958d8d89000000000000000000008977727272d9ffffd9d9bebebebe
-007f7f7f7f00bebebebe0027272727007f7f7f7f00bebebebed9ffffd9d9bebebebebebe
-00ff0000575757000000575757000000ff00bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9d9e1a953bd79608f8348302ab34879dedad9d9d5d4d4d4d9
-ffffd9d9bebe005757575757575700bebebebebebe007f7f7f7f7f7f7f00bebebed9ffff
-d9d9bebebebebebebebe00bebebebebebebebebed7d7d7d7d7d7d7bebebebed9ffffd9d9
-bebebebe005151515100ffffffff0000000000005151515100bebebebed9ffffd9d97d72
-7777779e9e823800006e7f00000000000000000000008977727272d9ffffd9d9bebebebe
-007f7f7f7f00bebebebe0027272727007f7f7f7f00bebebebed9ffffd9d9bebebebebe00
-ffff00000057575700575757000000ffffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d0027ffff2727ff2727ffff2727ffff27007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9dbdb53b3ea6f798f7930301fd4a92ad0dcd9d9d5d4d4d4d9
-ffffd9d9bebe005757575757575700bebebebebebe007f7f7f7f7f7f7f00bebebed9ffff
-d9d9bebebebebebebebebe00bebebebebebebebebed7d7d7d7d7bebebebebed9ffffd9d9
-bebebebe00515151510051ffff510051000051005151515100bebebebed9ffffd9d97d77
-77778989567f000000000000000000000000000000009e77727272d9ffffd9d9bebebebe
-007f7f7f7f00bebebebe0027272727007f7f7f7f00bebebebed9ffffd9d9bebebebebe00
-ffffff000000575757575700000000ffffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4d9e1a99cdee58f6f9c6f303c1fb3e560bde1d9d9d5d4d4d4d9
-ffffd9d9bebe000000000000000000bebebebebebe000000000000000000bebebed9ffff
-d9d9bebebebebebebebebe00bebebebebebebebebe00d7d7d7bebebebebebed9ffffd9d9
-bebebebe000000000000000000000000000000000000000000bebebebed9ffffd9d97d9e
-8282768d9500000000000000000000000000000000899e77777272d9ffffd9d9bebebebe
-000000000000000000000000000000000000000000bebebebed9ffffd9d9bebebebebe00
-ffffffff00000057575700000000ffffffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00272727272727272727272727272727007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d4dbd06fd4e19c48608f532a3630bdeaa953d0ded9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebe00bebebebebebebed9ffff
-d9d9bebebebebebebebebebe00bebebebebebebe00bebebebebebebebebebed9ffffd9d9
-bebebebe005151515100510000510051ffff51005151515100bebebebed9ffffd9d97d9e
-8282768d9500000000000000000000000000000000899e77777272d9ffffd9d9bebebebe
-005757575700d7d7d7d7005757575700ffffffff00bebebebed9ffffd9d9bebebebebe00
-ffffffffff0057575757570000ffffffffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d00000000000000000000000000000000007d007dbebebebe
-bed9ffffd9d9d4d4d4d4d5de6f79ea9c112a606f6f3c11116fc7ea606fdad9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebe00bebebebebebebed9ffff
-d9d9bebebebebebebebebebe00bebebebebebe00bebebebebebebebebebebed9ffffd9d9
-bebebebe0051515151000000000000ffffffff005151515100bebebebed9ffffd9d97d77
-77778989567f000000000000000000000000000000009e77727272d9ffffd9d9bebebebe
-005757575700d7d7d7d7005757575700ffffffff00bebebebed9ffffd9d9bebebebebe00
-ffff00ffffff575700575757ffffff00ffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebe007d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d007dbebebebe
-bed9ffffd9d9d4d4d4d4d6d053c7c71f1f3c484848361f034860a9d57983d9d6d4d4d4d9
-ffffd9d9bebebebebebebebebe00000000000000000000000000bebebebebebebed9ffff
-d9d9bebebebebebebebebebebe00bebebebebe00bebebebebebebebebebebed9ffffd9d9
-bebebebe0051515151000000000000ffffffff005151515100bebebebed9ffffd9d97d72
-7777779e9e823800006e7f00000000000000000000008977727272d9ffffd9d9bebebebe
-005757575700d7d7d7d7005757575700ffffffff00bebebebed9ffffd9d9bebebebebe00
-ffff00ffff570057ffff575757ffff00ffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9bebebe000000000000000000000000000000000000007d7d7dbebebe
-bed9ffffd9d9d4d4d4d4d6d0a9da601130363648111f111160303cc7d09cd4d6d4d4d4d9
-ffffd9d9bebebebebebebebebe00bebebebebebebebebebebe00bebebebebebebed9ffff
-d9d9bebebebebebebebebebebe00be7f7f7f00bebebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100510000510051ffff51005151515100bebebebed9ffffd9d97d72
-727777779e893197958d8d89000000000000000000008977727272d9ffffd9d9bebebebe
-005757575700d7d7d7d7005757575700ffffffff00bebebebed9ffffd9d9bebebebebe00
-ffff000057005700ffff005757570000ffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be00000000000000000000000000000000000000000000007dbebebe
-bed9ffffd9d9d4d4d4d4d4d9e5bd111f489c1f2a11030330bd79366fe5dedad5d4d4d4d9
-ffffd9d9bebebebebe000000000000000000bebebe000000000000000000bebebed9ffff
-d9d9bebebebebebebebebebebebe7f7f7f7f7fbebebebebebebebebebebebed9ffffd9d9
-bebebebe000000000000000000000000000000000000000000bebebebed9ffffd9d97d72
-727272779e8982828282827d000000000000000000008977727272d9ffffd9d9bebebebe
-000000000000000000000000000000000000000000bebebebed9ffffd9d9bebebebebebe
-00ffff570057ff0000000000575757ffffff00bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d007dbebe
-bed9ffffd9d9d4d4d4d4d4d9e58f0379d6d653111f11116fead41f83e5dad9d5d4d4d4d9
-ffffd9d9bebebebebe007f7f7f7f7f7f7f00bebebe005757575757575700bebebed9ffff
-d9d9bebebebebebebebebebebe7f7f7f7f7f7f7fbebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d74
-727272727272779e9e9e8976970000000000000000009e77727272d9ffffd9d9bebebebe
-00d7d7d7d700ffffffff007f7f7f7f002727272700bebebebed9ffffd9d9bebebebebebe
-00ff5757570000000000000000575757ff00bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d7d007d007d007d007d007d007d007d007d007d7d007d7dbebe
-bed9ffffd9d9d4d4d4d4d4d9e57903c7e5e5831103032ac3ea8f48d0dcd9d9d5d4d4d4d9
-ffffd9d9bebebebebe007f7f7f7f7f7f7f00bebebe005757575757575700bebebed9ffff
-d9d9bebebebebebebebebebebe7f7f7f7f7f7f7fbebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7272727272727277779e9e897f005600000000007f959e72727274d9ffffd9d9bebebebe
-00d7d7d7d700ffffffff007f7f7f7f002727272700bebebebed9ffffd9d9bebebebebebe
-be57575700000000000000000000575757bebebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d00be00be00be00be00be00be00be00be00be007d007d7dbebe
-bed9ffffd9d9d4d4d4d4d4d9debd2a60dee1d060112a9ceac3368fe5d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebe000000000000000000bebebe000000000000000000bebebed9ffff
-d9d9bebebebebebebebebebebe7f7f7f7f7f7f7fbebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7472727272727272777777897f8d7f7f40007f9782827772727274d9ffffd9d9bebebebe
-00d7d7d7d700ffffffff007f7f7f7f002727272700bebebebed9ffffd9d9bebebebebebe
-57575700ff0000ff0000ff0000ffff575757bebebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d7d007d007d007d007d007d007d007d007d007d7d00007dbebe
-bed9ffffd9d9d4d4d4d4d4d9d9e1c34860d9e5d6a9c3e5c7481fd0ded9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebe7f7f7f7f7fbebebebebebebebebebebebed9ffffd9d9
-bebebebe005151515100515151510051515151005151515100bebebebed9ffffd9d97d7d
-7474727272727272727777777789899d00008d899e777272727474d9ffffd9d9bebebebe
-00d7d7d7d700ffffffff007f7f7f7f002727272700bebebebed9ffffd9d9bebebebebe57
-5757be0000ffffffffffffffffff00be575757bebebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d0000bebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9e1d65360d4e1deded453308fe1d9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebe7f7f7fbebebebebebebebebebebebebed9ffffd9d9
-bebebebe000000000000000000000000000000000000000000bebebebed9ffffd9d97d7d
-7d7472727272727272727777779e9e7697a6829e77777272747474d9ffffd9d9bebebebe
-000000000000000000000000000000000000000000bebebebed9ffffd9d9bebebebe5757
-57bebebe00ffffffffffffff0000bebebe575757bebebed957c0c0c07300
-c0ffc0c0c0ffd9d9be007d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d0000bebe
-bed9ffffd9d9d4d4d4d4d4d9d9d9d9dee13c60d9dbdebd7960d0dcd9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d747472727272727272727777779e9e7695897777727274747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9bebebe575757
-bebebebebe00000000000000bebebebebebe575757bebed957c0c0c07300
-c0ffc0c0c0ffd9d9be0000000000000000000000000000000000000000000000007dbebe
-bed9ffffd9d9d4d4d4d4d4d9d9dadee19c2a8fc7dcd9dcde83bde1d9d9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d747474727272727272727277779e769e777772727474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9bebe575757be
-bebebebebebebebebebebebebebebebebebebe575757bed957c0c0c07300
-c0ffc0c0c0ffd9d9bebebe7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7d7dbebe
-bed9ffffd9d9d4d4d4d4d4d9dad0bd9c9cb3dedbd9d9d9dbd083c3dcd9d9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d74747474727272727272727272777777727274747474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9be575757bebe
-bebebebebebebebebebebebebebebebebebebebe575757d957c0c0c07300
-c0ffc0c0c0ffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebe
-bed9ffffd9d9d4d4d4d4d4d9dbd09ca9e5e1dad9d9d9d9d9debda9d6dad9d9d5d4d4d4d9
-ffffd9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffff
-d9d9bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9
-bebebebebebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d97d7d
-7d7d7d747474747472727272727272727272747474747474747474d9ffffd9d9bebebebe
-bebebebebebebebebebebebebebebebebebebebebebebebebed9ffffd9d9575757bebebe
-bebebebebebebebebebebebebebebebebebebebebe5757d957c0c0c07300
-c0ffc0c0c0ffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d957c0c0c07300
-c0ffc0c0c057575757575757575757575757575757575757575757575757575757575757
-5757ff575757575757575757575757575757575757575757575757575757575757575757
-ff575757575757575757575757575757575757575757575757575757575757575757ff57
-5757575757575757575757575757575757575757575757575757575757575757ff575757
-575757575757575757575757575757575757575757575757575757575757ff5757575757
-57575757575757575757575757575757575757575757575757575757ff57575757575757
-5757575757575757575757575757575757575757575757575757ff575757575757575757
-57575757575757575757575757575757575757575757575757c0c0c07300
-c0ffc0c0c0bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbf
-bfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfbfc0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0bfd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c07300
-c07373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737300
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000
-
-showpage
-
-% stop using temporary dictionary
-end
-
-% restore original state
-origstate restore
-
-%%Trailer
diff --git a/lib/toolbar/doc/src/book.xml b/lib/toolbar/doc/src/book.xml
deleted file mode 100644
index e5584cf925..0000000000
--- a/lib/toolbar/doc/src/book.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE book SYSTEM "book.dtd">
-
-<book xmlns:xi="http://www.w3.org/2001/XInclude">>
- <header titlestyle="normal">
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar</title>
- <prepared>Joakim Greben&ouml;</prepared>
- <docno></docno>
- <date>1997-05-02</date>
- <rev>1.0.2</rev>
- <file>book.sgml</file>
- </header>
- <insidecover>
- </insidecover>
- <pagetext>Toolbar</pagetext>
- <preamble>
- <contents level="2"></contents>
- </preamble>
- <parts lift="no">
- <xi:include href="part.xml"/>
- </parts>
- <applications>
- <xi:include href="ref_man.xml"/>
- </applications>
- <releasenotes>
- <xi:include href="notes.xml"/>
- </releasenotes>
- <listofterms></listofterms>
- <index></index>
-</book>
-
diff --git a/lib/toolbar/doc/src/create_tool.gif b/lib/toolbar/doc/src/create_tool.gif
deleted file mode 100644
index b55bb809d3..0000000000
--- a/lib/toolbar/doc/src/create_tool.gif
+++ /dev/null
Binary files differ
diff --git a/lib/toolbar/doc/src/create_tool.ps b/lib/toolbar/doc/src/create_tool.ps
deleted file mode 100644
index 8d6961bb9f..0000000000
--- a/lib/toolbar/doc/src/create_tool.ps
+++ /dev/null
@@ -1,5050 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: /home/kent/otp/toolbar/doc/create_tool.ps
-%%Creator: XV Version 3.10a Rev: 12/29/94 - by John Bradley
-%%BoundingBox: 165 29 575 446
-%%Pages: 1
-%%DocumentFonts:
-%%EndComments
-%%EndProlog
-
-%%Page: 1 1
-
-% remember original state
-/origstate save def
-
-% build a temporary dictionary
-20 dict begin
-
-% define string to hold a scanline's worth of data
-/pix 410 string def
-
-% define space for color conversions
-/grays 410 string def % space for gray scale line
-/npixls 0 def
-/rgbindx 0 def
-
-% lower left corner
-165 29 translate
-
-% size of image (on paper, in 1/72inch coords)
-409.96800 417.02400 scale
-
-410 417 8 % dimensions of data
-[410 0 0 -417 0 417] % mapping matrix
-{currentfile pix readhexstring pop}
-image
-
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c000
-c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffff7300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffffffffffffff
-ffffffffffffffff00ffffffffffffffffffffffffffffff001414ffffffffffffffffff
-ffffffffffff001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414ffc0c0c0c0c0c0c0c0
-c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c014141414575757575714141414141414571414141414141414ffffffff1414
-14141414141414141414141414141414141414ffff14141414141414141414141414ffff
-ffffffffffff1414141414141414141414141414ffff141414141414ffffffffffffffff
-14ffff141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c0000000000000000000c0c073001414ffc0c0c0c0c0c0c0c0
-c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c0141414141457575757571414141414571414141414141414ffff1414ffff14
-14141414141414141414141414141414141414ffff141414141414141414141414141414
-14ffff1414141414141414141414141414141414ffff141414141414ffff141414141414
-14ffff141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c0000000000000000000c0c073001414ffc0c0c00000c0c0c0
-c00000c0c073001414c0c0c07300
-c0ffc0c0c01414141414145757575757141414571414141414141414ffff1414141414ff
-ff14ffff14ffffffff141414ffffffff1414ffffffff1414ffffffff1414141414141414
-14ffff14141414ffffffff141414ffffffff1414ffff141414141414ffff14141414ffff
-14ffff1414ffffffff141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c0c00000c0c0
-0000c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141457575757571457141414141414141414ffff1414141414ff
-ffffffffffff1414ffff14ffff1414ffff1414ffff1414ffff1414ffff14141414141414
-14ffff141414ffff1414ffff14ffff1414ffff14ffff141414141414ffff14141414ffff
-14ffff14ffff1414ffff1414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c0c0c0000000
-00c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414575757145714141414141414141414ffff1414141414ff
-ffff1414ffff1414ffff1414141414ffff1414ffff1414ffff1414ffff14141414141414
-14ffff141414ffff1414ffff14ffff1414ffff14ffff141414141414ffffffffff14ffff
-14ffff14ffff1414ffff1414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c0c0c0c00000
-c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414145714575757141414141414141414ffff1414141414ff
-ff141414ffffffffffff1414ffffffffff1414ffff1414ffffffffffff14141414141414
-14ffff141414ffff1414ffff14ffff1414ffff14ffff141414141414ffff14141414ffff
-14ffff14ffffffffffff1414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c0c0c0000000
-00c0c0c0c073001414c0c0c07300
-c0ffc0c0c01414141414141414571457575757571414141414141414ffff1414141414ff
-ff141414ffff1414141414ffff1414ffff1414ffff1414ffff1414141414141414141414
-14ffff141414ffff1414ffff14ffff1414ffff14ffff141414141414ffff14141414ffff
-14ffff14ffff141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c0c00000c0c0
-0000c0c0c073001414c0c0c07300
-c0ffc0c0c0141414141414145714141457575757571414141414141414ffff1414ffffff
-ff141414ffff1414ffff14ffff1414ffff1414ffff14ffffff1414ffff14141414141414
-14ffff141414ffff1414ffff14ffff1414ffff14ffff141414141414ffff14141414ffff
-14ffff14ffff1414ffff1414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0000000
-000000c0c0c0c07300ffc0c000c0c0c0c0c0c0c000c0c073001414ffc0c0c00000c0c0c0
-c00000c0c073001414c0c0c07300
-c0ffc0c0c014141414141457141414141457575757571414141414141414ffffffff14ff
-ff14141414ffffffff141414ffffff14ffff1414ffff1414ffffffff1414141414141414
-14ffff14141414ffffffff141414ffffffff1414ffff141414141414ffff14141414ffff
-14ffff1414ffffffff141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0000000
-000000c0c0c0c07300ffc0c0000000000000000000c0c073001414ffc0c0c0c0c0c0c0c0
-c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c014141414145714141414141414575757575714141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ffc0c0c0c0c0c0
-c0c0c0c0c0c0c07300ffc0c0c0c0c0c0c0c0c0c0c0c0c073001414ffc0c0c0c0c0c0c0c0
-c0c0c0c0c073001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-1414141414141414141414141414141414141414141414141414141414ff737373737373
-737373737373737300ff7373737373737373737373737373001414ff7373737373737373
-737373737373001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141400000000000000
-000000000000000000000000000000000000000000000000001414000000000000000000
-000000000000001414c0c0c07300
-c0ffc0c0c014141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414141414141414141414141414141414141414141414141414141414
-141414141414141414c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffc0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff82c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282828282828282828282828282828282828282828282828282828282d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282ffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9
-d9d900d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-000000d9d9d9d9d9d900d9d9d9d9000000d9d9d9d9d9d9d9d9d9d900d90000d9d9d9d900
-0000d9d9d90000d900d9d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d9d9000000d9d9d900d90000d9d9d9
-d9000000d9d9d9d9d9d900d9d9d90000d900d9d9d900d9d9d900d9d90000000000d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d90000000000d9d9d900
-0000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d9d9d9d9d90000d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d900d9d9d9d900d9d9d900d9d90000d9d900d9d9
-00d9d9d900d9d9d9d900d9d9d9d900d900d900d9d900d9d9d900d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900000000d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d900d9d9d9d900d9d9d9d9d9d900d9d9d9d9d9d9
-00d9d9d9d9d9d9d9d900d9d9d9d900d900d900d9d9d900d9d900d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d90000000000d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-000000d9d900d900d900d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d900d9d9d9d9d9d9000000d9d9d900d9d9d9d9d9d9
-00d9d9d9d9d9d9d900d9d9d9d9d900d900d900d9d9d900d9d900d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d900d9d9d9d9d9d9d9d9d900d9d900d9d9d9d9d9d9
-00d9d9d9d9d9d9d900d9d9d9d9d900d900d900d9d9d9d900d900d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d900d9d9d9d9d9d900d9d9d900d9d900d9d9d9d9d9d9
-00d9d9d900d9d900d9d9d9d9d9d900d900d900d9d9d9d90000d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d90000d9d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d900d9d9d9d9000000d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-000000d9d900d900d900d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d900d9d9d9d9d9d9d9000000d9d9d900d9d9d9d9d9d9
-d9000000d9d9d900d9d9d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d90000d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d90000d9d9d9d9d9d90000d9d9d900
-0000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffff8282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ff828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffc0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff82c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282828282828282828282828282828282828282828282828282828282d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282ffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d90000d9d9d9d900
-0000d9d9d90000d900d9d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d90000d9d90000d9d900d9d9d900d9d9d9d9d9d9d9d9d9
-d9000000d9d9d900d9d9d900d9d900d90000d9d9d9d9d9d9d9d9d9d90000000000d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d90000d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d90000d9d90000d9d900d9d9d900d9d9d9d9d9d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d90000d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d90000d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9
-00d9d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-000000d9d900d900d900d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d90000d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9
-00d9d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d900d900d9d9d9d9d9d9d9d9d9
-00d9d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d900d9
-d9d900d9d900d900d900d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9
-00d9d9d900d9d900d900d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-000000d9d900d900d900d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9000000d9d9d9d900d900d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d90000d9d9d9
-000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282d9d9
-d9d982828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282ffd9d9
-d9d982828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282ffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d90000000000d9d9d900
-0000d9d9d900d90000d9d9d90000000000d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9000000d9d9d900d90000d9d9d90000000000d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d90000d900d9d9d900d9d9d900d9d90000000000d9d9d9000000d9d9d9d900
-0000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d900d9d9d9d900d9
-d9d900d9d90000d9d900d9d9d9d900d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d90000d9d900d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d900d9d9d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000d9d9d9d9d900d9d9d9d9d9d9
-d9d900d9d900d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d900d9d9d900d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d9d900d9d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d9d9d900
-000000d9d900d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d900d9d9d900d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d9d900d9d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d900d9d9d900d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d9d9d900d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d900d9
-d9d900d9d900d9d9d9d9d9d9d9d900d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d900d9d9d900d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d9d9d90000d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d90000d9d9d900
-000000d9d900d9d9d9d9d9d9d9d9d90000d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d90000d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d900d900d900d9d9d9d9d900d9d9d9d9d9d90000d9d9d9000000d9d9d9d900
-0000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9
-d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9
-d9d98282ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9d9
-d9d982ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828200
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282ff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000d9d9d9d9
-d900d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-000000d9d9d9d9000000d9d9d900d90000d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d900
-0000d9d9d9d9d9d900d9d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d90000828200000000d900d9d9d900d9d9d900d9d90000000000d9d9
-d9000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d90000d900d9d9d9
-000000d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d90000d9d900d9d9d9d9d9d9d9d9d90000000000d9d9d9d9
-d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d900d9d9d900d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d90000d9d9d9
-d9d900d9d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d9d900d9d900d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d900d9d9d9d9d9d900d9d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d9d900d9d900d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d900d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d9d9d900d900d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d900
-d9d9d900d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d900d9d9d9d9d9d900d9d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d9d9d90000d9d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d90000d9d9d900d9d90000d9d9d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9
-000000d9d9d9d9000000d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9
-d900d9d9d9d9d9d900d9d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282000000d900d900d9d9d9d9d900d9d9d9d9d9d90000d9d9
-d9000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d90000d9d9d9d90000d900d9d9d9
-d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082820000d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900008282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000082ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-00d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282828282828282828282828282828282828282828282828282828282d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282ffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d90000d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d90000d9d90000d9d9d9000000d9d9d9d9000000d9d9d9d9000000d9d9d9d900
-0000d9d9d9d90000d900d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d90000d9d90000d9d900d9d9d900d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9000000d9d9d900d90000d9d9d9d9000000d9d9d90000000000d9d9d9
-d9d9d9d9d9d90000000000d9d9d9000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d90000d9d90000d9d900d9d9d900d9d900d9d9d900d9d900d9d9d900d9d900d9
-d9d900d9d900d9d90000d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d90000d9d90000d9d900d9d9d900d9d9d9d9d9d9d9d9d9
-0000000000d9d9d9d9d900d9d9d90000d9d900d9d900d9d9d900d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d90000d900d9d900d9d9d900d9d900d9d9d9d9d9d900d9d9d9d9d9d9d9d9
-d9d900d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d90000d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d900d9d9d9d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d90000d900d9d90000000000d9d9d9000000d9d9d9d9000000d9d9d9d900
-000000d9d900d9d9d900d9d90000000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d90000d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9000000d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d9d900d9d900d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d900d9
-d9d900d9d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d900d900d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d9d900d9d900d9d9d900d9d900d9d9d900d9d900d9d9d900d9d900d9
-d9d900d9d900d9d90000d9d900d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d90000d9d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d9d900d9d9d9000000d9d9d9d9000000d9d9d9d9000000d9d9d9d900
-000000d9d9d90000d900d9d9d9000000d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d900d9d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9d900d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9000000d9d9d9d9d9d90000d9d9d9
-d9d9d9d9d9d9d9d9d90000d9d9d9000000d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9d9
-00d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282828282828282828282828282828282828282828282828282828282d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282828282828282828282828282828282828282ffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d90000
-000000d900d9d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9
-d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d900d9d9d9d9d9d9d9
-d900d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d900d9d9d9d9d900d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9
-d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d900d9d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9
-d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9
-d900d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9
-d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d90000d9d90000d9d900d9d9d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9
-d90000d900d9d9d9000000d9d9d9d9000000d9d9d9d9d9d900d9d9d900d90000d9d9d900
-00000000d9d90000d900d9d9d9d9d9d900d9d9d9d9d9d900d9d9d9d9000000d9d9d900d9
-0000d9d9d9d90000d900d9d9d9000000d9d9d900d9d9d900d9d9d9d9d9d9d9d9d900d900
-00d9d9d90000000000d9d90000d900d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d90000d9d90000d9d900d9d9d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-00d9d90000d9d900d9d9d900d9d900d9d9d900d9d9d9d900d9d9d9d90000d9d900d9d9d9
-d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d900d9d9d9d9d9d9d900d9d9d90000
-d9d900d9d900d9d90000d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9d9d9d9d90000d9
-d900d9d9d9d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d90000000000d9d9d9d9
-00d9d9d900d90000d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d900d9d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d9d9
-d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d900d9d9d9d9d9d9d900d9d9d900d9
-d9d900d9d900d9d9d900d9d900d9d9d900d9d9d900d900d9d9d9d9d9d9d9d9d9d900d9d9
-d900d9d9d9d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d900d90000d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d900d9d9d9d9d9d9d900d9d9d9d9d900d9d9d900d9d9d9
-d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d900d9d9d9d9d9d9d9d900d9d9d900d9
-d9d900d9d900d9d9d900d9d90000000000d9d9d9d900d9d9d9d9d9d9d9d9d9d9d900d9d9
-d900d9d9d9d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d900d9d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9
-00d9d9d900d9d900d9d9d900d9d900d9d9d9d9d9d9d900d9d9d9d9d900d9d9d900d9d9d9
-d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d900d9d9d9d9d9d9d9d900d9d9d900d9
-d9d900d9d900d9d9d900d9d900d9d9d9d9d9d9d900d900d9d9d9d9d9d9d9d9d9d900d9d9
-d900d9d9d9d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d900d9d9d9d900d9d900d9d9d9d9d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d90000d9d9d9d9d90000d9d9d900d9d9d9d9d9d9
-00d9d90000d9d900d9d9d900d9d900d9d9d900d9d900d9d9d9d9d9d900d9d9d900d9d9d9
-d900d9d9d9d900d900d900d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9
-d9d900d9d900d9d90000d9d900d9d9d900d9d900d9d9d900d9d9d9d90000d9d9d900d9d9
-d900d9d9d9d900d9d9d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9
-00d9d9d900d9d9d9d900d9d90000000000d9d9d9d90000d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d90000d9d9d9d9d90000d9d9d900d9d9d9d9d9d9
-d90000d900d9d9d9000000d9d9d9d9000000d9d9d900d9d9d9d9d9d900d9d9d900d9d9d9
-d9d90000d9d900d900d900d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9
-d9d900d9d9d90000d900d9d9d9000000d9d9d900d9d9d900d9d9d9d90000d9d9d900d9d9
-d900d9d9d9d9d90000d9d900d900d900d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d98282ffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d982ffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffff8282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ff828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffc0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff82c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffff82d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffff82d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffff82d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9000000d9d9d9d9000000d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9000000d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9000000d9d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d900d9d9d9d9d900d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d900d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d900d9d9d9d9d900d9d9d9d9000000d9
-d9d9d9000000d9d9d900d90000d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9000000d9d9d900d9d9d900d9d9d900
-0000d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d900d9d9d9d9d9d90000000000d9d9d9000000d9d9d900d90000d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-d9d900d9d9d900d9d90000d9d900d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d900d9d9d9d9d900d9d9d900d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d900d9d9d9d9d9d9d900d9d9d9d900d9d9d900d9d90000d9d900d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d900d9d9d900
-d9d9d9d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d90000d9d9d9d9d9d9d900d9d900d9d9d900d9d900d9
-d9d900d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d90000d9d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d9d9d9d9d9d9d900d9d9d90000000000
-d9d9d900000000d9d900d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d900000000d9d9d900d900d9d9d90000
-000000d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d900d9d9d9d9d900d9d9d900d9d9d9d9
-d9d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d900d9d9d900d9d900d9d9d900d9d9d900d900d9d9d900d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d900d9d9d900d9d9d9d9d900d9d9d900d9d9d900
-d9d900d9d9d900d9d900d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d900d9d9d900d9d900d9d9d900d9d9d9d900d9d9d9d900d9
-d9d900d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d900d9d9d900d9d9d9d900d9d9d9d900d9d9d900d9d90000d9d900d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9000000d9d9d9d9d9d900d9d9d9d9000000d9
-d9d9d900000000d9d900d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9000000d9d9d9d900000000d9d9d9d900d9d9d9d9d900
-0000d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9000000d9d9d9d9d9d90000d9d9d9000000d9d9d900d90000d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d900d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffffd9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d98282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ffff828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ffff8282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ffff82828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9ff82828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9ff828282828282828282828282828282828282828282828282828282828282828282
-82828282828282828282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9ff8282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-8282828282828282d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffff8282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ff828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffc0c0c07300
-c0ffc0c0c0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-ffffffffffffffff82c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffffd9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9d9
-d9d9d9d9d9d9d98282c0c0c07300
-c0ffc0c0c0ffff8282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0ff828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282828282828282828282828282828282828282828282828282828282
-828282828282828282c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c0ffc0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0
-c0c0c0c0c0c0c0c0c0c0c0c07300
-c07373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-737373737373737373737373737373737373737373737373737373737373737373737373
-7373737373737373737373737300
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-000000000000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000
-
-showpage
-
-% stop using temporary dictionary
-end
-
-% restore original state
-origstate restore
-
-%%Trailer
diff --git a/lib/toolbar/doc/src/fascicules.xml b/lib/toolbar/doc/src/fascicules.xml
deleted file mode 100644
index 37feca543f..0000000000
--- a/lib/toolbar/doc/src/fascicules.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
-
-<fascicules>
- <fascicule file="part" href="part_frame.html" entry="no">
- User's Guide
- </fascicule>
- <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
- Reference Manual
- </fascicule>
- <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
- Release Notes
- </fascicule>
- <fascicule file="" href="../../../../doc/print.html" entry="no">
- Off-Print
- </fascicule>
-</fascicules>
-
diff --git a/lib/toolbar/doc/src/note.gif b/lib/toolbar/doc/src/note.gif
deleted file mode 100644
index 6fffe30419..0000000000
--- a/lib/toolbar/doc/src/note.gif
+++ /dev/null
Binary files differ
diff --git a/lib/toolbar/doc/src/notes.xml b/lib/toolbar/doc/src/notes.xml
deleted file mode 100644
index aca9d59176..0000000000
--- a/lib/toolbar/doc/src/notes.xml
+++ /dev/null
@@ -1,180 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar Release Notes</title>
- <prepared>otp_appnotes</prepared>
- <docno>nil</docno>
- <date>nil</date>
- <rev>nil</rev>
- <file>notes.xml</file>
- </header>
- <p>This document describes the changes made to the Toolbar
- application.</p>
-
-<section><title>Toolbar 1.4.2.3</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Misc build updates</p>
- <p>
- Own Id: OTP-10784</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Toolbar 1.4.2.2</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The GS applications is now deprecated and will be
- removed in the R16 release. The following GS-based
- applications have been superseded by the Observer
- application and will removed in R16: Appmon, Pman,
- Tv.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-9907</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Toolbar 1.4.2.1</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Miscellaneous documentation build updates</p>
- <p>
- Own Id: OTP-9813</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Toolbar 1.4.2</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
- <list>
- <item>
- <p>
- Improve spelling throughout documentation, code comments
- and error messages</p>
- <p>
- Own Id: OTP-9555</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Toolbar 1.4.1</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- The documentation is now built with open source tools
- (xsltproc and fop) that exists on most platforms. One
- visible change is that the frames are removed.</p>
- <p>
- Own Id: OTP-8201</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>Toolbar 1.4</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The copyright notices have been updated.</p>
- <p>
- Own Id: OTP-7851</p>
- </item>
- </list>
- </section>
-
-</section>
-
- <section>
- <title>Toolbar 1.3.0.1</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Minor Makefile changes.</p>
- <p>Own Id: OTP-6689</p>
- </item>
- <item>
- <p>Obsolete guard tests (such as list()) have been replaced
- with the modern guard tests (such as is_list()).</p>
- <p>Own Id: OTP-6725</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Toolbar 1.3</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Notification windows are now centered over a parent
- window.</p>
- <p>Own Id: OTP-6013 Aux Id: OTP-5987 </p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>Toolbar 1.2.1</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>The graphic applications now search for HTML
- documentation in the correct place.</p>
- <p>Own Id: OTP-5381</p>
- </item>
- </list>
- </section>
- </section>
-</chapter>
-
diff --git a/lib/toolbar/doc/src/part.xml b/lib/toolbar/doc/src/part.xml
deleted file mode 100644
index 907b645764..0000000000
--- a/lib/toolbar/doc/src/part.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">>
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar User's Guide</title>
- <prepared>Gunilla Hugosson</prepared>
- <docno></docno>
- <date>1997-04-19</date>
- <rev>1.0.2</rev>
- <file>part.sgml</file>
- </header>
- <description>
- <p>The <em>Toolbar</em> application simplifies access to
- the Erlang/OTP tools. It consists of a number of power buttons, one
- for each available tool.</p>
- </description>
- <xi:include href="toolbar_chapter.xml"/>
-</part>
-
diff --git a/lib/toolbar/doc/src/part_notes.xml b/lib/toolbar/doc/src/part_notes.xml
deleted file mode 100644
index 72a488a9d5..0000000000
--- a/lib/toolbar/doc/src/part_notes.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">>
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar Release Notes</title>
- <prepared></prepared>
- <docno></docno>
- <date>2004-09-07</date>
- <rev>1.0</rev>
- <file>part_notes.sgml</file>
- </header>
- <description>
- <p>The <em>Toolbar</em> application simplifies access to
- the Erlang/OTP tools. It consists of a number of power buttons,
- one for each available tool.</p>
- </description>
- <xi:include href="notes.xml"/>
-</part>
-
diff --git a/lib/toolbar/doc/src/ref_man.xml b/lib/toolbar/doc/src/ref_man.xml
deleted file mode 100644
index 16ba54b9ef..0000000000
--- a/lib/toolbar/doc/src/ref_man.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE application SYSTEM "application.dtd">
-
-<application xmlns:xi="http://www.w3.org/2001/XInclude">>
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar Reference Manual</title>
- <prepared>Gunilla Hugosson</prepared>
- <docno></docno>
- <date>1997-04-15</date>
- <rev>1.0.2</rev>
- <file>application.sgml</file>
- </header>
- <description>
- <p>The <em>Toolbar</em> application simplifies access to
- the Erlang/OTP tools. It consists of a number of power buttons, one
- for each available tool.</p>
- </description>
- <xi:include href="toolbar.xml"/>
-</application>
-
diff --git a/lib/toolbar/doc/src/toolbar.xml b/lib/toolbar/doc/src/toolbar.xml
deleted file mode 100644
index ac62cb7b68..0000000000
--- a/lib/toolbar/doc/src/toolbar.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE erlref SYSTEM "erlref.dtd">
-
-<erlref>
- <header>
- <copyright>
- <year>1996</year>
- <year>2013</year>
- <holder>Ericsson AB, All Rights Reserved</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- The Initial Developer of the Original Code is Ericsson AB.
- </legalnotice>
-
- <title>toolbar</title>
- <prepared>Gunilla Hugosson</prepared>
- <docno></docno>
- <date>1997-04-21</date>
- <rev>A</rev>
- <file>toolbar.sgml</file>
- </header>
- <module>toolbar</module>
- <modulesummary>GUI for Starting Tools and User Contributions</modulesummary>
- <description>
- <warning>
- <p>
- The Toolbar application is deprecated and will be removed in R16.
- </p>
- </warning>
- <p>Toolbar makes it easier to use
- the different Erlang tools - and the user contributions - which are provided.
- It has a graphical user interface with an icon for each tool.
- Clicking the icon activates the corresponding tool.
- </p>
- <p>All tools to be included on Toolbar must
- have a configuration file containing information about the tool,
- for example its start function and help information location.
- Configuration files must have the <c>.tool</c> suffix.
- </p>
- <p>When started, Toolbar automatically checks for <c>*.tool</c>
- files in the current path and adds the corresponding tools. For
- each <c>ebin</c> directory found in the path, it will also look
- in a <c>priv</c> directory next to it. This is a feature of the Erlang
- file structure.</p>
- </description>
- <funcs>
- <func>
- <name>start() -> ok | already_started</name>
- <fsummary>Start Toolbar</fsummary>
- <desc>
- <p>Creates a window containing tool icons.</p>
- </desc>
- </func>
- <func>
- <name>version() -> string()</name>
- <fsummary>Return current version number</fsummary>
- <desc>
- <p>Returns the current version number of Toolbar.</p>
- </desc>
- </func>
- <func>
- <name>update() -> ok | {error,not_started}</name>
- <fsummary>Update Toolbar</fsummary>
- <desc>
- <p>Makes a search for new tool files in the current path and
- adds the corresponding tools to Toolbar window.</p>
- </desc>
- </func>
- <func>
- <name>quit() -> ok | {error,not_started}</name>
- <fsummary>Quit Toolbar.</fsummary>
- </func>
- <func>
- <name>create_tool_file() -> ok | {error,not_started}</name>
- <fsummary>Create tool files</fsummary>
- <desc>
- <p>Starts the GUI used for creating and editing tool files.</p>
- </desc>
- </func>
- <func>
- <name>add_gs_contribs() -> ok | {error,not_started}</name>
- <fsummary>Add GS contributions</fsummary>
- <desc>
- <p>Adds the path to the directory where the GS contributions are
- situated and add the tools found there, if any.</p>
- </desc>
- </func>
- </funcs>
-</erlref>
-
diff --git a/lib/toolbar/doc/src/toolbar_chapter.xml b/lib/toolbar/doc/src/toolbar_chapter.xml
deleted file mode 100644
index bec2bff062..0000000000
--- a/lib/toolbar/doc/src/toolbar_chapter.xml
+++ /dev/null
@@ -1,145 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>1996</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Toolbar</title>
- <prepared>Gunilla Hugosson, Kenneth Lundin</prepared>
- <docno></docno>
- <date>1997-04-21</date>
- <rev>A</rev>
- <file>toolbar_chapter.xml</file>
- </header>
- <warning>
- <p>
- The Toolbar application is deprecated and will be removed in R16.
- </p>
- </warning>
- <p>Toolbar provides an interface to the various Erlang tools which are available. Toolbar can also provide access to user supplied tools which are included with the Erlang software release. These tools are called GS Contributions.</p>
- <p>All tools included in Toolbar must have a configuration file which contains information about the tool, such as its start function and the location of help information. The name of a configuration file must include the suffix <c>.tool</c>.
- </p>
- <p>Start the Toolbar application with one of the following commands:
- </p>
- <list type="bulleted">
- <item>enter the command <c>toolbar:start().</c> from the command line after Erlang has been started.</item>
- <item>start Erlang with the command <c>erl -s toolbar</c>.</item>
- </list>
- <p>When started, Toolbar automatically checks for <c>*.tool</c> files in the current path and adds the corresponding tools. For each <c>ebin</c> directory found in the path, it will also look in a <c>priv</c> directory next to it. This is a function of the Erlang file structure.
- </p>
- <p>You can update Toolbar with menu commands on Toolbar window. Refer to the File Menu and Tools Menu sections below for details.
- </p>
-
- <section>
- <title>Toolbar Window</title>
- <p>The following illustration shows <seealso marker="#fig_1">The Toolbar Window</seealso>.
- </p>
- <marker id="fig_1"></marker>
- <image file="bar.gif">
- <icaption>The Toolbar Window</icaption>
- </image>
- <p>Each icon on Toolbar represents a separate tool, which is started by clicking on the icon. You can also display place the mouse pointer over an icon to display the name of the tool at the bottom of Toolbar window.
- </p>
- <p>The Toolbar window also has a menu which includes the following menu items:
- </p>
- <list type="bulleted">
- <item>File menu</item>
- <item>Tools menu</item>
- <item>Help menu</item>
- </list>
- <p>These menu are described in the following sections.
- </p>
-
- <section>
- <marker id="file_menu"></marker>
- <title>The File menu</title>
- <p>The File menu has the following two menu items:
- </p>
- <taglist>
- <tag>Update Toolbar</tag>
- <item>Select this menu item to search for new tool files in the current path and add the corresponding tools to the Toolbar window. This action is performed automatically every the Toolbar application is started.</item>
- <tag>Quit</tag>
- <item>Select this menu item to exit the oolbar application.</item>
- </taglist>
- </section>
-
- <section>
- <marker id="tools_menu"></marker>
- <title>The Tools menu</title>
- <p>The Tool menu has the following menu items:
- </p>
- <taglist>
- <tag>Create Tool File</tag>
- <item>Choose this menu item to display the Create Tools File Window, where you create a new tools file, or edit an existing tools file. This window is described in detail below.</item>
- <tag>Add GS Contributions</tag>
- <item>Choose this menu item to add GS contributions by entering the path to the directory where these tools are situated. GS contributions are user supplied tools which are included with the Erlang software release. These tools are not supported by Erlang/OTP.</item>
- </taglist>
-
- <section>
- <title>The Create Tool File Window</title>
- <p>This window is displayed when you select <em>Create Tool File</em> from the <em>Tools</em> menu. The following illustration shows <seealso marker="#fig_2">The Create Tool File Window</seealso>.
- </p>
- <marker id="fig_2"></marker>
- <image file="create_tool.gif">
- <icaption>The Create Tool File Window</icaption>
- </image>
- <p>Follow these steps to create a new tool file, or to edit an existing tool file:</p>
- <list type="bulleted">
- <item>To edit an existing tools file, enter the file name of the tools file into the field <em>File name</em> and press <em>Enter</em>. The contents of the tool file are displayed in the information fields. Edit the information in the following fields as required.</item>
- <item>To create a new tools file, enter information into the following fields.</item>
- <item>When finished, select <em>Update Toolbar</em> from the <em>File</em> menu.</item>
- </list>
- <list type="ordered">
- <item><em>File name</em>. Enter the name of the tools file. The application will add the <c>.tool</c> suffix if omitted.</item>
- <item><em>Tool name</em>. Enter the name of the tool. This field defaults to the name entered into the File name field. For example, if you enter <c>mytool.tool</c> as a file name, this field defaults to <c>mytool</c>.</item>
- <item><em>Start function</em>. Enter a module name and a function name into the fields titled module and function respectively. The function must exist and take zero arguments.</item>
- <item><em>Icon file</em>. Enter the file name of the icon to be displayed in the Toolbar. The file must be a bitmap file or a GIF image with the file extension <c>.xbm</c> or <c>.gif</c> respectively. If no path name is entered, the system assumes that the file is located in the same directory as the tools file. This field is optional.</item>
- <item><em>Message</em>. Enter a descriptive string of maximum 30 characters for the tool. This field is optional. The information entered here is displayed at the bottom of the Toolbar window when the mouse pointer is placed on the Toolbar icon.</item>
- <item><em>HTML</em>. Enter an URL, a HTML file name, or a plain text file name, which points to the help text file for the tool. An URL should be given in the form <c>http://...</c>. If no path is given, the system assumes that the file is located in the same directory as the tool file. For an HTML file name ending with <c>.html</c>, it is possible to add an index which points to a specific location in the file. This is written as <c>.html#index</c>. This field is optional.</item>
- </list>
- <p>The window has the following command buttons:
- </p>
- <list type="bulleted">
- <item><em>Clear</em>. Click on this button to clear the information fields.</item>
- <item><em>Save</em>. Click on this button to save the information. A new tool file can be saved only when mandatory information such as file name, tool name and start function has been entered.</item>
- <item><em>Stop</em>. Click on this button to quit the Create Tool File window.</item>
- </list>
- <note>
- <p>No error check is performed on the information entered.</p>
- <p>You must select <em>Update Toolbar</em> from the <em>File</em> menu to update the configuration and make the tool visible on the Toolbar.</p>
- </note>
- </section>
- </section>
-
- <section>
- <marker id="help_menu"></marker>
- <title>The Help menu</title>
- <p>The Help Menu has the following two menu items, plus additional help menu items for those tools which have a help system.
- </p>
- <taglist>
- <tag>About</tag>
- <item>This menu item displays a short message about accessing the help information.</item>
- <tag>Toolbar</tag>
- <item>This menu item provides access to the Toolbar documentation.</item>
- </taglist>
- </section>
- </section>
-</chapter>
-
diff --git a/lib/toolbar/doc/src/warning.gif b/lib/toolbar/doc/src/warning.gif
deleted file mode 100644
index 96af52360e..0000000000
--- a/lib/toolbar/doc/src/warning.gif
+++ /dev/null
Binary files differ
diff --git a/lib/toolbar/ebin/.gitignore b/lib/toolbar/ebin/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/toolbar/ebin/.gitignore
+++ /dev/null
diff --git a/lib/toolbar/info b/lib/toolbar/info
deleted file mode 100644
index 706cbdfdf2..0000000000
--- a/lib/toolbar/info
+++ /dev/null
@@ -1,2 +0,0 @@
-group: tools
-short: A tool bar simplifying access to the Erlang tools
diff --git a/lib/toolbar/src/Makefile b/lib/toolbar/src/Makefile
deleted file mode 100644
index a24846976b..0000000000
--- a/lib/toolbar/src/Makefile
+++ /dev/null
@@ -1,93 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1996-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-#
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../vsn.mk
-VSN=$(TOOLBAR_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/toolbar-$(VSN)
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-MODULES= \
- canvasbutton \
- toolbar \
- toolbar_graphics \
- toolbar_lib \
- toolbar_toolconfig
-
-HRL_FILES= toolbar.hrl
-
-ERL_FILES= $(MODULES:%=%.erl)
-
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
-
-APP_FILE = toolbar.app
-APP_SRC = $(APP_FILE).src
-APP_TARGET = $(EBIN)/$(APP_FILE)
-
-APPUP_FILE = toolbar.appup
-APPUP_SRC = $(APPUP_FILE).src
-APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-
-debug opt: $(TARGET_FILES)
-
-clean:
- rm -f $(TARGET_FILES)
- rm -f errs core *~
-
-$(APP_TARGET): $(APP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-docs:
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(ERL_FILES) $(HRL_FILES) "$(RELSYSDIR)/src"
- $(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
-
-release_docs_spec:
-
diff --git a/lib/toolbar/src/canvasbutton.erl b/lib/toolbar/src/canvasbutton.erl
deleted file mode 100644
index 81e0ed43bb..0000000000
--- a/lib/toolbar/src/canvasbutton.erl
+++ /dev/null
@@ -1,239 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(canvasbutton).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Description %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Extension to GS used to imitate buttons but instead using images drawn
-% on a canvas. Enables usage of .gif files as button images and not only
-% .xbm (bitmap) files.
-%
-%%% Constants %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--define(gray,{87,87,87}).
-%
-%%% Internal data structures %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% canvasbutton()
--record(canvasbutton,{image,rect,ul,ll}).
-%
-% cboptions()
--record(cboptions,
- {imagefile=nofile, % nofile |
- % string() Name of image file
- x=0, % integer() X coordinate relative the canvas
- y=0, % integer() Y coordinate relative the canvas
- width=10, % integer() Button width
- height=10, % integer() Button heigth
- fg=black, % atom() Foreground color
- data=[]}). % term() Data associated with button events
-%
-%%% Exports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--export([create/1,create/2,read/2,press/1,release/1]).
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%% Exported functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% create(Canvas) => create(Canvas,[])
-% create(Canvas,OptionList) => canvasbutton()
-% Canvas - GS canvas object
-% OptionList - [{Option,Value}]
-% Option, Value - see below
-% Create a canvasbutton with the given image on Canvas
-%
-% Option Value Default Comment
-% ----------------------------------------------------------------
-% image nofile | nofile Name of image file. Must be a bitmap
-% string() file (.xbm) or a GIF file (.gif).
-% x integer() 0 X coordinate relative to Canvas
-% y integer() 0 Y coordinate relative to Canvas
-% width integer() 10 Button width
-% height integer() 10 Button height
-% fg atom() black Foreground color, bitmaps only
-% data term() [] Data associated with button events
-%
-% The process calling this function will receive the following events:
-% {gs,GsObj,enter,{canvasbutton,Canvasbutton,Data},Args}
-% {gs,GsObj,leave,{canvasbutton,Canvasbutton,Data},Args}
-% {gs,GsObj,buttonpress,{canvasbutton,Canvasbutton,Data},Args}
-% {gs,GsObj,buttonrelease,{canvasbutton,Canvasbutton,Data},Args}
-% where GsObj and Args are a GS object and its Args field, respectively.
-%
-% Note that press/1 and release/1 has to be called explicitly to create
-% the illusion of the button being pressed or released.
-%----------------------------------------
-create(Canvas) ->
- create(Canvas,[]).
-create(Canvas,OptionList) ->
- Options = sort_out_options(OptionList),
- X = Options#cboptions.x,
- Y = Options#cboptions.y,
- W = Options#cboptions.width,
- H = Options#cboptions.height,
-
- %% Buttons should have the same background color as the canvas
- Bg = gs:read(Canvas,bc),
-
- %% Draw image
- Image = create_image(Options#cboptions.imagefile,Canvas,Bg,
- Options#cboptions.fg,X,Y,W,H),
-
- %% Draw upper left corner line
- Ul = gs:create(line,Canvas,[{coords,[{X,Y+H},{X,Y},{X+W,Y}]},
- {fg,white},{width,2}]),
-
- %% Draw lower right corner line
- Ll = gs:create(line,Canvas,[{coords,[{X,Y+H},{X+W,Y+H},{X+W,Y}]},
- {fg,?gray},{width,2}]),
-
-
- %% Draw a rectangle around all (for event catching when width and
- %% height of button is larger than image)
- Rect = gs:create(rectangle,Canvas,[{coords,[{X,Y},{X+W,Y+H}]},
- {fill,Bg},
- {buttonpress,true},
- {buttonrelease,true},
- {enter,true},{leave,true}]),
-
- %% Now the canvas button is created
- Canvasbutton = #canvasbutton{image=Image,rect=Rect,ul=Ul,ll=Ll},
-
- Data = Options#cboptions.data,
- gs:config(Rect,{data,{canvasbutton,Canvasbutton,Data}}),
- gs:config(Image,{data,{canvasbutton,Canvasbutton,Data}}),
- gs:config(Rect,lower),
- gs:config(Image,raise),
-
- Canvasbutton.
-
-%----------------------------------------
-% read(Canvasbutton,coords) => [{L,T},{R,B}]
-% Canvasbutton - canvasbutton()
-% Read a Canvasbutton's coordinates
-%----------------------------------------
-read(Canvasbutton,coords) ->
- gs:read(Canvasbutton#canvasbutton.rect,coords).
-
-%----------------------------------------
-% press(Canvasbutton)
-% Canvasbutton - canvasbutton()
-% Create the illusion that Canvasbutton is pressed
-%----------------------------------------
-press(Canvasbutton) ->
- gs:config(Canvasbutton#canvasbutton.ul,{fg,?gray}),
- gs:config(Canvasbutton#canvasbutton.ll,{fg,white}),
- case Canvasbutton#canvasbutton.image of
- noimage ->
- ignore;
- Image ->
- gs:config(Image,{move,{-1,-1}})
- end.
-
-%----------------------------------------
-% release(Canvasbutton)
-% Canvasbutton - canvasbutton()
-% Create the illusion that Canvasbutton is released
-%----------------------------------------
-release(Canvasbutton) ->
- gs:config(Canvasbutton#canvasbutton.ul,{fg,white}),
- gs:config(Canvasbutton#canvasbutton.ll,{fg,?gray}),
- case Canvasbutton#canvasbutton.image of
- noimage ->
- ignore;
- Image ->
- gs:config(Image,{move,{1,1}})
- end.
-
-
-%%% Internal functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% create_image(ImageFile,Canvas,Bg,Fg,X,Y,W,H) => Image
-% ImageFile - string() Image file, must exist and be a bitmap file ending
-% with .xbm or a GIF file ending with .gif.
-% Canvas - GS canvas object
-% Bg - atom() Background color (bitmaps only)
-% Fg - atom() Foreground color (bitmaps only)
-% X, Y - int() X and Y coordinates for Image relative to Canvas
-% W, H - int() Width and height of Image
-% Image - GS canvas image object
-%----------------------------------------
-create_image(nofile,_,_,_,_,_,_,_) ->
- noimage;
-create_image(ImageFile,Canvas,Bg,Fg,X,Y,W,H) ->
- case lists:last(string:tokens(ImageFile,".")) of
- "xbm" ->
- gs:create(image,Canvas,
- [{bitmap,ImageFile},
- {bg,Bg},{fg,Fg},
- {anchor,c},
- {coords,[{X+1+W/2,Y+1+H/2}]},
- {buttonpress,true},
- {buttonrelease,true},
- {enter,true},{leave,true}]);
- "gif" ->
- gs:create(image,Canvas,
- [{load_gif,ImageFile},
- {anchor,c},
- {coords,[{X+W/2,Y+H/2}]},
- {buttonpress,true},
- {buttonrelease,true},
- {enter,true},{leave,true}])
- end.
-
-%----------------------------------------
-% sort_out_options(OptionList) => cboptions()
-% OptionList - see create/2
-% Insert members of option list into a cboptions record.
-%----------------------------------------
-sort_out_options(OptionList) ->
- sort_out_options(OptionList,#cboptions{}).
-
-%----------------------------------------
-% sort_out_options(OptionList,Options) => cboptions()
-% OptionList - see create/2
-% Options - cboptions()
-% Called by sort_out_options/1.
-%----------------------------------------
-sort_out_options([{image,Image}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{imagefile=Image});
-sort_out_options([{x,X}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{x=X});
-sort_out_options([{y,Y}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{y=Y});
-sort_out_options([{width,Width}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{width=Width});
-sort_out_options([{height,Height}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{height=Height});
-sort_out_options([{fg,Fg}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{fg=Fg});
-sort_out_options([{data,Data}|Rest],Options) ->
- sort_out_options(Rest,Options#cboptions{data=Data});
-sort_out_options([],Options) ->
- Options.
diff --git a/lib/toolbar/src/toolbar.app.src b/lib/toolbar/src/toolbar.app.src
deleted file mode 100644
index 16f03c497d..0000000000
--- a/lib/toolbar/src/toolbar.app.src
+++ /dev/null
@@ -1,30 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-{application, toolbar,
- [{description, "Toolbar"},
- {vsn, "%VSN%"},
- {modules, [
- toolbar,
- toolbar_graphics,
- toolbar_lib,
- toolbar_toolconfig,
- canvasbutton
- ]},
- {registered,[toolbar]},
- {applications, [kernel, stdlib, gs]}]}.
diff --git a/lib/toolbar/src/toolbar.appup.src b/lib/toolbar/src/toolbar.appup.src
deleted file mode 100644
index 7a435e9b22..0000000000
--- a/lib/toolbar/src/toolbar.appup.src
+++ /dev/null
@@ -1,19 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-{"%VSN%",[],[]}.
diff --git a/lib/toolbar/src/toolbar.erl b/lib/toolbar/src/toolbar.erl
deleted file mode 100644
index b37c323008..0000000000
--- a/lib/toolbar/src/toolbar.erl
+++ /dev/null
@@ -1,579 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(toolbar).
--compile([{nowarn_deprecated_function,{gs,start,1}}]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Description %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Main module
-%
-%%% Includes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--include("toolbar.hrl").
-%
-%%% Exports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--export([start/0,version/0]).
--export([update/0,quit/0]).
--export([create_tool_file/0,add_gs_contribs/0]).
-
-%
--define (STARTUP_TIMEOUT, 20000).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%% Exported functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% start() => ok | already_started
-%----------------------------------------
-start() ->
- case whereis(toolbar) of
- undefined ->
- Self = self(),
- PidInit = spawn(fun() -> init(Self) end),
- init_ok (PidInit);
-
- _Pid ->
- already_started
- end.
-
-
-
-%%% init_ok /1
-%%%
-%%% init_ok returns the pid from this process given from
-%%% init/1 after its initialization, or else it timeouts.
-%%%
-
-init_ok (PidInit) ->
- %% Wait for a initialization completion message from
- %% the spawned process before returning its Pid.
- %%
-
- receive
- {initialization_complete, PidInit} ->
- PidInit
-
- %% (Conditional) Failure to start within the time limit will
- %% result in termination
-
- after
- ?STARTUP_TIMEOUT ->
- exit(PidInit, kill),
- exit({startup_timeout, ?MODULE})
- end.
-
-
-
-%----------------------------------------
-% version() -> string()
-% Returns the version number.
-%----------------------------------------
-version() ->
- "1.1".
-
-%----------------------------------------
-% update() => ok | {error,not_started}
-% Make a search for new tools (*.tool files) in the current path.
-%----------------------------------------
-update() ->
- call(update_toolbar).
-
-%----------------------------------------
-% quit() => ok | {error,not_started}
-% Quit the Toolbar.
-%----------------------------------------
-quit() ->
- call(quit).
-
-%----------------------------------------
-% create_tool_file() => ok | {error,not_started}
-% Start the GUI for creating .tool files.
-%----------------------------------------
-create_tool_file() ->
- call(create_tool_file).
-
-%----------------------------------------
-% add_gs_contribs() => ok | {error,not_started}
-% Add GS contributions.
-%----------------------------------------
-add_gs_contribs() ->
- call(add_gs_contribs).
-
-
-%%% Internal functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%=============================================================================
-% Main loop
-%=============================================================================
-
-%----------------------------------------
-% init()
-%----------------------------------------
-init(PidCaller) ->
- register (toolbar, self ()),
-
- %% Start GS
- S = gs:start([{kernel,true}]),
-
- %% Draw main window
- Window = toolbar_graphics:draw_window(S),
-
- %% Add system defined Tool icons to main window
- toolbar_graphics:cursor(Window,busy),
- NewWindow = add_tools(Window,code:get_path()),
- toolbar_graphics:cursor(Window,arrow),
-
- %% Listen to configure events from the window
- toolbar_graphics:listen_configure(NewWindow),
-
- %% Notify caller that the process appears
- %% to have been started.
- PidCaller ! {initialization_complete, self()},
-
- loop(S,NewWindow,null,undefined).
-
-%----------------------------------------
-% loop(S,Window,LoopData,TimerRef)
-% S - pid() GS
-% Window - tbwindow record (see toolbar_graphics.erl)
-% LoopData - term()
-% TimerRef - undefined | timer_ref()
-%----------------------------------------
-loop(S,Window,LoopData,TimerRef) ->
- receive
- %% test events
- {ping, Pid} ->
- Pid ! {toolbar, alive},
- loop (S, Window, LoopData, TimerRef);
-
- {stop, Pid} ->
- Pid ! {toolbar, stopped},
- finished;
-
- %% ----- GS events ----- %%
-
- {gs,_Object,Event,Data,Args} ->
- case toolbar_graphics:event(LoopData,Event,Data,Args) of
-
- noevent ->
- loop(S,Window,LoopData,TimerRef);
-
- %% Display short information message
- {display,Msg} ->
-
- {ok,Ref} = timer:apply_after(500,toolbar_graphics,
- display_show,[Window,Msg]),
- loop(S,Window,LoopData,Ref);
-
- %% Clear display area
- display_clear ->
- timer:cancel(TimerRef),
- toolbar_graphics:display_clear(Window),
- loop(S,Window,LoopData,undefined);
-
- %% New LoopData
- {newData,NewLoopData} ->
- loop(S,Window,NewLoopData,TimerRef);
-
- %% Icon button clicked, start corresponding tool/uc
- {start,Start} ->
- WinObj = toolbar_graphics:get_window(Window),
- start_tool(Start,WinObj),
- loop(S,Window,LoopData,TimerRef);
-
- %% Update Toolbar
- update_toolbar ->
- toolbar_graphics:cursor(Window,busy),
- NewWindow = add_tools(Window,code:get_path()),
- toolbar_graphics:cursor(Window,arrow),
- loop(S,NewWindow,LoopData,TimerRef);
-
- %% Start Tool Configuration tool
- create_tool_file ->
- toolbar_toolconfig:start(),
- loop(S,Window,LoopData,TimerRef);
-
- %% Add GS contributions
- add_gs_contribs ->
- toolbar_graphics:cursor(Window,busy),
- GsDir = toolbar_lib:gs_contribs_dir(),
- code:add_path(GsDir),
- NewWindow = add_tools(Window,[GsDir]),
- toolbar_graphics:cursor(Window,arrow),
- loop(S,NewWindow,LoopData,TimerRef);
-
- %% Help
- {help,Html} ->
- toolbar_graphics:cursor(Window,busy),
- WinObj = toolbar_graphics:get_window(Window),
- tool_utils:open_help(WinObj, Html),
- toolbar_graphics:cursor(Window,arrow),
- loop(S,Window,LoopData,TimerRef);
-
- %% About help
- about_help ->
- WinObj = toolbar_graphics:get_window(Window),
- Text = ["Help text is on HTML format",
- "Requires Netscape to be up and running"],
- tool_utils:notify(WinObj, Text),
- loop(S,Window,LoopData,TimerRef);
-
- %% Window has been resized, redraw it
- {redraw,Size} ->
- NewWindow = toolbar_graphics:redraw_window(Window,Size),
- loop(S,NewWindow,LoopData,TimerRef);
-
- %% Quit
- quit ->
- finished
- end;
-
- %% ----- Events from user ----- %%
-
- %% Update Toolbar
- update_toolbar ->
- toolbar_graphics:cursor(Window,busy),
- NewWindow = add_tools(Window,code:get_path()),
- toolbar_graphics:cursor(Window,arrow),
- loop(S,NewWindow,LoopData,TimerRef);
-
- %% Quit
- quit ->
- finished;
-
- %% Start Tool Configuration tool
- create_tool_file ->
- toolbar_toolconfig:start(),
- loop(S,Window,LoopData,TimerRef);
-
- %% Add GS contributions
- add_gs_contribs ->
- toolbar_graphics:cursor(Window,busy),
- GsDir = toolbar_lib:gs_contribs_dir(),
- code:add_path(GsDir),
- NewWindow = add_tools(Window,[GsDir]),
- toolbar_graphics:cursor(Window,arrow),
- loop(S,NewWindow,LoopData,TimerRef);
-
- Other ->
- io:format("toolbar: unexp msg ~p~n",[Other]),
- loop(S,Window,LoopData,TimerRef)
- end.
-
-%----------------------------------------
-% call(Msg) => ok | {error,not_started}
-% Msg - term()
-% Send message to toolbar if it is started, otherwise return an error
-%----------------------------------------
-call(Msg) ->
- case whereis(toolbar) of
- undefined ->
- {error,not_started};
- _ ->
- toolbar ! Msg,
- ok
- end.
-
-
-%=============================================================================
-% Addition of new tools
-%=============================================================================
-%----------------------------------------
-% add_tools(Window,Dirs) => NewWindow
-% Window, NewWindow - tbwindow record (see toolbar_graphics.erl)
-% Dirs - [string()] Directory names
-% Calls add_tools2/2 recursively for a number of directories
-%----------------------------------------
-add_tools(Window,[Dir|Rest]) when is_list(Dir) ->
-
- %% Add all tools in the directory Dir
- NewWindow = add_tools2(Window,tool_files(Dir)),
-
- case filename:basename(Dir) of
- %% Dir is an 'ebin' directory, check in '../priv' as well
- "ebin" ->
- NewerWindow =
- add_tools2(NewWindow,
- tool_files(filename:join(filename:dirname(Dir),
- "priv"))),
- add_tools(NewerWindow,Rest);
- _ ->
- add_tools(NewWindow,Rest)
- end;
-add_tools(Window,[]) ->
- Window.
-
-%----------------------------------------
-% add_tools2(Window,ToolFiles) => NewWindow
-% Window, NewWindow - tbwindow record (see toolbar_graphics.erl)
-% ToolFiles - [string()] *.tool file names
-% Calls add_tool/2 recursively for a number of .tool files in a directory
-%----------------------------------------
-add_tools2(Window,[ToolFile|Rest]) ->
- case add_tool(Window,ToolFile) of
- {ok,NewWindow} ->
- add_tools2(NewWindow,Rest);
- {error,_Reason} ->
- add_tools2(Window,Rest)
- end;
-add_tools2(Window,[]) ->
- Window.
-
-%----------------------------------------
-% add_tool(Window,ToolFile) => {ok,NewWindow} | {error,Reason}
-% Window, NewWindow - tbwindow record (see toolbar_graphics.erl)
-% ToolFile - string() A .tool file
-% Reason - noname | nostart | version | format | read | open
-% Reads tool information from a .tool file and adds it to the toolbar
-% Returns the new window information
-%----------------------------------------
-add_tool(Window,ToolFile) ->
- case tool_info(ToolFile) of
- {ok,ToolInfo} ->
- case toolbar_graphics:already_added(Window,ToolInfo) of
- true ->
- {ok,Window};
- false ->
- NewWindow = toolbar_graphics:add_icon(Window,ToolInfo),
- {ok,NewWindow}
- end;
- {error,Reason} ->
- %% Log
- {error,Reason}
- end.
-
-
-%=============================================================================
-% Functions for getting *.tool configuration files
-%=============================================================================
-
-%----------------------------------------
-% tool_files(Dir) => ToolFiles
-% Dir - string() Directory name
-% ToolFiles - [string()]
-% Return the list of all files in Dir ending with .tool (appended to Dir)
-%----------------------------------------
-tool_files(Dir) ->
- case file:list_dir(Dir) of
- {ok,Files} ->
- filter_tool_files(Dir,Files);
- {error,_Reason} ->
- []
- end.
-
-%----------------------------------------
-% filter_tool_files(Dir,Files) => ToolFiles
-% Dir - string() Directory name
-% Files, ToolFiles - [string()] File names
-% Filters out the files in Files ending with .tool and append them to Dir
-%----------------------------------------
-filter_tool_files(_Dir,[]) ->
- [];
-filter_tool_files(Dir,[File|Rest]) ->
- case filename:extension(File) of
- ".tool" ->
- [filename:join(Dir,File)|filter_tool_files(Dir,Rest)];
- _ ->
- filter_tool_files(Dir,Rest)
- end.
-
-
-%=============================================================================
-% Functions for retrieving tool information from *.tool files
-%=============================================================================
-
-%----------------------------------------
-% tool_info(ToolFile) => {ok,ToolInfo} | {error,Reason}
-% ToolFile - string() .tool file
-% ToolInfo - toolinfo record
-% Reason - nofile | format | noname | nostart
-% Retreives tool information from ToolFile
-%----------------------------------------
-tool_info(ToolFile) ->
- case file:consult(ToolFile) of
- {error,open} ->
- {error,nofile};
- {error,read} ->
- {error,format};
- {ok,[{version,Vsn},InfoTuple]} when is_tuple(InfoTuple)->
- case toolbar_lib:tool_info_syntax(Vsn,InfoTuple) of
-
- %% Syntax check ok, start additional checks
- {ok,InfoList} ->
-
- tool_info2(filename:dirname(ToolFile),
- InfoList,#toolinfo{});
-
- %% Syntax error
- Error ->
- Error
- end;
- {ok,[{version,Vsn},ToolInfo]} when is_list(ToolInfo)->
- case toolbar_lib:tool_info_syntax(Vsn,ToolInfo) of
-
- %% Syntax check ok, start additional checks
- {ok,InfoList} ->
- tool_info2(filename:dirname(ToolFile),
- InfoList,#toolinfo{});
-
- %% Syntax error
- Error ->
- Error
- end;
- {ok,_Other} ->
- {error,format}
- end.
-
-%----------------------------------------
-% tool_info2(Dir,Info,ToolInfo) => {ok,ToolInfo}
-% Dir - string() Directory where this .tool file is situated
-% Info - [{Key,Val}] List of tuples in the .tool file
-% ToolInfo - toolinfo record being filled in
-% Used by tool_info2/1
-%----------------------------------------
-%%% Tool name
-tool_info2(Dir,[{tool,Name}|Rest],TI) ->
- tool_info2(Dir,Rest,TI#toolinfo{tool=Name});
-
-%%% Start function
-tool_info2(Dir,[{start,{M,F,A}}|Rest],TI) ->
- tool_info2(Dir,Rest,TI#toolinfo{start={M,F,A}});
-
-%%% Icon file
-%%% It must exist since the icon is drawn immediately after this .tool
-%%% file has been successfully read
-%%% It must also end with a .gif or .xbm suffix
-%%% Otherwise the icon is ignored!
-%%% Uses absolute path: If a relative path is given, it is assumed to be
-%%% relative to the directory of the .tool file
-tool_info2(Dir,[{icon,Icon}|Rest],TI) ->
-
- %% Check that the image file ends with .xbm or .gif
- case image_suffix(Icon) of
- true ->
-
- %% Add absolute path (if necessary)
- File = absolute_path(Dir,Icon),
-
- case toolbar_lib:legal_file(File) of
- ok ->
- tool_info2(Dir,Rest,TI#toolinfo{icon=File});
- _Error ->
- %% LOG File does not exist or cannot be read
- tool_info2(Dir,Rest,TI)
- end;
-
- false ->
- %% LOG Illegal icon file name
- tool_info2(Dir,Rest,TI)
- end;
-
-%%% Message string
-tool_info2(Dir,[{message,Msg}|Rest],TI) ->
- tool_info2(Dir,Rest,TI#toolinfo{message=Msg});
-
-%%% Html file is found
-%%% Check if file exists at "view-time", not now!
-%%% Uses absolute path: If a relative path is given, it is assumed to be
-%%% relative to the directory of the .tool file
-tool_info2(Dir,[{html,Html}|Rest],TI) ->
-
- %% Check if the HTML file is a remote URL or a local file
- case Html of
-
- %% http://... Remote URL, save as is
- [$h,$t,$t,$p,$:,$/,$/|_] ->
- tool_info2(Dir,Rest,TI#toolinfo{html=Html});
-
- %% file:... Local file, save file with absolute path
- [$f,$i,$l,$e,$:|File] ->
- tool_info2(Dir,Rest,TI#toolinfo{html=absolute_path(Dir,File)});
-
- %% Everything else is assumed to be a file name
- %% Save file with absolute path
- _ ->
- tool_info2(Dir,Rest,TI#toolinfo{html=absolute_path(Dir,Html)})
- end;
-
-%%% Info has been traversed
-tool_info2(_Dir,[],ToolInfo) ->
- {ok,ToolInfo}.
-
-%----------------------------------------
-% image_suffix(File) => true | false
-% File - string() File name
-% Returns true if File end with an image suffix: gif or xbm
-%----------------------------------------
-image_suffix(File) ->
- case filename:extension(File) of
- ".gif" ->
- true;
- ".xbm" ->
- true;
- _ ->
- false
- end.
-
-%----------------------------------------
-% absolute_path(Dir,File) => string()
-% Dir, File - string()
-% Given a directory and a file name, return the appended result if the file
-% name does not already contain an absolute path.
-% Dir is supposed to be an absolute path, if it is '.', it is replaced
-% with the current working directory.
-%----------------------------------------
-absolute_path(".",File) ->
- {ok,Cwd} = file:get_cwd(),
- absolute_path(Cwd,File);
-absolute_path(Dir,File) ->
- filename:join(Dir,File).
-
-
-%=============================================================================
-% Start of a tool
-%=============================================================================
-
-%----------------------------------------
-% start_tool({Module,Function,Arguments}, GSobj)
-% Module - atom() Module name
-% Function - atom() Function name
-% Argument - [term()] Function arguments
-% GSobj - gs_obj()
-% Applies the given function in order to start a tool.
-%----------------------------------------
-start_tool({M,F,A}, GSobj) ->
- spawn(fun() -> start_tool(M, F, A, GSobj) end).
-
-start_tool(M,F,A,GSobj) ->
- case catch apply(M,F,A) of
- {'EXIT',Reason} ->
- String1 = io_lib:format("Failed to call apply(~p,~p,~p)",
- [M,F,A]),
- String2 = io_lib:format("Reason: ~p",[Reason]),
- tool_utils:notify(GSobj,[String1,String2]),
- false;
- _ ->
- true
- end.
diff --git a/lib/toolbar/src/toolbar.hrl b/lib/toolbar/src/toolbar.hrl
deleted file mode 100644
index 1793cd1833..0000000000
--- a/lib/toolbar/src/toolbar.hrl
+++ /dev/null
@@ -1,34 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Common data structures %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Tool configuration information
--record(toolinfo,
- {tool,
- start,
- icon=nofile,
- message="",
- html=nofile}).
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
diff --git a/lib/toolbar/src/toolbar_graphics.erl b/lib/toolbar/src/toolbar_graphics.erl
deleted file mode 100644
index c4c4273c63..0000000000
--- a/lib/toolbar/src/toolbar_graphics.erl
+++ /dev/null
@@ -1,404 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(toolbar_graphics).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Description %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Toolbar graphics.
-% The Toolbar window looks something like this:
-%
-% |-----------------------------|
-% | File Tools Help |
-% |-----------------------------|
-% | |-----| |-----| |-----| |
-% | | | | | | | |
-% | |Icon1| |Icon2|...|IconN| |
-% | |-----| |-----| |-----| |
-% |-----------------------------|
-% | Help text area |
-% |-----------------------------|
-%
-%%% Includes %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--include("toolbar.hrl").
-%
-%%% Internal data structures %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Toolbar window record
--record(tbwindow,
- {window,menubar,canvas,labelframe,
- label,helpmenu,
- no_of_buttons,
- min_height,min_width,cur_height,icons}).
-%
-%%% Constants %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Window width
--define(width,215).
-%
-% Icon width and height
--define(icon,34).
-%
-% Margin around icons
--define(pad,0).
-%
-% Default label width and height
--define(wlabel,50).
--define(hlabel,15).
-%
-% Default button width and height
--define(wbutton,50).
--define(hbutton,30).
-%
-%%% Exports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--export([event/4]).
--export([draw_window/1,redraw_window/2,already_added/2,add_icon/2]).
--export([get_window/1]).
--export([cursor/2]).
--export([listen_configure/1]).
--export([display_show/2,display_clear/1]).
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%% Exported functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% event(Data,GsEvent,Data,Args) => Event
-% Data - term()
-% GsEvent - GS event
-% Data, Args - Data and Arg fields associated with the GS event
-% Event - {display,String} | display_clear | noevent | {start,{M,F,A}} |
-% update_toolbar | create_tool_file | add_gs_contribs |
-% {help,Html} | about_help | {redraw,{Width,Height}} | quit |
-% {newData,NewData}
-% String - string()
-% M, F - atom() Module and function name
-% A - [term()] Function argument
-% Html - string() HTML file | nofile
-% Width, Height - integer()
-% NewData - term()
-% Tries to convert a GS event to an internal toolbar event. The separation
-% is intented to keep the implementation details of the graphics hidden
-% for toolbar.erl. Pure graphical events triggered by the GS event will
-% be executed by this function.
-% The Data field is used for saving information between different events
-% (without having to use put/get or ets). Right now it is only used to save
-% the coordinates of the last canvasbutton pressed, making it possible to
-% check if the canvasbutton is released with the mouse moved outside the
-% button (= no action) or with the mouse still inside the button (= action).
-%----------------------------------------
-%%% Mouse enters a icon, display short help message
-event(_LoopData,enter,{canvasbutton,_Cbtn,{_Start,{message,String}}},_Args) ->
- {display,String};
-
-%% Mouse leaves a icon, clear display area
-event(_LoopData,leave,{canvasbutton,_Cbtn,_Data},_Args) ->
- display_clear;
-
-%% An icon is pressed, create graphical illusion of this
-event(_LoopData,buttonpress,{canvasbutton,Canvasbutton,_},_Args) ->
- canvasbutton:press(Canvasbutton),
- {newData,canvasbutton:read(Canvasbutton,coords)};
-
-%% An icon is released, create graphical illusion of this
-event(LoopData,buttonrelease,{canvasbutton,Cbtn,{{start,Start},_Msg}},
- [_,X,Y|_]) ->
- canvasbutton:release(Cbtn),
- case within(X,Y,LoopData) of
- true ->
- {start,Start};
- false ->
- noevent
- end;
-
-%%% Update Toolbar button pressed
-event(_LoopData,click,_Data,["Update Toolbar"|_]) ->
- update_toolbar;
-
-%%% Tool configuration button pressed
-event(_LoopData,click,_Data,["Create Tool File..."|_]) ->
- create_tool_file;
-
-%%% Add GS contribution button pressed
-event(_LoopData,click,_Data,["Add GS Contributions"|_]) ->
- add_gs_contribs;
-
-%%% Help menu button selected
-event(_LoopData,click,{help,Html},_Args) ->
- {help,Html};
-
-%%% About Help menu button selected
-event(_LoopData,click,about_help,_Args) ->
- about_help;
-
-%% Window resized, redraw it
-event(_LoopData,configure,_Data,[Width,Height|_]) ->
- {redraw,{Width,Height}};
-
-%%% Quit button pressed
-event(_LoopData,click,_Data,["Quit"|_]) ->
- quit;
-
-%%% Window closed
-event(_LoopData,destroy,_Data,_Args) ->
- quit;
-
-event(_LoopData,_GsEvent,_Data,_Args) ->
- noevent.
-
-%=============================================================================
-% Main window functions
-%=============================================================================
-
-%----------------------------------------
-% draw_window(S) => Window
-% S - pid() GS
-% Window - tbwindow record
-% This functions create the main window, initially without any tool icons
-%----------------------------------------
-draw_window(S) ->
-
- Norm = ?icon + 2*?pad,
-
- %% Main window
- Win = gs:create(window,S,[{title,"Erlang Tools"},{width,?width}]),
-
- %% Menu bar with menu buttons
- Menubar = gs:create(menubar,Win,[]),
-
- %% File menu
- File = gs:create(menubutton,Menubar,[{label,{text,"File"}},{side,left}]),
- FileM = gs:create(menu,File,[]),
- gs:create(menuitem,FileM,[{label,{text,"Update Toolbar"}}]),
- gs:create(menuitem,FileM,[{label,{text,"Quit"}}]),
-
- %% Tools menu
- Tool = gs:create(menubutton,Menubar,[{label,{text,"Tools"}},{side,left}]),
- ToolM = gs:create(menu,Tool,[]),
- gs:create(menuitem,ToolM,[{label,{text,"Create Tool File..."}}]),
- gs:create(menuitem,ToolM,[{label,{text,"Add GS Contributions"}}]),
-
- %% Help menu
- Help = gs:create(menubutton,Menubar,[{label,{text,"Help"}},{side,right}]),
- HelpM = gs:create(menu,Help,[]),
- gs:create(menuitem,HelpM,[{label,{text,"About..."}},
- {data,about_help}]),
- gs:create(menuitem,HelpM,[{label,{text,"Toolbar"}},
- {data,{help,toolbar_lib:help_file()}}]),
- gs:create(menuitem,HelpM,[{label,{text,"OTP"}},
- {data,{help,toolbar_lib:otp_file()}}]),
- gs:create(menuitem,HelpM,[{itemtype,separator}]),
-
- %% Check height of menu bar
- H = gs:read(Menubar,height),
-
- %% Now the height of the window can be computed
- Height = H+Norm+?hlabel+2*?pad,
- gs:config(Win,{height,Height}),
-
- %% Canvas, here will the Tool canvasbuttons be inserted
- Canvas = gs:create(canvas,Win,[{width,?width},{height,Norm},{x,0},{y,H}]),
-
- %% Label for displaying help messages and the frame containing it
- LabelF = gs:create(frame,Win,[{bg,green},{bw,1},
- {width,?width},{height,?hlabel+2*?pad},
- {x,0},{y,H+Norm}]),
- Label = gs:create(label,LabelF,[{align,w},{height,?hlabel},
- {width,?width},{x,?pad},{y,?pad},
- {label,{text,string:copies(" ",30)}}]),
-
- gs:config(Win,{map,true}),
-
- #tbwindow{window=Win,
- menubar=Menubar,canvas=Canvas,labelframe=LabelF,
- label=Label,helpmenu=HelpM,
- no_of_buttons=0,
- min_height=Height,min_width=?width,cur_height=Height,
- icons=[]}.
-
-%----------------------------------------
-% redraw_window(Window,{NewWidth,NewHeight}) => NewWindow
-% Window, NewWindow - tbwindow record
-% NewWidth, NewHeight - integer()
-% Redraw main window contents according to a new size
-%----------------------------------------
-redraw_window(Window,{NewWidth,NewHeight}) ->
-
- MinWidth = Window#tbwindow.min_width,
- if
- NewWidth=<MinWidth ->
- true;
- true ->
- gs:config(Window#tbwindow.canvas,{width,NewWidth}),
- gs:config(Window#tbwindow.labelframe,{width,NewWidth}),
- gs:config(Window#tbwindow.label,{width,NewWidth-2*?pad})
- end,
-
- MinHeight = Window#tbwindow.min_height,
- if
- NewHeight=<MinHeight ->
- Window;
- true ->
-
- %% Compute size difference
- Diff = NewHeight - Window#tbwindow.cur_height,
-
- %% Resize button frame
- Canvas = Window#tbwindow.canvas,
- gs:config(Canvas,{height,gs:read(Canvas,height)+Diff}),
-
- %% Move label frame accordingly
- LabelF = Window#tbwindow.labelframe,
- gs:config(LabelF,{y,gs:read(LabelF,y)+Diff}),
-
- %% Return updated tbwindow record
- Window#tbwindow{cur_height=NewHeight}
- end.
-
-%----------------------------------------
-% already_added(Window,ToolInfo) => true | false
-% Window - tbwindow record
-% ToolInfo - toolinfo record
-% Returns true if ToolInfo contains information about a tool that
-% is already included in Window
-%----------------------------------------
-already_added(Window,ToolInfo) ->
- already_added2(Window#tbwindow.icons,ToolInfo#toolinfo.tool).
-
-%----------------------------------------
-% already_added2(ToolInfos,Tool) => true | false
-% ToolInfos - [toolinfo record]
-% Tool - atom() Tool name
-%----------------------------------------
-already_added2([#toolinfo{tool=Tool}|_Rest],Tool) ->
- true;
-already_added2([_|Rest],Tool) ->
- already_added2(Rest,Tool);
-already_added2([],_ToolInfo) ->
- false.
-
-%----------------------------------------
-% add_icon(Window,ToolInfo) => NewWindow
-% Window, NewWindow - tbwindow record
-% ToolInfo - toolinfo record
-% Add an icon to the main window
-%----------------------------------------
-add_icon(Window,ToolInfo) ->
- Norm = ?icon + 2*?pad,
-
- %% Extend window if necessary
- N = Window#tbwindow.no_of_buttons,
- ReqWidth = N*Norm+Norm,
- CurWidth = gs:read(Window#tbwindow.window,width),
- if
- ReqWidth>CurWidth ->
- gs:config(Window#tbwindow.window,{width,ReqWidth}),
- gs:config(Window#tbwindow.canvas,{width,ReqWidth}),
- gs:config(Window#tbwindow.labelframe,{width,ReqWidth}),
- gs:config(Window#tbwindow.label,{width,ReqWidth-2*?pad});
- true ->
- true
- end,
-
- %% Insert icon into button frame
- canvasbutton:create(Window#tbwindow.canvas,
- [{image,ToolInfo#toolinfo.icon},
- {x,N*Norm+?pad},{y,?pad},
- {width,?icon},{height,?icon},
- {data,{{start,ToolInfo#toolinfo.start},
- {message,ToolInfo#toolinfo.message}}}]),
-
- %% Insert tool name into help menu (if there is any help available)
- case ToolInfo#toolinfo.html of
- nofile ->
- true;
- Html ->
- gs:create(menuitem,Window#tbwindow.helpmenu,
- [{label,{text,ToolInfo#toolinfo.tool}},
- {data,{help,Html}}])
- end,
-
- MinWidth = gs:read(Window#tbwindow.window,width),
- Window#tbwindow{no_of_buttons=N+1,min_width=MinWidth,
- icons=[ToolInfo|Window#tbwindow.icons]}.
-
-%----------------------------------------
-% get_window(Window) -> gs_obj()
-% Window - tbwindow record
-%----------------------------------------
-get_window(Window) ->
- Window#tbwindow.window.
-
-%----------------------------------------
-% cursor(Window,Cursor)
-% Window - tbwindow record
-% Cursor - arrow | busy
-%----------------------------------------
-cursor(Window,Cursor) ->
- gs:config(Window#tbwindow.window,{cursor,Cursor}).
-
-%----------------------------------------
-% listen_configure(Window)
-% Window - tbwindow record
-% Configure Window to listen for configure events
-%----------------------------------------
-listen_configure(Window) ->
- gs:config(Window#tbwindow.window,{configure,true}).
-
-%----------------------------------------
-% display_show(Window,Text)
-% Window - tbwindow record
-% Text - string()
-% Display text in the help text area
-%----------------------------------------
-display_show(Window,Text) ->
- gs:config(Window#tbwindow.label,{label,{text,Text}}).
-
-%----------------------------------------
-% display_clear(Window)
-% Window - tbwindow record
-% Clear the help text area
-%----------------------------------------
-display_clear(Window) ->
- display_show(Window,"").
-
-%%% Internal functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% within(X,Y,[{Left,Top},{Right,Bot}]) => true | false
-% Return true if {X,Y} is within the given rectangle.
-%----------------------------------------
-within(X,Y,[{L,T},{R,B}]) ->
- if
- X>=L,
- X=<R,
- Y>=T,
- Y=<B ->
- true;
- true ->
- false
- end.
diff --git a/lib/toolbar/src/toolbar_lib.erl b/lib/toolbar/src/toolbar_lib.erl
deleted file mode 100644
index 9d3b9fdeb5..0000000000
--- a/lib/toolbar/src/toolbar_lib.erl
+++ /dev/null
@@ -1,223 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(toolbar_lib).
--include_lib("kernel/include/file.hrl").
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Description %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Library functions
-%
-%%% Exports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--export([gs_contribs_dir/0,help_file/0,otp_file/0]).
--export([error_string/1]).
--export([legal_file/1]).
--export([insert_newlines/1]).
--export([tool_info_syntax/2]).
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%%% Exported functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% gs_contribs_dir() => string()
-% Return the directory of the GS contributions
-%----------------------------------------
-gs_contribs_dir() ->
- filename:join(code:lib_dir(gs),"contribs/ebin/").
-
-%----------------------------------------
-% help_file() => string()
-% Returns the address to the toolbar help file
-%----------------------------------------
-help_file() ->
- filename:join([code:lib_dir(toolbar),"doc", "html", "index.html"]).
-
-%----------------------------------------
-% otp_file() => string()
-% Returns the address to the OTP documentation
-%----------------------------------------
-otp_file() ->
- filename:join([code:root_dir(),"doc", "index.html"]).
-
-%----------------------------------------
-% error_string(Reason) => string()
-% Reason - nofile | format | noname | nostart | illegal | raccess | waccess
-% Given Reason, returns a short "explanation string"
-%----------------------------------------
-error_string(nofile) -> "File does not exist";
-error_string(format) -> "File on wrong format";
-
-error_string(noname) -> "No tool name is specified";
-error_string(nostart) -> "No start function is specified";
-
-error_string(illegal) -> "Illegal file name";
-
-error_string(raccess) -> "File is not readable";
-error_string(waccess) -> "File is not writeable".
-
-%----------------------------------------
-% legal_file(File) => ok | directory | {error,nofile} | {error,raccess}
-% File - string() File name
-% Checks if File is an existing and readable file.
-%----------------------------------------
-legal_file(File) ->
- case file:read_file_info(File) of
-
- %% File exists...
- {ok,#file_info{type=regular,access=Access}} ->
- if
-
- %% ...but is read protected
- Access/=read,
- Access/=read_write ->
- {error,raccess};
-
- %% ...and is possible to read
- true ->
- ok
- end;
-
- {ok,#file_info{type=directory}} ->
- directory;
-
- %% File does not exist
- _Error ->
- {error,nofile}
- end.
-
-%----------------------------------------
-% insert_newlines(Strings) => string()
-% Strings - string() | [string()]
-% If Strings is a list of strings, return a string where all these strings
-% are concatenated with newlines in between, otherwise return Strings.
-%----------------------------------------
-insert_newlines([String|Rest]) when is_list(String), Rest/=[]->
- String ++ "\n" ++ insert_newlines(Rest);
-insert_newlines([Last]) ->
- [Last];
-insert_newlines(Other) ->
- Other.
-
-%----------------------------------------
-% tool_info_syntax(Version,ToolInfo) => {ok,CorrToolInfo} | {error,Reason}
-% Version - string()
-% ToolInfo - tuple()
-% CorrToolInfo - list()
-% Reason - version | format | noname | nostart
-% Return a corrected (blanks removed etc) version of ToolInfo
-% if the syntax of ToolInfo is correct (ie contains all
-% mandatory elements and all values are of the specified type).
-%
-% Currently accepted versions:
-% "0.1" (which should be "1.0")
-% "1.1" (same as "0.1")
-%----------------------------------------
-tool_info_syntax("1.1",ToolInfo) ->
- tool_info_syntax("0.1",ToolInfo);
-tool_info_syntax("0.1",ToolInfo) when is_tuple(ToolInfo) ->
- syntax01(tuple_to_list(ToolInfo),false,false,[]);
-tool_info_syntax("0.1",_) ->
- {error,format};
-tool_info_syntax("1.2",ToolInfo) when is_list(ToolInfo)->
- syntax01(ToolInfo,false,false,[]);
-tool_info_syntax(_Vsn,_) ->
- {error,version}.
-
-
-%%% Internal functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% syntax01(List,NameF,StartF,Res) => {ok,Res} | {error,Reason}
-% List - [tuple()]
-% NameF, StartF - boolean()
-% Res - [tuple()]
-% Reason - format | noname | nostart
-% Version 0.1 syntax check of .tool file.
-%----------------------------------------
-syntax01([{tool,Str}|Rest],false,StartF,Res) when is_list(Str) ->
- case string:strip(Str) of
- [] ->
- {error,format};
- Tool ->
- syntax01(Rest,true,StartF,[{tool,Tool}|Res])
- end;
-syntax01([{start,{M,F,A}}|Rest],NameF,false,Res) when is_atom(M),
- is_atom(F),
- is_list(A) ->
- syntax01(Rest,NameF,true,[{start,{M,F,A}}|Res]);
-syntax01([{icon,Str}|Rest],NameF,StartF,Res) when is_list(Str) ->
- case string:strip(Str) of
- [] ->
- syntax01(Rest,NameF,StartF,Res);
- Icon ->
- syntax01(Rest,NameF,StartF,[{icon,Icon}|Res])
- end;
-syntax01([{message,Str}|Rest],NameF,StartF,Res) when is_list(Str) ->
- case string:strip(Str) of
- [] ->
- syntax01(Rest,NameF,StartF,Res);
- Message ->
- syntax01(Rest,NameF,StartF,
- [{message,lists:sublist(Message,1,30)}|Res])
- end;
-syntax01([{html,Str}|Rest],NameF,StartF,Res) when is_list(Str) ->
- case string:strip(Str) of
- [] ->
- syntax01(Rest,NameF,StartF,Res);
- Html ->
- syntax01(Rest,NameF,StartF,[{html,Html}|Res])
- end;
-%%The fields used by webtool must be removed
-syntax01([_|Rest],NameF,StartF,Res) ->
- syntax01(Rest,NameF,StartF,Res);
-
-syntax01([],true,true,Res) ->
- {ok,Res};
-syntax01([],false,_,_) ->
- {error,noname};
-syntax01([],_,false,_) ->
- {error,nostart};
-syntax01(_,_,_,_) ->
- {error,format}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/toolbar/src/toolbar_toolconfig.erl b/lib/toolbar/src/toolbar_toolconfig.erl
deleted file mode 100644
index 479033fa22..0000000000
--- a/lib/toolbar/src/toolbar_toolconfig.erl
+++ /dev/null
@@ -1,549 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1996-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%
--module(toolbar_toolconfig).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}}]).
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Erlang Toolbar
-%
-%%% Description %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% Tool configuration tool, edit and creates .tool files
-% This tool works separately from the toolbar.
-%
-%%% External data types %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% toolinfo() -- Tool configuration information
--include("toolbar.hrl").
-%
-%%% Internal data types %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% tfwindow() -- Toolfile configuration window
--record(tfwindow,
- {window,
- fileentry,
- toolentry,moduleentry,functionentry,
- iconentry,messageentry,htmlentry,
- label}).
-%
-%%% Exports %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
--export([start/0]).
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
--export([init/0]). % spawn
-
-
-%%% Exported functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%----------------------------------------
-% start() => pid()
-%----------------------------------------
-start() ->
- spawn(toolbar_toolconfig,init,[]).
-
-
-%%% Internal functions %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-%=============================================================================
-% Main loop
-%=============================================================================
-
-%----------------------------------------
-% init()
-%----------------------------------------
-init() ->
-
- %% Start GS (or get the pid if it is already running)
- S = gs:start(),
-
- %% Draw the window
- Window = draw_window(S),
-
- loop(S,Window).
-
-%----------------------------------------
-% loop(S,Window)
-% S - pid() GS
-% Window - tfwindow()
-%----------------------------------------
-loop(S,Window) ->
- receive
-
- %% 'Return' pressed in the 'File' entry
- {gs,_Obj,keypress,file,['Return'|_]} ->
-
- %% Check if a file name is specified
- case string:strip(gs:read(Window#tfwindow.fileentry,text)) of
-
- %% No file name specified, move focus to next entry
- "" ->
- move_focus(Window,file);
-
- %% A name is specified
- String ->
-
- %% Add a .tool suffix to the file name if necessary
- FileName = tool_file(String),
-
- %% Write the complete file name to the file entry
- gs:config(Window#tfwindow.fileentry,{text,FileName}),
-
- %% Try to open the file
- case file:consult(FileName) of
-
- %% File exists and seems ok
- {ok,[{version,Vsn},T]} ->
-
- %% Check the syntax of the file contents
- %% (All mandatory information specified,
- %% correct types, etc)
- case toolbar_lib:tool_info_syntax(Vsn,T) of
-
- %% Ok -- Show the file contents in the window
- %% and move focus to the next entry
- {ok,Info} ->
- display(Window,"File: "++FileName++
- " opened"),
- clear_info(Window),
- show_info(Window,Info),
- move_focus(Window,file);
-
- %% Erroneous version number -- Notify user
- {error,version} ->
- Win = Window#tfwindow.window,
- tool_utils:notify(Win,[FileName,
- "File has wrong version number"]);
-
- %% Other error -- Notify user
- _Error ->
- Win = Window#tfwindow.window,
- tool_utils:notify(Win,[FileName,
- "File is in erroneous format"])
- end;
-
- %% The file can not be read, show default values
- %% according to the file name in the window and
- %% move focus to the next entry
- _ ->
- display(Window,"File: "++FileName ++
- " could not be read, new file"),
- Tool = filename:basename(FileName,".tool"),
- clear_info(Window),
- show_info(Window,[{tool,Tool},
- {start,{list_to_atom(Tool),
- start,[]}},
- {icon,Tool++".gif"},
- {html,Tool++".html"}]),
- move_focus(Window,file)
- end
- end,
- loop(S,Window);
-
- %% 'Return' pressed in another entry, move focus to next entry
- {gs,_Obj,keypress,Focus,['Return'|_]} ->
- move_focus(Window,Focus),
- loop(S,Window);
-
- %% Any oher keypress, clear the display
- {gs,_Obj,keypress,_Data,_Args} ->
- display_clear(Window),
- loop(S,Window);
-
- %% 'Clear' button pressed, clear the window
- {gs,_Obj,click,_Data,["Clear"|_]} ->
- clear_info(Window),
- loop(S,Window);
-
- %% 'Save' button pressed, save the given information to file
- {gs,_Obj,click,_Data,["Save"|_]} ->
-
- %% Check if a file name is specified
- case string:strip(gs:read(Window#tfwindow.fileentry,text)) of
-
- %% No file name specified, notify user
- "" ->
- Win = Window#tfwindow.window,
- tool_utils:notify(Win,
- "A file name must be specified");
-
- %% A name is specified
- String ->
-
- %% Add a .tool suffix to the file name if necessary
- FileName = tool_file(String),
-
- %% Write the complete file name to the file entry
- gs:config(Window#tfwindow.fileentry,{text,FileName}),
-
- %% Check the other information given
- case check_info(Window) of
-
- %% If given info is correct, try to save
- %% it to the file
- {ok,ToolInfo} ->
- Win = Window#tfwindow.window,
- case save_info(Win,FileName,ToolInfo) of
-
- %% Ok, display confirmation
- ok ->
- display(Window,
- "Tool information saved to "++
- FileName);
-
- %% Cancel, do nothing
- cancel ->
- ignore;
-
- %% Error, display error message
- {error,Reason} ->
- display(Window,
- toolbar_lib:error_string(Reason)++
- FileName)
- end;
-
- %% Given info incorrect, notify user
- {error,Reason} ->
- Win = Window#tfwindow.window,
- Str = toolbar_lib:error_string(Reason),
- tool_utils:notify(Win,Str)
- end
- end,
- loop(S,Window);
-
- %% 'Stop' button, close window and exit
- {gs,_Obj,click,_Data,["Stop"|_]} ->
- gs:destroy(Window#tfwindow.window),
- finished;
-
- %% Window closed, exit
- {gs,_Obj,destroy,_Data,_Args} ->
- finished;
-
- Other ->
- io:format("toolbar_toolconfig: unexp msg: ~p~n",[Other]),
- loop(S,Window)
- end.
-
-
-%=============================================================================
-% Graphics
-%=============================================================================
-
-%----------------------------------------
-% draw_window(S)
-% S - pid() GS
-% Draw the main window.
-%----------------------------------------
-draw_window(S) ->
-
- %% ----- Open a new window -----
- Win = gs:create(window,S,[{width,400},{height,390},
- {title,"Create Tool File"}]),
-
- %% ----- Top frame containing a 'File name' label and entry -----
- Top = gs:create(frame,Win,[{x,0},{y,0},{width,400},{height,60},{bw,2},
- {keypress,true}]),
-
- %% File name
- gs:create(label,Top,[{x,10},{y,10},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"File name:"}}]),
- File = gs:create(entry,Top,[{x,110},{y,10},{width,280},{height,30},
- {keypress,true},{data,file}]),
-
- %% ----- Middle frame containing other labels and entries -----
- Mid = gs:create(frame,Win,[{x,0},{y,60},{width,400},{height,250},{bw,2},
- {keypress,true}]),
-
- %% Tool name
- gs:create(label,Mid,[{x,10},{y,10},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"Tool name:"}}]),
- Tool = gs:create(entry,Mid,[{x,110},{y,10},{width,280},{height,30},
- {keypress,true},{data,tool}]),
-
- %% Start function
- gs:create(label,Mid,[{x,10},{y,60},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"Start:"}}]),
- Mod = gs:create(entry,Mid,[{x,110},{y,60},{width,135},{height,30},
- {keypress,true},{data,module}]),
- Fun = gs:create(entry,Mid,[{x,245},{y,60},{width,135},{height,30},
- {keypress,true},{data,function}]),
-
- %% Icon file
- gs:create(label,Mid,[{x,10},{y,110},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"Icon file:"}}]),
- Icon = gs:create(entry,Mid,[{x,110},{y,110},{width,280},{height,30},
- {keypress,true},{data,icon}]),
-
- %% Message
- gs:create(label,Mid,[{x,10},{y,160},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"Message:"}}]),
- Msg = gs:create(entry,Mid,[{x,110},{y,160},{width,280},{height,30},
- {keypress,true},{data,message}]),
-
- %% HTML file
- gs:create(label,Mid,[{x,10},{y,210},{width,80},{height,30},{align,e},
- {keypress,true},
- {label,{text,"HTML:"}}]),
- Html = gs:create(entry,Mid,[{x,110},{y,210},{width,280},{height,30},
- {keypress,true},{data,html}]),
-
- %% ----- Bottom frame containing the buttons -----
- Bot = gs:create(frame,Win,[{x,0},{y,310},{width,400},{height,50},
- {bw,2},{keypress,true}]),
-
- gs:create(button,Bot,[{x,75},{y,10},{width,50},{height,30},
- {keypress,true},
- {label,{text,"Clear"}}]),
- gs:create(button,Bot,[{x,175},{y,10},{width,50},{height,30},
- {keypress,true},
- {label,{text,"Save"}}]),
- gs:create(button,Bot,[{x,275},{y,10},{width,50},{height,30},
- {keypress,true},
- {label,{text,"Stop"}}]),
-
- %% ----- Label for displaying help messages -----
- Lbl = gs:create(label,Win,[{x,0},{y,360},{width,400},{height,30},{bw,2},
- {relief,raised},
- {keypress,true},
- {align,c},{label,{text,""}}]),
-
- gs:config(Win,{map,true}),
- gs:config(File,{setfocus,true}),
-
- #tfwindow{window=Win,
- fileentry=File,
- toolentry=Tool,
- moduleentry=Mod,
- functionentry=Fun,
- iconentry=Icon,
- messageentry=Msg,
- htmlentry=Html,
- label=Lbl}.
-
-%----------------------------------------
-% move_focus(Window,Focus)
-% Window - tfwindow()
-% Focus - file | tool | module | function | icon | message | html | none
-% Move the input focus to the entry following Focus
-%----------------------------------------
-move_focus(Window,file) ->
- gs:config(Window#tfwindow.toolentry,{setfocus,true});
-move_focus(Window,tool) ->
- gs:config(Window#tfwindow.moduleentry,{setfocus,true});
-move_focus(Window,module) ->
- gs:config(Window#tfwindow.functionentry,{setfocus,true});
-move_focus(Window,function) ->
- gs:config(Window#tfwindow.iconentry,{setfocus,true});
-move_focus(Window,icon) ->
- gs:config(Window#tfwindow.messageentry,{setfocus,true});
-move_focus(Window,message) ->
- gs:config(Window#tfwindow.htmlentry,{setfocus,true});
-move_focus(Window,html) ->
- gs:config(Window#tfwindow.htmlentry,{setfocus,false});
-move_focus(_Window,none) ->
- true.
-
-%----------------------------------------
-% display(Window,Text)
-% Window - tfwindow()
-% Text - string()
-% Display a help message in the window
-%----------------------------------------
-display(Window,Text) ->
- gs:config(Window#tfwindow.label,{label,{text,Text}}).
-
-%----------------------------------------
-% display_clear(Window)
-% Window - tfwindow()
-% Clear the help message display
-%----------------------------------------
-display_clear(Window) ->
- display(Window,"").
-
-%----------------------------------------
-% clear_info(Window)
-% Window - tfwindow()
-% Clear the entries of Window (except the file entry)
-%----------------------------------------
-clear_info(Window) ->
- gs:config(Window#tfwindow.toolentry,{text,""}),
- gs:config(Window#tfwindow.moduleentry,{text,""}),
- gs:config(Window#tfwindow.functionentry,{text,""}),
- gs:config(Window#tfwindow.iconentry,{text,""}),
- gs:config(Window#tfwindow.messageentry,{text,""}),
- gs:config(Window#tfwindow.htmlentry,{text,""}).
-
-%----------------------------------------
-% show_info(Window,List)
-% Window - tfwindow()
-% List - [{Key,Val}]
-% Key - tool, Val - string()
-% Key - start, Val - {atom(),atom(),_}
-% Key - icon, Val - string()
-% Key - message, Val - string()
-% Key - html, Val - string()
-% Display the different Val's in the appropriate entries of Window
-%----------------------------------------
-show_info(_Window,[]) ->
- ok;
-show_info(Window,[{tool,Tool}|Rest]) ->
- gs:config(Window#tfwindow.toolentry,{text,Tool}),
- show_info(Window,Rest);
-show_info(Window,[{start,{M,F,_}}|Rest]) ->
- gs:config(Window#tfwindow.moduleentry,{text,M}),
- gs:config(Window#tfwindow.functionentry,{text,F}),
- show_info(Window,Rest);
-show_info(Window,[{icon,Icon}|Rest]) ->
- gs:config(Window#tfwindow.iconentry,{text,Icon}),
- show_info(Window,Rest);
-show_info(Window,[{message,Message}|Rest]) ->
- gs:config(Window#tfwindow.messageentry,{text,Message}),
- show_info(Window,Rest);
-show_info(Window,[{html,Html}|Rest]) ->
- gs:config(Window#tfwindow.htmlentry,{text,Html}),
- show_info(Window,Rest).
-
-
-%=============================================================================
-% Retrieve user specified information
-%=============================================================================
-
-%----------------------------------------
-% check_info(Window) => {ok,ToolInfo} | {error,Reason}
-% Window - tfwindow()
-% ToolInfo - toolinfo()
-% Reason - noname | nostart
-% Check the information given in the entries and insert it into ToolInfo
-% if all mandatory information is given.
-%----------------------------------------
-check_info(Window) ->
-
- %% First check mandatory elements: name and start function
- Tool = gs:read(Window#tfwindow.toolentry,text),
- M = gs:read(Window#tfwindow.moduleentry,text),
- F = gs:read(Window#tfwindow.functionentry,text),
-
- if
- Tool/="",M/="",F/="" ->
- ToolInfo =
- #toolinfo{tool=Tool,
- start={list_to_atom(M),list_to_atom(F),[]},
- icon=gs:read(Window#tfwindow.iconentry,text),
- message=gs:read(Window#tfwindow.messageentry,text),
- html=gs:read(Window#tfwindow.htmlentry,text)},
- {ok,ToolInfo};
-
- Tool=="" ->
- {error,noname};
-
- true ->
- {error,nostart}
- end.
-
-
-%=============================================================================
-% Save information to file
-%=============================================================================
-
-%----------------------------------------
-% save_info(Win,File,ToolInfo) => ok | cancel | {error,waccess}
-% Win - GS object
-% File - string()
-% ToolInfo - toolinfo()
-% Saves the information in ToolInfo to File on a predefined format.
-%----------------------------------------
-save_info(Win,File,ToolInfo) ->
-
- %% First check if file already exists
- case file:read_file_info(File) of
- {ok,_FileInfo} ->
-
- %% Request the user to confirm that the file should
- %% be overwritten
- case tool_utils:confirm(Win,[File,
- "exists, will be overwritten"]) of
- ok ->
- save_info2(File,ToolInfo);
- cancel ->
- cancel
- end;
-
- {error,_Reason} -> % _Reason = "No such file or directory"
- save_info2(File,ToolInfo)
- end.
-
-%----------------------------------------
-% save_info2(File,ToolInfo) => ok | {error,waccess}
-% File - string() File name
-% ToolInfo - toolinfo record
-% Called by save_info/3
-%----------------------------------------
-save_info2(File,ToolInfo) ->
- case file:open(File, [write]) of
- {ok,Fd} ->
- io:format(Fd,"{version,\"~s\"}.~n",[toolbar:version()]),
- io:format(Fd,"{{tool,\"~s\"},~n",[ToolInfo#toolinfo.tool]),
- io:format(Fd," {start,~w}",[ToolInfo#toolinfo.start]),
- case ToolInfo#toolinfo.icon of
- "" -> ignore;
- Icon -> io:format(Fd,",~n {icon,\"~s\"}",[Icon])
- end,
- case ToolInfo#toolinfo.message of
- "" -> ignore;
- Message -> io:format(Fd,",~n {message,\"~s\"}",[Message])
- end,
- case ToolInfo#toolinfo.html of
- "" -> ignore;
- Html -> io:format(Fd,",~n {html,\"~s\"}",[Html])
- end,
- io:format(Fd,"}.~n",[]),
- file:close(Fd),
- ok;
- _Error ->
- {error,waccess}
- end.
-
-
-%=============================================================================
-% Auxiliary functions
-%=============================================================================
-
-%----------------------------------------
-% tool_file(File) => string()
-% File - string()
-% Return a file name consisting of File with the suffix .tool added,
-% if File does not already have this suffix.
-%----------------------------------------
-tool_file(File) ->
- case filename:extension(File) of
- ".tool" -> File;
- _ -> File ++ ".tool"
- end.
diff --git a/lib/toolbar/vsn.mk b/lib/toolbar/vsn.mk
deleted file mode 100644
index e84fb4e37b..0000000000
--- a/lib/toolbar/vsn.mk
+++ /dev/null
@@ -1,10 +0,0 @@
-TOOLBAR_VSN = 1.4.2.3
-
-
-
-
-
-
-
-
-
diff --git a/lib/tools/emacs/erlang-skels.el b/lib/tools/emacs/erlang-skels.el
index 527e812444..7379215d68 100644
--- a/lib/tools/emacs/erlang-skels.el
+++ b/lib/tools/emacs/erlang-skels.el
@@ -109,32 +109,32 @@ include separators of the form %%--...")
;; Expression templates:
(defvar erlang-skel-case
'((erlang-skel-skip-blank) o >
- "case " p " of" n> p "_ ->" n> p "ok" n> "end" p)
+ "case " p " of" n> p "_ ->" n> p "ok" n "end" > p)
"*The skeleton of a `case' expression.
Please see the function `tempo-define-template'.")
(defvar erlang-skel-if
'((erlang-skel-skip-blank) o >
- "if" n> p " ->" n> p "ok" n> "end" p)
+ "if" n> p " ->" n> p "ok" n "end" > p)
"The skeleton of an `if' expression.
Please see the function `tempo-define-template'.")
(defvar erlang-skel-receive
'((erlang-skel-skip-blank) o >
- "receive" n> p "_ ->" n> p "ok" n> "end" p)
+ "receive" n> p "_ ->" n> p "ok" n "end" > p)
"*The skeleton of a `receive' expression.
Please see the function `tempo-define-template'.")
(defvar erlang-skel-receive-after
'((erlang-skel-skip-blank) o >
- "receive" n> p "_ ->" n> p "ok" n> "after " p "T ->" n>
- p "ok" n> "end" p)
+ "receive" n> p "_ ->" n> p "ok" n "after " > p "T ->" n>
+ p "ok" n "end" > p)
"*The skeleton of a `receive' expression with an `after' clause.
Please see the function `tempo-define-template'.")
(defvar erlang-skel-receive-loop
'(& o "loop(" p ") ->" n> "receive" n> p "_ ->" n>
- "loop(" p ")" n> "end.")
+ "loop(" p ")" n "end." >)
"*The skeleton of a simple `receive' loop.
Please see the function `tempo-define-template'.")
@@ -256,8 +256,8 @@ Please see the function `tempo-define-template'.")
"loop(From) ->" n>
"receive" n>
p "_ ->" n>
- "loop(From)" n>
- "end." n
+ "loop(From)" n
+ "end." > n
)
"*Template of a small server.
Please see the function `tempo-define-template'.")
@@ -291,8 +291,8 @@ Please see the function `tempo-define-template'.")
"{ok, Pid} ->" n>
"{ok, Pid};" n>
"Error ->" n>
- "Error" n>
- "end." n
+ "Error" n
+ "end." > n
n
(erlang-skel-separator-start 2)
"%% @private" n
@@ -421,8 +421,8 @@ Please see the function `tempo-define-template'.")
"{ok, Pid} ->" n>
"{ok, Pid, #state{}};" n>
"Error ->" n>
- "Error" n>
- "end." n
+ "Error" n
+ "end." > n
n
(erlang-skel-separator-start 2)
"%% @private" n
diff --git a/lib/tools/emacs/erlang.el b/lib/tools/emacs/erlang.el
index c1e9bec6ae..3a868f1300 100644
--- a/lib/tools/emacs/erlang.el
+++ b/lib/tools/emacs/erlang.el
@@ -73,6 +73,8 @@
;; M-x set-variable RET debug-on-error RET t RET
;;; Code:
+(eval-when-compile (require 'cl))
+
;; Variables:
(defconst erlang-version "2.7"
@@ -620,7 +622,6 @@ resulting regexp is surrounded by \\_< and \\_>."
"if"
"let"
"of"
- "query"
"receive"
"try"
"when")
@@ -2608,7 +2609,7 @@ Value is list (stack token-start token-type in-what)."
(erlang-skip-blank to)))
(eq (following-char) ?\())
(erlang-push (list 'fun token (current-column)) stack)))
- ((looking-at "\\(begin\\|query\\)[^_a-zA-Z0-9]")
+ ((looking-at "\\(begin\\)[^_a-zA-Z0-9]")
(erlang-push (list 'begin token (current-column)) stack))
;; Normal when case
;;((looking-at "when\\s ")
@@ -3044,7 +3045,7 @@ This assumes that the preceding expression is either simple
\(i.e. an atom) or parenthesized."
(save-excursion
(or arg (setq arg 1))
- (forward-sexp (- arg))
+ (ignore-errors (forward-sexp (- arg)))
(let ((col (current-column)))
(skip-chars-backward " \t")
;; Special hack to handle: (note line break)
@@ -3118,7 +3119,7 @@ This assumes that the preceding expression is either simple
(defun erlang-at-keyword ()
"Are we looking at an Erlang keyword which will increase indentation?"
- (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|query\\|"
+ (looking-at (concat "\\(when\\|if\\|fun\\|case\\|begin\\|"
"of\\|receive\\|after\\|catch\\|try\\)[^_a-zA-Z0-9]")))
(defun erlang-at-operator ()
@@ -3651,6 +3652,10 @@ Normally used in conjunction with `erlang-beginning-of-clause', e.g.:
(setq cont nil))
((looking-at "\\s *\\($\\|%\\)")
(forward-line 1))
+ ((looking-at "\\s *<<[^>]*?>>")
+ (when (zerop res)
+ (setq res (+ 1 res)))
+ (goto-char (match-end 0)))
((looking-at "\\s *,")
(setq res (+ 1 res))
(goto-char (match-end 0)))
@@ -3932,7 +3937,7 @@ non-whitespace characters following the point on the current line."
(self-insert-command arg)
;; Was this the second char in bit-syntax open (`<<')?
- (unless (< (point) 2)
+ (unless (<= (point) 2)
(save-excursion
(backward-char 2)
(when (and (eq (char-after (point)) ?<)
@@ -3953,7 +3958,7 @@ non-whitespace characters following the point on the current line."
(defun erlang-after-bitsyntax-close ()
"Return t if point is immediately after a bit-syntax close parenthesis (`>>')."
- (and (>= (point) 2)
+ (and (>= (point) 3)
(save-excursion
(backward-char 2)
(and (eq (char-after (point)) ?>)
diff --git a/lib/tools/emacs/test.erl.indented b/lib/tools/emacs/test.erl.indented
index 0de626125c..0dc1b47f0d 100644
--- a/lib/tools/emacs/test.erl.indented
+++ b/lib/tools/emacs/test.erl.indented
@@ -744,3 +744,8 @@ commas_first() ->
] }
]
}.
+
+
+%% this used to result in a scan-sexp error
+[{
+ }].
diff --git a/lib/tools/emacs/test.erl.orig b/lib/tools/emacs/test.erl.orig
index 57263d573b..c7d2dc4ce5 100644
--- a/lib/tools/emacs/test.erl.orig
+++ b/lib/tools/emacs/test.erl.orig
@@ -744,3 +744,8 @@ commas_first() ->
] }
]
}.
+
+
+%% this used to result in a scan-sexp error
+[{
+}].
diff --git a/lib/tools/test/xref_SUITE.erl b/lib/tools/test/xref_SUITE.erl
index 3e9eaf259c..353275ae3b 100644
--- a/lib/tools/test/xref_SUITE.erl
+++ b/lib/tools/test/xref_SUITE.erl
@@ -1098,6 +1098,7 @@ read_expected(Version) ->
{POS1+1,{FF,{mod17,fun17,0}}},
{POS1+2,{FF,{erlang,spawn,1}}},
{POS1+2,{FF,{read,local,0}}},
+ {POS1+3,{FF,{erlang,binary_to_term,1}}},
{POS1+3,{FF,{erlang,spawn,1}}},
{POS1+4,{FF,{dist,func,0}}},
{POS1+4,{FF,{erlang,spawn,1}}},
@@ -1206,7 +1207,6 @@ read_expected(Version) ->
OKB1 = [{POS13+1,{FF,{erts_debug,apply,4}}},
{POS13+2,{FF,{erts_debug,apply,4}}},
{POS13+3,{FF,{erts_debug,apply,4}}},
- {POS1+3, {FF,{erlang,binary_to_term,1}}},
{POS3+1, {FF,{erlang,spawn,3}}},
{POS3+2, {FF,{erlang,spawn,3}}},
{POS3+3, {FF,{erlang,spawn_link,3}}},
diff --git a/lib/tv/AUTHORS b/lib/tv/AUTHORS
deleted file mode 100644
index 7736a75b2f..0000000000
--- a/lib/tv/AUTHORS
+++ /dev/null
@@ -1,5 +0,0 @@
-Original Authors and Contributors:
-
-Fredrik Gustafson
-
-
diff --git a/lib/tv/Makefile b/lib/tv/Makefile
deleted file mode 100644
index 1c6d4b54f6..0000000000
--- a/lib/tv/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2009. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-SUB_DIRECTORIES = src priv doc/src
-
-include vsn.mk
-VSN = $(TV_VSN)
-
-SPECIAL_TARGETS =
-
-# ----------------------------------------------------
-# Default Subdir Targets
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_subdir.mk
diff --git a/lib/tv/doc/html/.gitignore b/lib/tv/doc/html/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tv/doc/html/.gitignore
+++ /dev/null
diff --git a/lib/tv/doc/man3/.gitignore b/lib/tv/doc/man3/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tv/doc/man3/.gitignore
+++ /dev/null
diff --git a/lib/tv/doc/pdf/.gitignore b/lib/tv/doc/pdf/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tv/doc/pdf/.gitignore
+++ /dev/null
diff --git a/lib/tv/doc/src/Makefile b/lib/tv/doc/src/Makefile
deleted file mode 100644
index 413eb8f634..0000000000
--- a/lib/tv/doc/src/Makefile
+++ /dev/null
@@ -1,138 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../../vsn.mk
-VSN=$(TV_VSN)
-APPLICATION=tv
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN)
-
-# ----------------------------------------------------
-# Target Specs
-# ----------------------------------------------------
-XML_APPLICATION_FILES = ref_man.xml
-XML_REF3_FILES = tv.xml
-
-XML_PART_FILES = \
- part.xml \
- part_notes.xml
-
-XML_CHAPTER_FILES = \
- table_visualizer_chapter.xml \
- notes.xml
-
-BOOK_FILES = book.xml
-
-XML_FILES = \
- $(BOOK_FILES) $(XML_CHAPTER_FILES) \
- $(XML_PART_FILES) $(XML_REF3_FILES) $(XML_APPLICATION_FILES)
-
-GIF_FILES = tv_start.gif \
- tv_start_mnesia.gif \
- tv_start_system.gif \
- tv_start_system_unreadable.gif \
- tv_start_pid_sorted.gif \
- tv_start_other_node.gif \
- tv_table_browser.gif \
- tv_table_browser_updated.gif \
- set_poll_int.gif \
- tv_record_editor_mnesia.gif \
- tv_search_window.gif \
- tv_search_result.gif \
- tv_row_marked.gif \
- tv_row_marked_popup.gif \
- info_window.gif \
- tv_create_table.gif
-
-# ----------------------------------------------------
-
-HTML_FILES = $(XML_APPLICATION_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_PART_FILES:%.xml=$(HTMLDIR)/%.html)
-
-INFO_FILE = ../../info
-EXTRA_FILES = \
- $(DEFAULT_GIF_FILES) \
- $(DEFAULT_HTML_FILES) \
- $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \
- $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html)
-
-MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3)
-
-HTML_REF_MAN_FILE = $(HTMLDIR)/index.html
-
-TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf
-
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-XML_FLAGS +=
-DVIPS_FLAGS +=
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-$(HTMLDIR)/%.gif: %.gif
- $(INSTALL_DATA) $< $@
-
-docs: pdf html man
-
-$(TOP_PDF_FILE): $(XML_FILES)
-
-pdf: $(TOP_PDF_FILE)
-
-html: gifs $(HTML_REF_MAN_FILE)
-
-
-clean clean_docs:
- rm -rf $(HTMLDIR)/*
- rm -f $(MAN3DIR)/*
- rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo)
- rm -f errs core *~
-
-man: $(MAN3_FILES)
-
-gifs: $(GIF_FILES:%=$(HTMLDIR)/%)
-
-debug opt:
-
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_docs_spec: docs
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DATA) $(TOP_PDF_FILE) "$(RELSYSDIR)/doc/pdf"
- $(INSTALL_DIR) "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(HTMLDIR)/* \
- "$(RELSYSDIR)/doc/html"
- $(INSTALL_DATA) $(INFO_FILE) "$(RELSYSDIR)"
- $(INSTALL_DIR) "$(RELEASE_PATH)/man/man3"
- $(INSTALL_DATA) $(MAN3_FILES) "$(RELEASE_PATH)/man/man3"
-
-release_spec:
-
diff --git a/lib/tv/doc/src/book.xml b/lib/tv/doc/src/book.xml
deleted file mode 100644
index b0d05d290b..0000000000
--- a/lib/tv/doc/src/book.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE book SYSTEM "book.dtd">
-
-<book xmlns:xi="http://www.w3.org/2001/XInclude">
- <header titlestyle="normal">
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>Table Visualizer (TV)</title>
- <prepared></prepared>
- <docno></docno>
- <date></date>
- <rev>2.0.3</rev>
- </header>
- <insidecover>
- </insidecover>
- <pagetext>Table Visualizer (TV)</pagetext>
- <preamble>
- </preamble>
- <parts lift="no">
- <xi:include href="part.xml"/>
- </parts>
- <applications>
- <xi:include href="ref_man.xml"/>
- </applications>
- <releasenotes>
- <xi:include href="notes.xml"/>
- </releasenotes>
- <listofterms></listofterms>
- <index></index>
-</book>
-
-
diff --git a/lib/tv/doc/src/fascicules.xml b/lib/tv/doc/src/fascicules.xml
deleted file mode 100644
index c075478967..0000000000
--- a/lib/tv/doc/src/fascicules.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE fascicules SYSTEM "fascicules.dtd">
-
-<fascicules>
- <fascicule file="part" href="part_frame.html" entry="no">
- User's Guide
- </fascicule>
- <fascicule file="ref_man" href="ref_man_frame.html" entry="yes">
- Reference Manual
- </fascicule>
- <fascicule file="part_notes" href="part_notes_frame.html" entry="no">
- Release Notes
- </fascicule>
- <fascicule file="" href="../../../../doc/print.html" entry="no">
- Off-Print
- </fascicule>
-</fascicules>
-
-
diff --git a/lib/tv/doc/src/info_window.gif b/lib/tv/doc/src/info_window.gif
deleted file mode 100644
index 7913fc4230..0000000000
--- a/lib/tv/doc/src/info_window.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/info_window.ps b/lib/tv/doc/src/info_window.ps
deleted file mode 100644
index b459523d0f..0000000000
--- a/lib/tv/doc/src/info_window.ps
+++ /dev/null
@@ -1,814 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./info_window.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:12:33 2001)
-%%BoundingBox: 0 60 377 354
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 60 377 354
-userdict begin
-%%BeginData:
-DisplayImage
-0 60
-377.000000 294.000000
-12
-590 460
-1
-0
-0
-8
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-828282
-000a01ff01ff0137000b0208040001ff01ff013700000208040000000208040002ff02ff
-0237000002080400000002080400020000ff00ff00340400020000000208040000000202
-04060200000004ff04ff0434020000000405020204000000020204000209000d02ff02ff
-022b00000202040000000202040002080000020d040002ea010102060101021d01020229
-010102e700000202040000000202040002080000020d040002d801070209010102060101
-020e0101020b0101022601000203010102e700000202040000000202040002080000020d
-040002db0101020c010102060101020e0101020b01010225010102ed0000020204000000
-0202040002080000020204060203040002db010102040103020301010200010102030101
-020201030207010102020101020001010202010402010103020201010200010102010101
-020001010201010102030103020101040201010102020103020301010200010102d70000
-02020400000004030208000002020400030400000203040002db01010203010102010101
-020201020200010102020101020101010201010102060101020201020200010102020101
-020201010201010102010101020001010201010202000102020001010201010102010101
-02010101020301010201010102010101020201020200010102d6000004030101020b0000
-02030400030200000204040002db01010207010102020101020101010202010102010101
-020101010206010102020101020101010202010102020101020101010201010202030101
-020101010201010102050101020101010203010102010101020101010202010102010101
-02d90103020b000002030400030200000204040002db0101020401040202010102010101
-020201010201010502060101020201010201010102020101020201010201010102010101
-020401010201010102010101020201040201010102030101020101010201010102020101
-0201010102d90103020b000002040400030000000205040002db01010203010102010101
-02020101020101010202010102010101020a010102020101020101010202010102020101
-020101010201010102040101020101010201010102010101020101010201010102030101
-0201010102010101020201010201010102d90103020b0000020404000300000002050400
-02db01010203010102010101020201010201010102020101020101010202010002060101
-020201010201010102020101020201010201010102010101020401010201010102010101
-020101010201010102010101020301010201010102010101020201010201010102d90103
-020b0000020500000206040002db01010204010202000101020101040203010102020103
-020701010202010102010101020201010203010302020101020401010201010102010101
-0202010202000101020101020201010102020103020301010201010102d90103020b0000
-020d040002ff02ff022d0103020b0000020d040002ff02ff022d0103020b0000020d0400
-02ff02ff022d0103020c040d02ff02ff022e010302ff02ff0249010302ff02ff02490103
-020200ff00ff00420400020201030202000004ff04ff04420202010302ff02ff02490103
-020200ff00ff004302020103020200ff00ff00420700020201030202000105ff05ff053f
-0701020201030202000105ff05ff053f0701020201030202000105ff05ff053f07010202
-01030202000105ff05ff053f0701020201030202000105ff05ff053f0701020201030202
-0001050b0604050406000503060205ff05ff052107010202010302020001050b0600050f
-060005ff05ff052107010202010302020001050b060005060602050506000503060205ff
-05ff051a07010202010302020001050b06000508060005050600050206000502060005ff
-05ff051907010202010302020001050b06030505060005050600050206000502060005ff
-05ff051907010202010302020001050b060005080600050506000502060405ff05ff0519
-07010202010302020001050b060005080600050506000502060005ff05ff051d07010202
-010302020001050b06000508060005050600050206000502060005ff05ff051907010202
-010302020001050b060005080600050506000503060205ff05ff051a0701020201030202
-000105ff05ff053f07010202010302020001050a060605ff05ff052d0701020201030202
-0001050a060605ff05ff052d0701020201030202000105ff05ff053f0701020201030202
-000105ff05ff053f0701020201030202000105ff05ff053f0701020201030202000107ff
-07ff0741020201030202000007ff07ff074202020103020205ff05ff0543020201030202
-05ff05ff054302020103020205ff05ff054302020103020205ff05ff0543020201030202
-05ff05ff054302020103020205ff05ff054302020103020205ff05ff0543020201030202
-05ff05ff054302020103020205ff05ff054302020103020205ff05ff0543020201030202
-05ff05ff0543020201030202050400770501007705010077050100770558020201030202
-050400760700050100760700050100760700050100760700055802020103020205040001
-057307010501000105730701050100010573070105010001057307010558020201030202
-050400010573070105010001057307010501000105730701050100010573070105580202
-010302020504000105730701050100010573070105010001057307010501000105730701
-055802020103020205040001057307010501000105730701050100010573070105010001
-057307010558020201030202050400010573070105010001057307010501000105730701
-050100010573070105580202010302020504000105730701050100010573070105010001
-057307010501000105730701055802020103020205040001057307010501000105730701
-050100010573070105010001057307010558020201030202050400010573070105010001
-057307010501000105730701050100010573070105580202010302020504000105730701
-050100010573070105010001057307010501000105730701055802020103020205040001
-057307010501000105730701050100010573070105010001057307010558020201030202
-05040001051d010405080100050601020510010405050100051f07010501000105080102
-0514010005110102050b010005050100050601000520070105010001052c010205050100
-053c070105010001052101020504010005480701055802020103020205040001051f0100
-050a0100050801000512010005070100051f070105010001050801000501010005250100
-05020100050a0100050501000528070105010001052b0100050201000542070105010001
-05200100050201000503010005480701055802020103020205040001051f010005040102
-05020100050001010505010005030102050b01000504010105000100051f070105010001
-050801000501010005030102050301020503010205030102050901000506010205020104
-05010104050201020502010005000101050301010500010005020102050b070105010001
-052b0100050601020502010405020102052e070105010001052001000505010405020102
-050201000500010105030102050301010500010005020102052407010558020201030202
-05040001051f010005030100050201000501010105010100050401000502010005020100
-050a01000503010005010101051f07010501000105080100050101000502010005020100
-050101000502010005040100050201000502010005090100050401000502010005030100
-0505010005060100050201010501010005010100050101010501010005020100050a0701
-05010001052c010005070100050601000501010005020100052d07010501000105210100
-050601000503010005020100050101010501010005010100050201000501010005010101
-050101000502010005230701055802020103020205040001051f01000507010005010100
-05020100050401000502010005020100050a01000503010005020100051f070105010001
-0508010305060100050101000508010005020100050e0101050201000502010005030100
-05050100050601000502010005020100050101000502010005010100050e070105010001
-052d010105050100050501000502010005020100052d0701050100010522010105040100
-050301000502010005010100050901000501010005020100050101000502010005230701
-055802020103020205040001051f01000504010305010100050201000504010005020104
-050a01000503010005020100051f07010501000105080100050201000502010305020102
-050501000502010005100100050101040503010005050100050601000502010005020100
-050101000502010005020102050b070105010001052f0100050401000504010005030104
-052d07010501000105240100050301000503010005020100050101000506010305010100
-050201000501010405230701055802020103020205040001051f01000503010005020100
-05010100050201000504010005020100050e01000503010005020100051f070105010001
-05080100050201000501010005020100050501000504010005020100050c010005020100
-050101000507010005050100050601000502010005020100050101000502010005050100
-050a070105010001052b0100050201000504010005030100050401000531070105010001
-052001000502010005030100050301000502010005010100050501000502010005010100
-050201000501010005270701055802020103020205040001051f01000503010005020100
-0501010105010100050401000502010005020100050a01000503010005010101051f0701
-050100010508010005020100050101000502010005010100050201000504010005020100
-050201000508010005020100050101000502010005030100050501000506010005020100
-0502010005010100050101010501010005020100050a070105010001052b010005020100
-05040100050201000505010005020100052d070105010001052001000502010005030100
-050301000502010005010100050501000502010005010100050101010501010005020100
-05230701055802020103020205040001051f010005040103050101000500010105050100
-05030102050901040502010105000100051f070105010001050801030503010305020102
-0505010005030102050a0102050301020505010105040101050401000502010005020100
-050201010500010005020102050b070105010001052c0102050501000502010405020102
-052e07010501000105210102050501010502010205020100050601030502010105000100
-050201020524070105580202010302020504000105730701050100010560010005110701
-05010001057307010501000105470100052a070105580202010302020504000105730701
-05010001055c010005020100051107010501000105730701050100010543010005020100
-052a07010558020201030202050400010573070105010001055d01020512070105010001
-057307010501000105440102052b07010558020201030202050400010573070105010001
-057307010501000105730701050100010573070105580202010302020504000105730701
-050100010573070105010001057307010501000105730701055802020103020205040001
-057307010501000105730701050100010573070105010001057307010558020201030202
-050400010573070105010001057307010501000105730701050100010573070105580202
-010302020504000105730701050100010573070105010001057307010501000105730701
-055802020103020205040001057307010501000105730701050100010573070105010001
-05730701055802020103020205040001057400ff00c20504020201030202050400010574
-00ff00c1070005040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105d101ff0158050a0701
-05040202010302020504000105d1010000ff00560100050a070105040202010302020504
-000105d1010000ff00560100050a070105040202010302020504000105d1010000ff0056
-0100050a070105040202010302020504000105d1010000ff00560100050a070105040202
-010302020504000105d1010000ff00560100050a070105040202010302020504000105d1
-010000ff00560100050a0701050402020103020205040001050a01040508010005060102
-05100104059701000010010000ff00440100050a0701050402020103020205040001050c
-0100050a01000508010005120100059901000010010000ff00440100050a070105040202
-0103020205040001050c01000504010205020100050001010505010005030102050b0100
-050301000502010005010100050001010503010205040101057c01000008010200020104
-0002010200ff003c0100050a0701050402020103020205040001050c0100050301000502
-01000501010105010100050401000502010005020100050a010005030100050201000501
-010105010100050101000502010005030101057c01000007010000020100000301000003
-01000002010000ff003b0100050a0701050402020103020205040001050c010005070100
-0501010005020100050401000502010005020100050a0100050401000501010005010100
-050201000501010005020100058201000007010000020100000301000003010000ff003f
-0100050a0701050402020103020205040001050c01000504010305010100050201000504
-010005020104050a01000504010005010100050101000502010005010104058201000007
-0104000301000004010200ff003c0100050a0701050402020103020205040001050c0100
-050301000502010005010100050201000504010005020100050e01000505010005000100
-0501010005020100050101000586010000070100000701000007010000ff003b0100050a
-0701050402020103020205040001050c0100050301000502010005010101050101000504
-01000502010005020100050a010005050101050201010501010005010100050201000503
-0101057c0100000701000002010000030100000301000002010000ff003b0100050a0701
-050402020103020205040001050c01000504010305010100050001010505010005030102
-050b01000506010005020100050001010503010205040101057c01000008010200050101
-0002010200ff003c0100050a0701050402020103020205040001053e010005020100058d
-010000ff00560100050a0701050402020103020205040001053b01000500010005030100
-058d010000ff00560100050a0701050402020103020205040001053c010005040100058d
-010000ff00560100050a070105040202010302020504000105d1010000ff00560100050a
-070105040202010302020504000105d1010000ff00560100050a07010504020201030202
-0504000105d1010000ff00560100050a070105040202010302020504000105d1010000ff
-00560100050a070105040202010302020504000105d101ff0158050a0701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105d101ff0158050a070105040202010302020504000105d10100
-00ff00560100050a070105040202010302020504000105d1010000ff00560100050a0701
-05040202010302020504000105d1010000ff00560100050a070105040202010302020504
-000105d1010000ff00560100050a070105040202010302020504000105d10100000a0101
-00a2010100a40100050a070105040202010302020504000105d101000009010000700100
-002a01000008010000a30100050a0701050402020103020205040001050a010405080100
-050601020510010405050100059001000009010000040102001901000006010000190100
-000a0100000601020013010000040101000a010200040100000c01010002010000070100
-00a30100050a0701050402020103020205040001050c0100050a01000508010005120100
-050701000590010000090100000601000019010000210100000a01000008010000120100
-0004010000010100000801000002010000020101000b0100000101000002010000060100
-00a30100050a0701050402020103020205040001050c0100050401020502010005000101
-0505010005030102050b0100050401010500010005030101058a01000009010000060100
-000301020003010200030102000201040002010200030102000201000000010100090104
-0002010200020100000001010005010000030102000a01000005010000010100000c0100
-0001010000000100000b010000010100000301000005010000a30100050a070105040202
-0103020205040001050c0100050301000502010005010101050101000504010005020100
-05020100050a0100050301000501010105030101058a0100000901000006010000020100
-000201000001010000020100000101000002010000030100000601000002010000020100
-0001010100010100000a0100000301000002010000010101000101000004010000020100
-00020100000801000006010000010100000c010000030100000b01000001010000040100
-0004010000a30100050a0701050402020103020205040001050c01000507010005010100
-05020100050401000502010005020100050a010005030100050201000590010000070101
-000701000002010000020100000101000009010000030100000601000002010000020100
-0001010000020100000a0100000701000001010000020100000401000002010000020100
-000701000007010000010100000a010100040100000b0100000101000005010000040101
-00a10100050a0701050402020103020205040001050c0100050401030501010005020100
-0504010005020104050a0100050301000502010005900100000901000006010000020100
-000201000001010000060103000301000006010000020100000201000001010000020100
-000a01000004010300010100000201000004010000020104000801000006010000010100
-000c010000030100000b010000010100000401000004010000a30100050a070105040202
-0103020205040001050c0100050301000502010005010100050201000504010005020100
-050e01000503010005020100059001000009010000060100000201000002010000010100
-0005010000020100000301000006010000020100000201000001010000020100000a0100
-000301000002010000010100000201000004010000020100000d01000005010000010100
-000c010000030100000b010000010100000301000005010000a30100050a070105040202
-0103020205040001050c0100050301000502010005010101050101000504010005020100
-05020100050a0100050301000501010105030101058a0100000901000006010000020100
-000201000001010000020100000101000002010000030100000601000002010000020100
-0001010000020100000a0100000301000002010000010101000101000004010000020100
-000201000003010100040100000401000001010000030101000201000002010000030100
-000501010003010000010100000201000006010000a30100050a07010504020201030202
-05040001050c010005040103050101000500010105050100050301020509010405020101
-0500010005030101058a0100000901000006010000030102000301020003010300040101
-00040100000301020002010000020100000b010100020103000101000000010100050100
-000301020004010100050100000401010004010100030102000201040003010100040101
-000201000007010000a30100050a070105040202010302020504000105d1010000090100
-003a01050027010000060100002a01000008010000a30100050a07010504020201030202
-0504000105d10100000a010100640101003b010100a40100050a07010504020201030202
-0504000105d1010000ff00560100050a070105040202010302020504000105d1010000ff
-00560100050a070105040202010302020504000105d1010000ff00560100050a07010504
-0202010302020504000105d1010000ff00560100050a0701050402020103020205040001
-05d1010000ff00560100050a070105040202010302020504000105d101ff0158050a0701
-05040202010302020504000105ff05ff0535070105040202010302020504000105ff05ff
-0535070105040202010302020504000105ff05ff05350701050402020103020205040001
-05ff05ff0535070105040202010302020504000105ff05ff053507010504020201030202
-0504000105ff05ff0535070105040202010302020504000105ff05ff0535070105040202
-010302020504000105ff05ff0535070105040202010302020504000105ff05ff05350701
-05040202010302020504000105ff05ff0535070105040202010302020504000105ff05ff
-0535070105040202010302020504000105ff05ff05350701050402020103020205040001
-05ff05ff0535070105040202010302020504000105ff05ff053507010504020201030202
-0504000105ff05ff0535070105040202010302020504000105ff05ff0535070105040202
-010302020504000105ff05ff0535070105040202010302020504000105ff05ff05350701
-05040202010302020504000105ff05ff0535070105040202010302020504000105ff05ff
-0535070105040202010302020504000105d101ff0158050a070105040202010302020504
-000105d1010000ff00560100050a070105040202010302020504000105d1010000ff0056
-0100050a070105040202010302020504000105d1010000ff00560100050a070105040202
-010302020504000105d1010000ff00560100050a070105040202010302020504000105d1
-010000ff00560100050a070105040202010302020504000105d1010000ff00560100050a
-0701050402020103020205040001050a0104050801000506010205100100050201000597
-010000080102001901000006010000190100000a01000006010200f60100050a07010504
-02020103020205040001050c0100050a010005080100051001010501010005970100000a
-01000019010000210100000a01000008010000f60100050a070105040202010302020504
-0001050c0100050401020502010005000101050501000503010205090101050101000502
-010205020101050001000503010205040101057c0100000a010000030102000301020003
-010200020104000201020003010200020100000001010009010400020102000201000000
-0101000501000003010200ef0100050a0701050402020103020205040001050c01000503
-010005020100050101010501010005040100050201000502010005080100050001000500
-01000501010005020100050101000500010005000100050101000502010005030101057c
-0100000a0100000201000002010000010100000201000001010000020100000301000006
-010000020100000201000001010100010100000a01000003010000020100000101010001
-010000040100000201000002010000ee0100050a0701050402020103020205040001050c
-010005070100050101000502010005040100050201000502010005080100050001000500
-010005050100050101000500010005000100050101000502010005820100000a01000002
-010000020100000101000009010000030100000601000002010000020100000101000002
-0100000a010000070100000101000002010000040100000201000002010000ee0100050a
-0701050402020103020205040001050c0100050401030501010005020100050401000502
-01040508010005010101050201030501010005000100050001000501010405820100000a
-010000020100000201000001010000060103000301000006010000020100000201000001
-010000020100000a0100000401030001010000020100000401000002010400ee0100050a
-0701050402020103020205040001050c0100050301000502010005010100050201000504
-010005020100050c01000501010105010100050201000501010005000100050001000501
-010005860100000a01000002010000020100000101000005010000020100000301000006
-010000020100000201000001010000020100000a01000003010000020100000101000002
-0100000401000002010000f20100050a0701050402020103020205040001050c01000503
-010005020100050101010501010005040100050201000502010005080100050201000501
-010005020100050101000500010005000100050101000502010005030101057c0100000a
-010000020100000201000001010000020100000101000002010000030100000601000002
-0100000201000001010000020100000a0100000301000002010000010101000101000004
-0100000201000002010000ee0100050a0701050402020103020205040001050c01000504
-010305010100050001010505010005030102050901000502010005020103050101000500
-0100050001000502010205040101057c0100000a01000003010200030102000301030004
-010100040100000301020002010000020100000b01010002010300010100000001010005
-01000003010200ef0100050a070105040202010302020504000105d10100003e010500ff
-00110100050a070105040202010302020504000105d1010000ff00560100050a07010504
-0202010302020504000105d1010000ff00560100050a0701050402020103020205040001
-05d1010000ff00560100050a070105040202010302020504000105d1010000ff00560100
-050a070105040202010302020504000105d1010000ff00560100050a0701050402020103
-02020504000105d1010000ff00560100050a070105040202010302020504000105d101ff
-0158050a070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105d101ff0158050a070105040202
-010302020504000105d1010000ff00560100050a070105040202010302020504000105d1
-010000ff00560100050a070105040202010302020504000105d1010000ff00560100050a
-070105040202010302020504000105d1010000ff00560100050a07010504020201030202
-0504000105d1010000ff00560100050a070105040202010302020504000105d1010000ff
-00560100050a0701050402020103020205040001050a0104050801000506010205100100
-05020100051d010305130100050b0100051c0100053501000009010000ff004b0100050a
-0701050402020103020205040001050c0100050a0100050801000510010105010100051d
-010005020100051f0100051c0100053501000009010000ff004b0100050a070105040202
-0103020205040001050c0100050401020502010005000101050501000503010205090101
-050101000502010205020101050001000503010205090100050201000502010205030101
-050001000502010205030102050201040502010205020100050001010503010205030101
-0500010005030101052f0100000701040001010000000101000201000002010000020102
-00ff00350100050a0701050402020103020205040001050c010005030100050201000501
-010105010100050401000502010005020100050801000500010005000100050101000502
-010005010100050001000500010005010100050201000508010005020100050101000502
-010005010100050101010504010005020100050201000503010005030100050201000501
-0101050101000501010005020100050101000501010105030101052f0100000901000003
-0101000101000001010000020100000101000002010000ff00340100050a070105040202
-0103020205040001050c0100050701000501010005020100050401000502010005020100
-050801000500010005000100050501000501010005000100050001000501010005020100
-050801030502010005020100050101000502010005040100050201000507010005030100
-050201000501010005050100050201000501010005020100053501000009010000030100
-0005010000020100000101000002010000ff00340100050a070105040202010302020504
-0001050c0100050401030501010005020100050401000502010405080100050101010502
-010305010100050001000500010005010104050801000501010005020104050101000502
-010005040100050301020504010005030104050101000505010405010100050201000535
-0100000901000003010000050100000201000001010400ff00340100050a070105040202
-0103020205040001050c0100050301000502010005010100050201000504010005020100
-050c010005010101050101000502010005010100050001000500010005010100050c0100
-050201000501010005050100050201000504010005060100050301000503010005050100
-050501000505010005020100053501000009010000030100000501000002010000010100
-00ff00380100050a0701050402020103020205040001050c010005030100050201000501
-010105010100050401000502010005020100050801000502010005010100050201000501
-010005000100050001000501010005020100050801000502010005010100050201000501
-010005010101050401000502010005020100050301000503010005020100050101000505
-010005020100050101000501010105030101052f01000009010000030100000501000001
-0101000101000002010000ff00340100050a0701050402020103020205040001050c0100
-050401030501010005000101050501000503010205090100050201000502010305010100
-050001000500010005020102050901000502010005020102050301010500010005040100
-0503010205050101050201020502010005060102050301010500010005030101052f0100
-000a01010001010000060101000001000002010200ff00350100050a0701050402020103
-020205040001056901000566010000ff00560100050a0701050402020103020205040001
-05650100050201000566010000ff00560100050a07010504020201030202050400010566
-01020567010000ff00560100050a070105040202010302020504000105d1010000ff0056
-0100050a070105040202010302020504000105d1010000ff00560100050a070105040202
-010302020504000105d1010000ff00560100050a070105040202010302020504000105d1
-010000ff00560100050a070105040202010302020504000105d101ff0158050a07010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105d101ff0158050a0701050402020103020205040001
-05d1010000ff00560100050a070105040202010302020504000105d1010000ff00560100
-050a070105040202010302020504000105d1010000ff00560100050a0701050402020103
-02020504000105d1010000ff00560100050a070105040202010302020504000105d10100
-00ff00560100050a070105040202010302020504000105d10100000b0100002a010000ff
-001d0100050a0701050402020103020205040001050a0103053401020513010005190100
-0503010005130104050801000506010205280100000a010000040101000a010200040100
-000c01010002010000ff001c0100050a0701050402020103020205040001050a01000502
-01000532010005020100052d01000503010005150100050a010005080100052801000009
-01000004010000010100000801000002010000020101000b0100000101000002010000ff
-001b0100050a0701050402020103020205040001050a0100050201000501010005000101
-050301020503010205030102050301020503010205090100050201000501010005020100
-050101000500010105030102050201000500010105030101050001000508010405010100
-0500010105030102050b0100050401020502010005000101050501000503010205040101
-051a0100000801000005010000010100000c01000001010000000100000b010000010100
-0003010000ff001a0100050a0701050402020103020205040001050a0100050201000501
-010105010100050101000502010005010100050201000501010005020100050101000502
-010005010100050201000508010005020100050101000502010005010101050101000504
-010005020101050101000501010005010101050a01000503010105010100050101000502
-0100050a0100050301000502010005010101050101000504010005020100050201000503
-0101051a0100000701000006010000010100000c010000030100000b0100000101000004
-010000ff00190100050a0701050402020103020205040001050a01030502010005050100
-050201000501010005050100050201000501010005050100050c01000502010005010100
-050001000500010005010100050201000504010005020100050201000501010005020100
-050a010005030100050201000501010005020100050a0100050701000501010005020100
-05040100050201000502010005200100000601000007010000010100000a010100040100
-000b0100000101000005010000ff00180100050a0701050402020103020205040001050a
-010005050100050501000502010005010100050501040502010205030102050901000502
-010005010100050001000500010005010100050201000504010005020100050201000501
-010005020100050a0100050301000502010005010104050a010005040103050101000502
-0100050401000502010405200100000701000006010000010100000c010000030100000b
-0100000101000004010000ff00190100050a0701050402020103020205040001050a0100
-050501000505010005020100050101000505010005090100050501000508010005020100
-050101000500010005000100050101000502010005040100050201000502010005010100
-05020100050a0100050301000502010005010100050e0100050301000502010005010100
-05020100050401000502010005240100000801000005010000010100000c010000030100
-000b0100000101000003010000ff001a0100050a0701050402020103020205040001050a
-010005050100050501000502010005010100050201000501010005020100050101000502
-010005010100050201000508010005020100050101000500010005000100050101000502
-01000504010005020100050201000501010005010101050a010005030100050201000501
-010005020100050a01000503010005020100050101010501010005040100050201000502
-010005030101051a01000009010000040100000101000003010100020100000201000003
-01000005010100030100000101000002010000ff001b0100050a07010504020201030202
-05040001050a0100050501000506010205030102050301020503010205030102050a0102
-050301000500010005020100050201000504010005020100050201000502010105000100
-050b0101050101000502010005020102050b010005040103050101000500010105050100
-0503010205040101051a0100000a01000004010100040101000301020002010400030101
-000401010002010000ff001c0100050a0701050402020103020205040001056901000566
-0100000b0100002a010000ff001d0100050a070105040202010302020504000105650100
-050201000566010000ff00560100050a0701050402020103020205040001056601020567
-010000ff00560100050a070105040202010302020504000105d1010000ff00560100050a
-070105040202010302020504000105d1010000ff00560100050a07010504020201030202
-0504000105d1010000ff00560100050a070105040202010302020504000105d1010000ff
-00560100050a070105040202010302020504000105d101ff0158050a0701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105d101ff0158050a070105040202010302020504000105d10100
-00ff00560100050a070105040202010302020504000105d1010000ff00560100050a0701
-05040202010302020504000105d1010000ff00560100050a070105040202010302020504
-000105d1010000ff00560100050a070105040202010302020504000105d1010000ff0056
-0100050a070105040202010302020504000105d1010000ff00560100050a070105040202
-0103020205040001050a0100050201000527010105090102051301000517010305590100
-00ff00560100050a0701050402020103020205040001050a01010501010005260100050a
-010005020100052b0100050201000558010000ff00560100050a07010504020201030202
-05040001050a01010501010005020102050201010500010005030102050a010205040100
-050a01000502010005010100050201000501010005000101050301020502010005000101
-050301010500010005080100050201000501010005000101050301020503010205030102
-0503010205030102050401010528010000ff00560100050a070105040202010302020504
-0001050a0100050001000500010005010100050201000501010005000100050001000501
-010005020100050801000502010005010104050801000502010005010100050201000501
-010105010100050401000502010105010100050101000501010105080100050201000501
-010105010100050101000502010005010100050201000501010005020100050101000502
-01000501010005020100050301010528010000ff00560100050a07010504020201030202
-05040001050a010005000100050001000505010005010100050001000500010005010100
-05020100050801000502010005030100050a010005020100050101000500010005000100
-050101000502010005040100050201000502010005010100050201000508010305020100
-050501000502010005010100050501000502010005010100050501000532010000ff0056
-0100050a0701050402020103020205040001050a01000501010105020103050101000500
-01000500010005010104050801000502010005030100050a010005020100050101000500
-010005000100050101000502010005040100050201000502010005010100050201000508
-010005050100050501000502010005010100050501040502010205030102052f010000ff
-00560100050a0701050402020103020205040001050a0100050101010501010005020100
-05010100050001000500010005010100050c01000502010005030100050a010005020100
-050101000500010005000100050101000502010005040100050201000502010005010100
-050201000508010005050100050501000502010005010100050501000509010005050100
-052e010000ff00560100050a0701050402020103020205040001050a0100050201000501
-010005020100050101000500010005000100050101000502010005080100050201000503
-0100050a0100050201000501010005000100050001000501010005020100050401000502
-010005020100050101000501010105080100050501000505010005020100050101000502
-0100050101000502010005010100050201000501010005020100050301010528010000ff
-00560100050a0701050402020103020205040001050a0100050201000502010305010100
-050001000500010005020102050a010205040100050b0102050301000500010005020100
-050201000504010005020100050201000502010105000100050801000505010005060102
-05030102050301020503010205030102050401010528010000ff00560100050a07010504
-02020103020205040001056901000566010000ff00560100050a07010504020201030202
-0504000105650100050201000566010000ff00560100050a070105040202010302020504
-0001056601020567010000ff00560100050a070105040202010302020504000105d10100
-00ff00560100050a070105040202010302020504000105d1010000ff00560100050a0701
-05040202010302020504000105d1010000ff00560100050a070105040202010302020504
-000105d1010000ff00560100050a070105040202010302020504000105d101ff0158050a
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000105ff05ff0535070105040202010302020504000105ff
-05ff0535070105040202010302020504000105ff05ff0535070105040202010302020504
-000105ff05ff0535070105040202010302020504000105ff05ff05350701050402020103
-02020504000105ff05ff0535070105040202010302020504000105ff05ff053507010504
-0202010302020504000105ff05ff0535070105040202010302020504000105ff05ff0535
-070105040202010302020504000107ff07ff073705040202010100040504000007ff07ff
-0738050400050202040005ff05ff054300000202040000000202040005ff05ff05430000
-0202040000000202040005ff05ff054300000202040000000202040005ff05ff05430000
-0202040000000202040005ff05ff0543000002020400000002020400000502ff02ff0237
-00060202040000000208040002ff02ff023700000208040000000208040002ff02ff0237
-00000208040000000208040001ff01ff01370000020804000000040901ff01ff01370000
-0409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 60 377 354
-%%EOF
diff --git a/lib/tv/doc/src/note.gif b/lib/tv/doc/src/note.gif
deleted file mode 100644
index 6fffe30419..0000000000
--- a/lib/tv/doc/src/note.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/notes.xml b/lib/tv/doc/src/notes.xml
deleted file mode 100644
index 4f066e5c70..0000000000
--- a/lib/tv/doc/src/notes.xml
+++ /dev/null
@@ -1,288 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>TV Release Notes</title>
- <prepared>otp_appnotes</prepared>
- <docno>nil</docno>
- <date>nil</date>
- <rev>nil</rev>
- <file>notes.xml</file>
- </header>
- <p>This document describes the changes made to the TV application.</p>
-
-<section><title>TV 2.1.4.10</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Misc build updates</p>
- <p>
- Own Id: OTP-10784</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.9</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>The GS applications is now deprecated and will be
- removed in the R16 release. The following GS-based
- applications have been superseded by the Observer
- application and will removed in R16: Appmon, Pman,
- Tv.</p>
- <p>
- *** POTENTIAL INCOMPATIBILITY ***</p>
- <p>
- Own Id: OTP-9907</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.8</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Eliminate use of deprecated regexp module</p>
- <p>
- Own Id: OTP-9810</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.7</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
- <list>
- <item>
- <p>
- tv: Allow table viewer to display refs, ports and small
- binaries</p>
- <p>
- Table viewer displayed #Port, #Ref, or #Bin as place
- holders for their respective object types in ets and
- mnesia tables. This can make table viewer difficult to
- use when viewing tables containing those data types. It
- doesn't make sense to render large binaries so #Bin will
- still be used for binaries that exceed 100 bytes. (Thanks
- to Blaine whittle)</p>
- <p>
- Own Id: OTP-9153</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.6</title>
-
- <section><title>Fixed Bugs and Malfunctions</title>
- <list>
- <item>
- <p>
- With some window managers (e.g. stumpwm), <c>tv</c> would
- constantly restart while trying to open a table. (Thanks
- to Dmitriy Budashny.)</p>
- <p>
- Own Id: OTP-8751</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.5</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Warnings due to new autoimported BIFs removed</p>
- <p>
- Own Id: OTP-8674 Aux Id: OTP-8579 </p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.4</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- The documentation is now built with open source tools
- (xsltproc and fop) that exists on most platforms. One
- visible change is that the frames are removed.</p>
- <p>
- Own Id: OTP-8201</p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.3</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Updated the application with new tags for automatic updates
- of copyright notices.
- </p>
- <p>
- Own Id: OTP-7851
- </p>
- </item>
- </list>
- </section>
-
-</section>
-
-<section><title>TV 2.1.4.2</title>
-
- <section><title>Improvements and New Features</title>
- <list>
- <item>
- <p>
- Minor updates.</p>
- <p>
- Own Id: OTP-7261</p>
- </item>
- </list>
- </section>
-
-</section>
-
- <section>
- <title>TV 2.1.4.1</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Minor Makefile changes.</p>
- <p>Own Id: OTP-6689</p>
- </item>
- <item>
- <p>Obsolete guard tests (such as list()) have been replaced
- with the modern guard tests (such as is_list()).</p>
- <p>Own Id: OTP-6728</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>TV 2.1.4</title>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Removed some dead code from
- <c>tv_pg_gridfcns:mark_cell_and_notify/4</c>
- and <c>tv_nodewin:handle_error/1</c>.</p>
- <p>Own Id: OTP-6455</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>TV 2.1.3</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>A compiler warning has been fixed.</p>
- <p>Own Id: OTP-6016</p>
- </item>
- </list>
- </section>
-
- <section>
- <title>Improvements and New Features</title>
- <list type="bulleted">
- <item>
- <p>Notification windows are now centered over a parent
- window.</p>
- <p>Own Id: OTP-6014 Aux Id: OTP-5987</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>TV 2.1.2</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>Some dead code reported by Dialyzer was eliminated. </p>
- <p>A
- bug in 'dbg' when tracing to wrap trace files has been
- corrected. It failed to delete any already existing wrap
- trace files with the same names when starting a new wrap
- trace.</p>
- <p>Own Id: OTP-5329</p>
- </item>
- <item>
- <p>The graphic applications now search for HTML
- documentation in the correct place.</p>
- <p>Own Id: OTP-5381</p>
- </item>
- </list>
- </section>
- </section>
-
- <section>
- <title>TV 2.1.1</title>
-
- <section>
- <title>Fixed Bugs and Malfunctions</title>
- <list type="bulleted">
- <item>
- <p>TV no longer crashes on Mac OS X. (Thanks to Sean Hinde.)</p>
- <p>Own Id: OTP-5219</p>
- </item>
- </list>
- </section>
- </section>
-</chapter>
-
-
diff --git a/lib/tv/doc/src/part.xml b/lib/tv/doc/src/part.xml
deleted file mode 100644
index b82c66b05a..0000000000
--- a/lib/tv/doc/src/part.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>TV User's Guide</title>
- <prepared>Fredrik Gustafson</prepared>
- <docno></docno>
- <date>1997-06-04</date>
- <rev>1.0.1</rev>
- <file>part.xml</file>
- </header>
- <description>
- <p>The Table Visualizer application, <em>TV</em>, enables the user
- to examine ETS and Mnesia tables. Once a certain table has been
- opened in the tool, the content may be viewed in various levels
- of detail.</p>
- </description>
- <xi:include href="table_visualizer_chapter.xml"/>
-</part>
-
-
diff --git a/lib/tv/doc/src/part_notes.xml b/lib/tv/doc/src/part_notes.xml
deleted file mode 100644
index 6fdf2ba2dd..0000000000
--- a/lib/tv/doc/src/part_notes.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE part SYSTEM "part.dtd">
-
-<part xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>2004</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>TV Release Notes</title>
- <prepared></prepared>
- <docno></docno>
- <date>2004-09-07</date>
- <rev>1.0</rev>
- <file>part_notes.sgml</file>
- </header>
- <description>
- <p>The Table Visualizer application, <em>TV</em>, enables the user
- to examine ETS and Mnesia tables. Once a certain table has been
- opened in the tool, the content may be viewed in various levels
- of detail.</p>
- </description>
- <xi:include href="notes.xml"/>
-</part>
-
-
diff --git a/lib/tv/doc/src/ref_man.xml b/lib/tv/doc/src/ref_man.xml
deleted file mode 100644
index 26cc0371b0..0000000000
--- a/lib/tv/doc/src/ref_man.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE application SYSTEM "application.dtd">
-
-<application xmlns:xi="http://www.w3.org/2001/XInclude">
- <header>
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>TV Reference Manual</title>
- <prepared>Fredrik Gustafson</prepared>
- <docno></docno>
- <date>1997-06-04</date>
- <rev>1.0.1</rev>
- <file>application.sgml</file>
- </header>
- <description>
- <p>The TV application enables the user
- to examine ETS and Mnesia tables. Once a certain table has been
- opened in the tool, the content may be viewed in various levels
- of detail.</p>
- </description>
- <xi:include href="tv.xml"/>
-</application>
-
-
diff --git a/lib/tv/doc/src/set_poll_int.gif b/lib/tv/doc/src/set_poll_int.gif
deleted file mode 100644
index c09c84322f..0000000000
--- a/lib/tv/doc/src/set_poll_int.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/set_poll_int.ps b/lib/tv/doc/src/set_poll_int.ps
deleted file mode 100644
index cceb30486f..0000000000
--- a/lib/tv/doc/src/set_poll_int.ps
+++ /dev/null
@@ -1,483 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./set_poll_int.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:08:39 2001)
-%%BoundingBox: 0 17 200 154
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 17 200 154
-userdict begin
-%%BeginData:
-DisplayImage
-0 17
-200.000000 137.000000
-12
-315 215
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-828282
-aa2455
-c3c3c3
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff0124000b0208040001ff012400000208040000000208040002ff022400000208
-0400000002080400020000ff0021040002000000020804000000020204060200000004ff
-0421020000000405020204000000020204000209000d02ff021800000202040000000202
-040002080000020d04000281010102020101023701010254000002020400000002020400
-02080000020d040002580103020b010002070104020a01010202010102060101020b0100
-02210101025400000202040000000202040002080000020d040002570101020101010209
-01010207010102010101020901010202010102060101020a010102210101025400000202
-040000000202040002080000020204060203040002570101020601030201010402050101
-020101010201010302030101020201010206010102020101020001010201010402010103
-020201010200010102000101020101010202010302030101025400000202040000000403
-020800000202040003040000020304000257010202040101020101010201010102070101
-020101010200010102010101020201010202010102060101020201020200010102010101
-020201010201010102010101020001010200010102010101020101010201010102020101
-0254000004030101020b0000020304000302000002040400025801030202010102010101
-020101010207010102010100020101010201010102020101020201010206010102020101
-020101010201010102020101020101010201010202020101020101010205010102020101
-02570103020b0000020304000302000002040400025a0102020101050201010102070103
-020201010201010102020101020201010206010102020101020101010201010102020105
-020101010204010102000100020301040202010102570103020b00000204040003000000
-02050400025b010102010101020501010207010102040101020101010202010102020101
-020601010202010102010101020101010202010102050101020401010200010002020101
-020101010202010102570103020b00000204040003000000020504000257010102010101
-020101010202010002010101020701010204010102010101020201010202010102060101
-020201010201010102010101020201010202010002010101020501010203010102010101
-0202010102570103020b0000020500000206040002580103020301030203010202050101
-020501030203010102020101020601010202010102010101020201020201010302020101
-0205010102040102020001010201010102570103020b0000020d040002ff021a0103020b
-0000020d040002ff021a0103020b0000020d040002ff021a0103020c040d02ff021b0103
-02ff0236010302ff02360103020200ff002f0400020201030202000004ff042f02020103
-02ff02360103020205ff053002020103020205ff053002020103020205ff053002020103
-020205ff053002020103020205ff053002020103020205ff053002020103020205ff0530
-02020103020205ff053002020103020205ff053002020103020205ff0530020201030202
-05e5003b050e02020103020205e5003a0600050e02020103020205e5000105370601050e
-02020103020205e5000105370601050e02020103020205e5000105370601050e02020103
-020205e5000105370601050e02020103020205e5000105370601050e02020103020205e5
-000105370601050e02020103020205e5000105370601050e020201030202051b000105c7
-000105150102050201000502010005160601050e020201030202051a0003050b01000503
-0100051e010205090103050a010205030102050501000568000105140100050201000501
-01000501010005170601050e02020103020205190005050a010005030100052001000509
-010005020100050b010005050100056f0001051401000502010005010100050001000518
-0601050e0202010302020518000205010002050901010501010105020102050201000500
-010105020100050201000502010205050100050901000502010005020102050501000505
-010005030102050201000500010105030101050001000559000105140100050201000501
-010105190601050e02020103020205170002050300020508010105010101050101000502
-010005010101050101000501010005020100050101000502010005040100050901000502
-010005010100050201000504010005050100050501000502010105010100050101000501
-0101055900010514010005020100050101000500010005180601050e0202010302020516
-000205050002050701000500010105000100050501000501010005020100050101000502
-010005050100050401000509010305020100050201000504010005050100050501000502
-010005020100050101000502010005590001051401000502010005010100050101000517
-0601050e0202010302020515060205070602050601000500010105000100050201030501
-010005020100050101000502010005020103050401000509010005050100050201000504
-010005050100050501000502010005020100050101000502010005590001051401000502
-0100050101000501010005170601050e0202010302020516060205050602050701000503
-010005010100050201000501010005020100050101000502010005010100050201000504
-010005090100050501000502010005040100050501000505010005020100050201000501
-010005020100055900010514010005020100050101000502010005160601050e02020103
-020205170602050306020508010005030100050101000502010005010100050201000501
-010005010101050101000502010005040100050901000505010005020100050401000505
-010005050100050201000502010005010100050101010559000105150102050201000502
-010005160601050e02020103020205180602050106020509010005030100050201030501
-010005020100050201010500010005020103050401000509010005060102050501000505
-010005050100050201000502010005020101050001000559000105370601050e02020103
-020205190605056a01000559000105370601050e020201030202051a0603056701000502
-01000559000105370601050e020201030202051b060105690102055a000105370601050e
-02020103020205e5000105370601050e02020103020205e5000105370601050e02020103
-020205e5000105370601050e02020103020205e5000105370601050e02020103020205e5
-000105370601050e02020103020205e5000105370601050e02020103020205e500010639
-050e02020103020205e50000063a050e02020103020205ff053002020103020205ff0530
-02020103020205ff053002020103020205ff053002020103020205ff0530020201030202
-05ff053002020103020205ff053002020103020205ff053002020103020205ff05300202
-0103020205ff053002020103020205ff053002020103020205ff053002020103020205ff
-053002020103020205ff053002020103020205ff053002020103020205ff053002020103
-020205ff053002020103020205ff053002020103020205ff053002020103020205ff0530
-02020103020205e5003b050e02020103020205e5003a0600050e02020103020205e50001
-05370601050e02020103020205e5000105370601050e02020103020205e5000105370601
-050e02020103020205e5000105370601050e02020103020205e5000105370601050e0202
-0103020205e5000105370601050e02020103020205e5000105370601050e020201030202
-051a060105c8000105070102051f010205090601050e02020103020205190603050e0100
-050c0100051a01000506010005100103050a010205030102050501000554000105060100
-050201000520010005090601050e02020103020205180605050d0100050c0100051a0100
-0518010005020100050b010005050100055b000105060100050201000502010205020100
-0500010105030102050301020505010005090601050e0202010302020517060207010602
-050b01000500010005020100050201000501010405020102050201010500010005030102
-050201040502010205030102050901000502010005020102050501000505010005030102
-050201000500010105030101050001000545000105060100050501000502010005010101
-05010100050101000502010005010100050201000504010005090601050e020201030202
-0516060207030602050a0100050001000502010005020100050301000503010005020100
-050101000500010005000100050101000502010005030100050601000502010005020100
-050801000502010005010100050201000504010005050100050501000502010105010100
-050101000501010105450001050601000509010005010100050201000501010005050100
-050201000504010005090601050e02020103020205150602070506020509010005000100
-050201000502010005030100050301000502010005010100050001000500010005050100
-050301000506010005020100050c01030502010005020100050401000505010005050100
-050201000502010005010100050201000545000105060100050601030501010005020100
-05010100050501040504010005090601050e020201030202051400020707000205070100
-050201000501010005020100050301000503010005020100050101000500010005000100
-05020103050301000506010005020100050c010005050100050201000504010005050100
-050501000502010005020100050101000502010005450001050601000502010005010100
-05020100050101000502010005010100050501000508010005090601050e020201030202
-051500020705000205080104050101000502010005030100050301000502010005010100
-05000100050001000501010005020100050301000506010005020100050c010005050100
-050201000504010005050100050501000502010005020100050101000502010005450001
-050601000502010005010100050201000501010005020100050101000502010005010100
-050201000504010005090601050e02020103020205160002070300020509010005020100
-050101000501010105030100050301000502010005010100050001000500010005010100
-050201000503010005060100050201000502010005080100050501000502010005040100
-050501000505010005020100050201000501010005010101054500010507010205030103
-050101000502010005020102050301020505010005090601050e02020103020205170002
-07010002050a010005020100050201010500010005040101050201020502010005000100
-050001000502010305040101050401000503010205090100050601020505010005050100
-05050100050201000502010005020101050001000545000105370601050e020201030202
-05180005057f01000545000105370601050e02020103020205190003057c010005020100
-0545000105370601050e020201030202051a0001057e01020546000105370601050e0202
-0103020205e5000105370601050e02020103020205e5000105370601050e020201030202
-05e5000105370601050e02020103020205e5000105370601050e02020103020205e50001
-05370601050e02020103020205e5000105370601050e02020103020205e500010639050e
-02020103020205e50000063a050e02020103020205ff053002020103020205ff05300202
-0103020205ff053002020103020205ff053002020103020205ff053002020103020205ff
-053002020103020205ff053002020103020205ff053002020103020205ff053002020103
-020205ff053002020103020205ff053002020103020205ff053002020103020205ff0530
-02020103020205ff053002020103020205ff053002020103020205ff0530020201030202
-05ff053002020103020205ff053002020103020205ff0530020201030202057601000534
-0100058202020103020205110103050a01020503010205090104050a010005200102050b
-0100052a0100050a010005810202010302020511010005020100050b010005050100050b
-0100050c010005220100050b0100052a0100050a01000581020201030202051101000502
-0100050201020505010005050100050b0100050301000500010105020104050201020502
-01000500010105020100050201000502010205050100050a010005050102050301020503
-010205030102050201000500010105030101050001000502010205050100050401010579
-020201030202051101000502010005010100050201000504010005050100050b01000503
-010105010100050301000503010005020100050101010501010005010100050201000501
-01000502010005040100050a010005040100050201000501010005020100050101000502
-010005010100050201000501010105010100050101000501010105010100050201000504
-01000504010105790202010302020511010305020100050201000504010005050100050b
-010005030100050201000503010005030100050201000501010005050100050201000505
-010005040100050a01000504010005050100050201000501010005050100050201000501
-010005020100050101000502010005010100050801000580020201030202051101000505
-0100050201000504010005050100050b0100050301000502010005030100050301040501
-010005060100050001000503010305040100050a01000505010205020104050101000505
-010005020100050101000502010005010100050201000502010205050100058002020103
-02020511010005050100050201000504010005050100050b010005030100050201000503
-010005030100050501000506010005000100050201000502010005040100050a01000508
-010005010100050501000505010005020100050101000502010005010100050201000505
-01000504010005800202010302020511010005050100050201000504010005050100050b
-010005030100050201000503010005030100050201000501010005070100050301000502
-010005040100050b01000503010005020100050101000502010005010100050201000501
-010005020100050101000502010005010100050101010501010005020100050301000505
-010105790202010302020511010005060102050501000505010005090104050101000502
-0100050401010502010205020100050701000504010305040100050b0100050401020503
-010205030102050301020502010005020100050201010500010005020102050401000505
-010105790202010302020576010005340100058202020103020205ff0530020201030202
-05ff053002020103020205ff053002020103020205ff053002020103020205ff05300202
-0103020205ff053002020103020205ff053002020103020205ff053002020103020205ff
-053002020103020205ff053002020103020205ff053002020103020205ff053002020103
-020205ff053002020103020205ff053002020103020205ff053002020103020205ff0530
-02020103020205ff053002020103020205ff0530020201030202056f0100050401020504
-010105b0020201030202056e01010503010005020100050201000501010005af02020103
-0202056d01000500010005070100050201000501010005af020201030202056f01000507
-0100050201000501010005af020201030202056f010005060100050301000501010005af
-020201030202056f010005050100050401000501010005af020201030202056f01000504
-0100050501000501010005af020201030202056f010005030100050601000501010005af
-020201030202056d0104050101040503010105b002020103020205ff0530020201030202
-05ff053002020103020205ff053002020103020205ff053002020103020205ff05300202
-01030202050d06ff0614050d020201030202050d06ff06130000050d020201030202050d
-06010856001d089b0001050d020201030202050d06010856001c0600089b0001050d0202
-01030202050d060108560001050b06000000050b0601089b0001050d020201030202050d
-060108560001050b06000000050b0601089b0001050d020201030202050d060108560001
-050b06000000050b0601089b0001050d020201030202050d060108560001050b06000000
-050b0601089b0001050d020201030202050d060108560001050b06000000050b0601089b
-0001050d020201030202050d060108560001050b06000000050b0601089b0001050d0202
-01030202050d060108560001050b06000000050b0601089b0001050d020201030202050d
-060108560001050b06000000050b0601089b0001050d020201030202050d060108560001
-050b06000000050b0601089b0001050d020201030202050d060108560001050b06000000
-050b0601089b0001050d020201030202050d060108560001050b06000000050b0601089b
-0001050d020201030202050d060108560001060c0000060d089b0001050d020201030202
-050d060108560000061c089b0001050d020201030202050d060100ff0012050d02020103
-0202050d060000ff0013050d02020103020205ff053002020103020205ff053002020103
-020205ff053002020103020205ff053002020103020205ff053002020103020205ff0530
-02020103020205ff053002020103020205ff053002020101000405ff0530000502020400
-05ff053000000202040000000202040005ff053000000202040000000202040005ff0530
-00000202040000000202040005ff053000000202040000000202040005ff053000000202
-0400000002020400000502ff022400060202040000000208040002ff0224000002080400
-00000208040002ff022400000208040000000208040001ff012400000208040000000409
-01ff012400000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 17 200 154
-%%EOF
diff --git a/lib/tv/doc/src/table_visualizer_chapter.xml b/lib/tv/doc/src/table_visualizer_chapter.xml
deleted file mode 100644
index 13757dff59..0000000000
--- a/lib/tv/doc/src/table_visualizer_chapter.xml
+++ /dev/null
@@ -1,658 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE chapter SYSTEM "chapter.dtd">
-
-<chapter>
- <header>
- <copyright>
- <year>1997</year><year>2013</year>
- <holder>Ericsson AB. All Rights Reserved.</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- </legalnotice>
-
- <title>The Table Visualizer</title>
- <prepared>EPK/TK Fredrik Gustafson</prepared>
- <responsible></responsible>
- <docno></docno>
- <approved>EPK/TK (Fredrik Gustafson)</approved>
- <checked></checked>
- <date>1998-01-19</date>
- <rev>C</rev>
- <file>table_visualizer.xml</file>
- </header>
- <warning>
- <p>
- The TV application has been superseded by the Observer application.
- TV will be removed in R16.
- </p>
- </warning>
- <p>The TV, TV, is a tool that enables the user to examine
- ETS and Mnesia tables on any (connected) node in the currently running Erlang
- system. Once a certain table has been opened in the tool, the content may be
- viewed in various levels of detail. The content may also be edited, as well as
- sorted, using any element as key. It is also possible to search for a specified object or
- element. The table may be polled anytime, either regularly, at specified
- intervals, or manually. New and deleted objects, as well as those altered, are
- marked with characteristic colours.</p>
- <p>Information about the table itself (permissions, storage type, and so on) may
- also be obtained.
- </p>
-
- <section>
- <title>Terminology and Background</title>
- <p>To avoid confusion, we have to distinguish between the <em>actual table</em>, i.e.,
- the data stored in ETS or Mnesia, and the <em>image of the table</em>, i.e., the
- data shown in the TV. The <em>image of the table</em> is simply a copy
- of the <em>actual table</em>, and can be manipulated in a number of ways, for example
- sorted. It follows that these manipulations in no way affects the <em>actual table</em>!</p>
- <p>The expression <em>poll the table</em> is used for the operation of scanning through the
- content of the actual table (in order to keep the image of the table consistent with the
- actual table).</p>
- <p>The ETS and Mnesia modules provides the user with the ability to store vast quantities
- of data in, the data organized as dynamic, unordered tables. The ETS
- facility stores <em>tuples</em>, while Mnesia stores <em>records</em>.
- Each tuple consists of one or more <em>elements</em>; each record consists of one or
- more <em>fields</em>. It should be noted that, since records are implemented as tuples,
- with the record name as the first element, the first field of a record becomes the second
- element in the corresponding tuple!
- <br></br>
-
- In the following, all table objects are mainly referred to as tuples, regardless of the
- table type.</p>
- <p>For further information about ETS and Mnesia, please see the manual pages and Mnesia User's Guide.</p>
- </section>
-
- <section>
- <title>Starting the TV</title>
- <p>The TV tool is started by giving the command</p>
- <pre>
- tv:start().
- </pre>
- <p>The window that appears, is hereafter referred to as <em>the TV main window</em>. It consists of:</p>
- <list type="bulleted">
- <item>
- <p>a <em>menubar</em>.</p>
- </item>
- <item>
- <p>a <em>grid</em>, i.e., a multicolumnar array, where tables existing on
- the current node is shown. Each square in the grid is called a <em>cell</em>.</p>
- </item>
- </list>
- <image file="tv_start.gif">
- <icaption>The TV Main Window at startup.</icaption>
- </image>
- <p>For each table, the following information is shown, in order:
- </p>
- <list type="bulleted">
- <item>
- <p>the <em>table name</em>. If the table is accessible through this name, as is the
- case with Mnesia tables and named ETS tables, the table name is shown in
- black, otherwise in medium grey.</p>
- </item>
- <item>
- <p>the <em>table identifier</em>, if there is one; since Mnesia tables are accessed
- solely through the table name, this cell will in those cases be blank.</p>
- </item>
- <item>
- <p>the <em>process identifier (PID) of the process owning the table</em>.</p>
- </item>
- <item>
- <p>the <em>name of the process owning the table</em>, provided the process
- is registered.</p>
- </item>
- <item>
- <p>the <em>table size</em>, i.e., the number of objects currently stored in
- the table.</p>
- </item>
- </list>
- </section>
-
- <section>
- <title>Changing View</title>
- <p>The TV will by default show currently existing ETS tables,
- but the user may easily switch to a Mnesia table view, by choosing the
- <em>Mnesia Tables</em> option in the <em>View</em> menu:
- </p>
- <image file="tv_start_mnesia.gif">
- <icaption>The TV Main Window, showing Mnesia tables.</icaption>
- </image>
- <p>Normally, system tables (i.e., tables used by system applications) and unreadable
- tables are not shown. The menu option <em>System Tables</em>, in the <em>Options</em>
- menu, makes the system tables visible:
- </p>
- <image file="tv_start_system.gif">
- <icaption>The TV Main Window, showing readable user and system tables.</icaption>
- </image>
- <p>Still unreadable tables are hidden, but the menu option <em>Unreadable Tables</em>,
- also in the <em>Options</em> menu, makes even those tables visible. It shall be noted
- that rows containing unreadable tables are shaded, using a grey colour:
- </p>
- <image file="tv_start_system_unreadable.gif">
- <icaption>The TV Main Window, showing both readable and unreadable user and system tables.</icaption>
- </image>
- <p>Once a table view has been opened, the user may choose how to view it: it may be sorted
- by the table names, by the table identifiers, by the process identifiers of the owner
- processes, or by the names of the owning processes. These sorting options are found in the
- <em>Options</em> menu.
- </p>
- <image file="tv_start_pid_sorted.gif">
- <icaption>The TV Main Window, tables sorted by owner PID.</icaption>
- </image>
- </section>
-
- <section>
- <title>Changing the Current Node</title>
- <p>By default, the Table Vizualizer will show tables residing on the node
- it was started from. However, the user may easily view tables on other nodes.
- By choosing the <em>Nodes</em> option, in the <em>File</em> menu, a window showing
- all connected nodes will appear. Clicking on any of the nodes in the list will cause
- the main window to immediately show the tables residing on the specified node:
- </p>
- <image file="tv_start_other_node.gif">
- <icaption>The Connected Nodes window, and the TV Main Window, showing tables on the selected node.</icaption>
- </image>
- </section>
-
- <section>
- <title>Opening a Table in the Table Browser</title>
- <p>Whenever a table shall be opened, the first step is to choose the corresponding
- <em>Table Name</em> or <em>Table ID</em> cell. Secondly, the <em>Open Table</em>
- menu item, in the <em>File</em> menu, has to be chosen. (Or, one may directly
- double-click on a <em>Table Name</em> or <em>Table Id</em> cell.)</p>
- <p>If the table selected table is readable, a window will appear after a short delay. This new
- window is hereafter denoted the <em>Table Browser</em> window. Should the table be
- unreadable, the Table Information window will appear instead (see further description
- below).
- </p>
-
- <section>
- <title>The Table Browser Window</title>
- <p>The Table Browser window consists of:</p>
- <list type="bulleted">
- <item>
- <p>a <em>menubar</em>.</p>
- </item>
- <item>
- <p>a <em>toolbar</em> with buttons providing shortcuts to the menubar options. If the
- cursor rests on any button, a so-called toolbar tip, explaining the button,
- will appear. <br></br>
-
- (In the picture below, the cursor has lingered on the <em>Open Table</em>
- button for a while.)</p>
- </item>
- <item>
- <p>a <em>content and edit field</em>, showing the content of a specified row or cell.
- Through this field the row, or cell, may also be edited (see below for a detailed
- description).</p>
- </item>
- <item>
- <p>a <em>grid</em>, i.e., a multicolumnar array, where the content of the
- opened table will be shown. (As above, each square in the grid is called a cell.</p>
- </item>
- </list>
- <image file="tv_table_browser.gif">
- <icaption>The Table Browser Window.</icaption>
- </image>
- <p>The successful appearance of the Table Browser window means that an image of
- the selected table has been created in the TV. It is this image
- that is shown in the Table Browser.
- </p>
-
- <section>
- <title>How Table Data Is Presented</title>
- <p>Each object in the table is presented on a row of its own in the grid.
- Each element in the object is presented in a cell of its own. <br></br>
-
- The colours on the <em>vertical</em> buttons to the left of the grid show the status
- of the object on that very row: a bright red colour indicates that the object just
- has been inserted (when the table is opened, all objects are regarded as being
- just inserted), while a bright green colour indicates that the object has been
- changed. The colour fades away, shade by shade, every time the actual table is polled,
- until the normal background colour is encountered. <br></br>
-
- When an object has been deleted, the colour of the corresponding
- <em>vertical button</em> turns to black. The next time the table is polled, the
- object will be removed from the grid.</p>
- <image file="tv_table_browser_updated.gif">
- <icaption>The Table Browser Window, with new, changed, and deleted objects.</icaption>
- </image>
- <p>Normally, new objects are placed at the end of the grid, while all other objects
- maintain their positions between successive polls. However, when sorting mode has
- been ordered, all objects, even new ones, are placed at the correct position
- according to the sorting ordered (see also below).</p>
- <p>Immediately above the <em>horizontal buttons</em>, one or more <em>keys</em> may
- appear. These keys indicates which elements that are used as indices in the
- ETS/Mnesia table, i.e., which fields that are used by ETS/Mnesia as search keys when
- looking up data.</p>
- <p>The grid columns may be resized, by clicking and dragging on the small black <em>resize areas</em> between any two horizontal buttons.</p>
- <p>The rows are enumerated, as a help when navigating through the table. Note: it shall
- not be assumed that these numbers correspond to the placement of the objects in the
- <em>actual table</em>! The row numbers, as presented in the TV, are
- only temporary, and only valid within the TV!
- <br></br>
-
- The number on the <em>vertical scrollbar</em> corresponds to the number the
- uppermost row has (or will have).</p>
- <p>The number shown on the horizontal scrollbar relates to the leftmost column shown.</p>
- </section>
-
- <section>
- <title>How to Poll the Table</title>
- <p>The table is polled whenever the <em>Poll Table</em> option in the <em>Options</em>
- menu is chosen (or the <em>Poll Table</em> toolbar button is pressed). <br></br>
-
- The user may also choose to let the TV poll the table at regular
- intervals. This is done via the <em>Set Poll Interval...</em> option in the
- <em>Options</em> menu, which causes the <em>Set Poll Interval window</em> to appear. </p>
- <p>In the Set Poll Interval window the user selects whether manual or automatic
- polling shall be used, and, in the automatic polling case, the poll interval.</p>
- <image file="set_poll_int.gif">
- <icaption>The Set Poll Interval Window.</icaption>
- </image>
- <p>It shall be noted that, in the case of a large table (or a slow computer/operating
- system), a short poll interval may cause the TV to be flooded, i.e., the
- data resulting from one poll has not been fully treated and presented when the data from
- the next poll arrives. The user is therefore kindly requested to use the automatic
- polling facility with care!</p>
- </section>
-
- <section>
- <title>How to Edit Objects in the Table</title>
- <p>Provided that the table is writable for other processes than the owning process,
- the user may insert, change and delete objects.</p>
- <p>To <em>delete</em> an object, the corresponding row, or a single cell in the
- corresponding row, has to be chosen, by clicking either on the vertical button
- to the left of the row, or on a cell. Thereafter the <em>Delete Object</em>
- option in the <em>Edit Menu</em>
- is chosen. (Should the user regret the delete operation, the row may once again
- be selected, whereupon the <em>Return</em> button simply is pressed.)</p>
- <p>To <em>insert</em> an object, the user may use the <em>Record Editor</em>, or simply
- enter the object in the content and edit field, and then press the <em>Return</em>
- button. <br></br>
-
- The <em>Record Editor</em> is started via the <em>Edit Object</em> option in the
- <em>Edit</em> menu, or via the <em>Edit Object</em> toolbar button. The editor that
- appears looks different depending on the kind of table: for Mnesia tables,
- a writable field is shown for each record entry, as well as the name of the entry.
- For ETS tables, only a writable field is shown; this is due to the fact that the
- size of the tuples inserted in ETS tables may vary, whereas the size of the records
- inserted in a Mnesia table (more or less) is fixed.
- One may select the next field in the record editor by pressing
- the 'Tab' (or 'Arrow Down') button, and select the previous field by pressing
- 'Shift'+'Tab' (or 'Arrow Up'). <br></br>
-
- When the editing is finished, the <em>OK</em> button may be clicked, or
- 'Return' pressed. The TV will then try to insert the new object.
- </p>
- <image file="tv_record_editor_mnesia.gif">
- <icaption>The Record Editor (shown for a Mnesia table).</icaption>
- </image>
- <p>To <em>change</em> an already existing object, the corresponding row, or a single cell
- in the corresponding row, has to be selected first (see below). Then one may edit the
- whole object (or the selected field in the object), either using the record editor
- or the content and edit field, whereupon 'Return' may be pressed (or the 'OK' button
- clicked).
- </p>
- <p>It shall be noted that it is hard to edit objects containing
- <em>process identifiers</em>, <em>references</em>, <em>binaries</em> and <em>ports</em>,
- since it is only a textual representation of these terms that is shown on the screen.
- It is in the general case impossible for the TV to correctly
- convert this textual representation back to the original term. As a courtesy to
- the user, an attempt to do this will nevertheless be done if the edited field
- consists of a single process identifier; however, this conversion will only be
- correct provided
- that the process identifier originates from the current Erlang session. (On
- the other hand, why on earth should any user want to store old process identifiers?)
- </p>
- <p>It shall also be noted that it may be more or less confusing to edit the table,
- depending on whether the table type is <em>set</em>, <em>bag</em>, or
- <em>duplicate_bag</em>, i.e., depending on whether or not objects having the
- same key (or even duplicate objects) are allowed. Please study the ETS or Mnesia
- manual pages, should confusion arise!
- </p>
- </section>
-
- <section>
- <title>How to Search For Objects</title>
- <p>One may search for an object, by choosing the <em>Search Object</em>
- option in the <em>Options</em> menu (or by pressing the <em>Search Object</em>
- toolbar button). In the <em>Search Object window</em> that appears, any valid
- Erlang term or regular expression may be entered, whereupon all objects
- containing (or consisting of) this term, or matching the regular expression,
- will be shown.</p>
- <image file="tv_search_window.gif">
- <icaption>The Search Object Window.</icaption>
- </image>
- <p>In the search result list, by clicking on any object, the Table Browser will
- immediately scroll to the corresponding row in the table shown. This enables
- the user to in a very powerful way quickly find the objects he's interested in.</p>
- <image file="tv_search_result.gif">
- <icaption>The Search Object Window interworking with the Table Browser.</icaption>
- </image>
- </section>
-
- <section>
- <title>How to Mark Table Data</title>
- <p>One may mark a row or a column by clicking on the buttons to the left and above
- the grid, respectively. A single cell is marked by clicking on it. Even empty
- rows and columns may be marked; an empty cell cannot be marked - on the contrary,
- by clicking on an empty cell, all marks are removed.</p>
- <p>Marks are indicated by a cyan blue colour.</p>
- <image file="tv_row_marked.gif">
- <icaption>The TV Main Window: a row has been marked.</icaption>
- </image>
- <p>When a row or a cell has been marked, the content will be shown in the content field,
- together with an indication of the row (and column when applicable) the marked area
- corresponds to. Should the object be very big, only a fraction of it may be shown in
- this field. By clicking on the down-arrow button to the right of the content and
- edit field, a pop-up content field will be shown, where the whole marked object
- may be viewed. The content of this pop-up field may be marked and copied to
- other windows; however, this field cannot be edited.</p>
- <image file="tv_row_marked_popup.gif">
- <icaption>The Table Browser: the pop-up content field.</icaption>
- </image>
- <p>It shall be noted that the user may choose whether lists shall be shown as
- strings or lists; this is done via the <em>View</em> menu.
- </p>
- <p>A marked column may be subject to sorting, see below. When sorting is ordered,
- marks are removed at each polling of the table (because of the difficulties to
- keep track of a certain object, or element, in this case).</p>
- </section>
-
- <section>
- <title>How to Sort Table Data</title>
- <p>The image of the table may be sorted in rising or falling order, using any element as
- sorting key. The element desired is chosen by marking the corresponding column, and
- then choose (either via the <em>Options</em> menu, or via the toolbar buttons) any
- of the sorting options available, i.e., sorting in ascending or descending order.
- The colour of the column button will then change to gold, to indicate that this
- column is the basis for the sorting currently chosen.</p>
- <p>Should no column have been marked, when sorting is ordered, the first element in each
- object (i.e, tuple) will be used as sorting key if the table is an ETS table; the
- second element (i.e., the first field in the record) will be used if the table is a
- Mnesia table.</p>
- <p>Even columns with no elements in them may be subject to sorting. In this case the
- whole object is used as the sorting key.</p>
- <p>When sorting is ordered, new elements will be inserted according to the current
- sorting mode. When the sorting is interrupted (via the <em>No Sorting</em> option),
- the current image of the table keep the current order, but new elements will from
- now on once again be inserted at the end of the image of the table.</p>
- </section>
-
- <section>
- <title>How to Obtain Table Information</title>
- <p>Information about the actual table is obtained via the <em>File</em> menu (or via the
- <em>Table Info</em> toolbar button). The information is printed in a separate window,
- with similar pieces of information grouped together on "flap cards" of their own.
- By clicking on a flap, the information on the corresponding card is made visible.</p>
- <image file="info_window.gif">
- <icaption>The Table Information Window, showing information about a Mnesia table.</icaption>
- </image>
- <p>The Table Information window may also be opened from the TV Main
- Window, by selecting a table and then choose the <em>Table Info</em> option
- in the <em>File</em> menu (or by double-clicking on the <em>Table Size</em>
- field.</p>
- <p>Note: The Table Information window will automatically be opened if the user tries
- to open an unreadable table, since this is the only information available in this
- case.</p>
- </section>
- </section>
-
- <section>
- <title>The Table Browser Menus</title>
- <p>The Table Browser offers the following menus:</p>
- <p></p>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Table Info</em></tag>
- <item>
- <p>Opens the Table Information window, which shows the available information
- about the current table. </p>
- </item>
- <tag><em>Close</em></tag>
- <item>
- <p>Closes the Table Browser window.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The Edit Menu</title>
- <taglist>
- <tag><em>Edit Object...</em></tag>
- <item>
- <p>Opens the Record Editor. If an object is marked, it will be shown in
- the Record Editor.</p>
- </item>
- <tag><em>Delete Object</em></tag>
- <item>
- <p>Deletes a marked object.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The View Menu</title>
- <taglist>
- <tag><em>Lists As Lists</em></tag>
- <item>
- <p>Causes lists in the table to be shown as lists.</p>
- </item>
- <tag><em>Lists As Strings</em></tag>
- <item>
- <p>Causes lists in the table to be shown as strings.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The Options Menu</title>
- <taglist>
- <tag><em>Poll Table</em></tag>
- <item>
- <p>An explicit order to poll the table, i.e., to scan the content.</p>
- </item>
- <tag><em>Poll Interval...</em></tag>
- <item>
- <p>Choose between manual and automatic polling. In the case of automatic
- polling, the user gets the opportunity to choose the polling interval.</p>
- </item>
- <tag><em>Search Object</em></tag>
- <item>
- <p>Enables search for objects containing (or consisting of) a specified
- Erlang term, or matching a regular pattern. The search result may be used
- for quick navigation in the table.</p>
- </item>
- <tag><em>Sort Ascending Order</em></tag>
- <item>
- <p>Shows the table content sorted in ascending (i.e., rising) order.
- New objects will be shown with correct placement as long the as the sorting
- is going on. <br></br>
-
- Please note that it is only the image of the table that is affected,
- <em>not</em> the table itself!</p>
- </item>
- <tag><em>Sort Descending Order</em></tag>
- <item>
- <p>Shows the table content sorted in descending (i.e., falling) order.
- New objects will be shown with correct placement as long the as the
- sorting is going on.</p>
- </item>
- <tag><em>No Sorting</em></tag>
- <item>
- <p>Sorting mode is left. New objects will be shown last in the
- table. However, older objects will remain in the position they had when
- the sorting mode was left, i.e., their placement will not reflect their
- actual placement in the ETS/Mnesia table.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The Help Menu</title>
- <taglist>
- <tag><em>Help</em></tag>
- <item>
- <p>Shows the help (about TV usage) that is available.
- (The help will be shown in the Netscape Internet browser, if available.)</p>
- </item>
- <tag><em>OTP Documentation</em></tag>
- <item>
- <p>Shows the Documentation about all OTP components that is available
- in the local installation of OTP.</p>
- </item>
- </taglist>
- </section>
- </section>
- </section>
-
- <section>
- <title>Tracing the Owner Process</title>
- <p>The process owning the table may easily be traced, by selecting either
- the <em>Owner Pid</em> or the <em>Owner Name</em> field, and then choosing
- the <em>Trace Process</em> option in the <em>File</em> menu. <br></br>
-
- (It is also possible to double-click on any of these fields.)</p>
- </section>
-
- <section>
- <title>Creating a New Table</title>
- <p>A new table may easily be created using the <em>New Table window</em>.
- Currently only ETS tables may be created. Since ETS tables
- dies together with the parent process, a special process, registered
- as <em>tv_table_owner</em>, will be the owner of tables created this way.
- This process will not be affected by any termination of the TV,
- i.e., the ETS tables created will live on until they are explicitly killed.
- </p>
- <image file="tv_create_table.gif">
- <icaption>The New Table Window, enabling easy creation of ETS tables.</icaption>
- </image>
- <p>Note: the <em>tv_table_owner</em> is local to each node, meaning
- that the creation of a table on a new node also will start such a process
- on that node. This way only the tables on a specific node dies, should that
- specific node crash.</p>
- </section>
-
- <section>
- <title>The TV Main Window Menus</title>
- <p>The Main Window offers the following menus:</p>
- <p></p>
-
- <section>
- <title>The File Menu</title>
- <taglist>
- <tag><em>Open Table</em></tag>
- <item>
- <p>Open a selected table in a new Table Browser.</p>
- </item>
- <tag><em>New Table</em></tag>
- <item>
- <p>Open the New Table window, enabling easy creation of ETS tables.</p>
- </item>
- <tag><em>Table Info</em></tag>
- <item>
- <p>Opens the Table Information window, showing the available
- information about a selected table. </p>
- </item>
- <tag><em>Nodes...</em></tag>
- <item>
- <p>Open the Connected Nodes window, enabling the user to view
- tables residing on remote nodes.</p>
- </item>
- <tag><em>Trace Process</em></tag>
- <item>Opens a trace window, where the process owning a selected table can
- be traced.</item>
- <tag><em>Exit</em></tag>
- <item>
- <p>Terminates the TV.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The View Menu</title>
- <taglist>
- <tag><em>ETS Tables</em></tag>
- <item>
- <p>Shows ETS tables on the current node.</p>
- </item>
- <tag><em>Mnesia tables</em></tag>
- <item>
- <p>Shows Mnesia tables on the current node.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The Options Menu</title>
- <taglist>
- <tag><em>Refresh</em></tag>
- <item>
- <p>An explicit order to once again check the current node for existing
- tables, and list them.</p>
- </item>
- <tag><em>Unreadable Tables</em></tag>
- <item>
- <p>Option to choose whether or not unreadable tables shall be shown.</p>
- </item>
- <tag><em>System Tables</em></tag>
- <item>
- <p>Option to choose whether or not system tables shall be shown.</p>
- </item>
- <tag><em>Sort by Name</em></tag>
- <item>
- <p>Shows the tables sorted by their names.</p>
- </item>
- <tag><em>Sort by Id</em></tag>
- <item>
- <p>Shows the tables sorted by their table identifiers.</p>
- </item>
- <tag><em>Sort by Owner PID</em></tag>
- <item>
- <p>Shows the tables sorted by the process identifiers of the owning
- processes.</p>
- </item>
- <tag><em>Sort by Owner Name</em></tag>
- <item>
- <p>Shows the tables sorted by the registered names of the owning processes.</p>
- </item>
- <tag><em>Error Messages in Haiku</em></tag>
- <item>
- <p>Option to choose whether or not error messages shall be shown
- in the Japanes poetry style called <em>Haiku</em>.</p>
- </item>
- </taglist>
- </section>
-
- <section>
- <title>The Help Menu</title>
- <taglist>
- <tag><em>Help</em></tag>
- <item>
- <p>Shows the help (about TV usage) that is available.
- (The help will be shown in the Netscape Internet browser, if available.)</p>
- </item>
- <tag><em>OTP Documentation</em></tag>
- <item>
- <p>Shows the Documentation about all OTP components that is available
- in the local installation of OTP.</p>
- </item>
- </taglist>
- </section>
- </section>
-</chapter>
-
-
diff --git a/lib/tv/doc/src/tv.gif b/lib/tv/doc/src/tv.gif
deleted file mode 100644
index d78cf7d8ed..0000000000
--- a/lib/tv/doc/src/tv.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv.xml b/lib/tv/doc/src/tv.xml
deleted file mode 100644
index 4a46003a71..0000000000
--- a/lib/tv/doc/src/tv.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<!DOCTYPE erlref SYSTEM "erlref.dtd">
-
-<erlref>
- <header>
- <copyright>
- <year>1997</year>
- <year>2013</year>
- <holder>Ericsson AB, All Rights Reserved</holder>
- </copyright>
- <legalnotice>
- The contents of this file are subject to the Erlang Public License,
- Version 1.1, (the "License"); you may not use this file except in
- compliance with the License. You should have received a copy of the
- Erlang Public License along with this software. If not, it can be
- retrieved online at http://www.erlang.org/.
-
- Software distributed under the License is distributed on an "AS IS"
- basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
- the License for the specific language governing rights and limitations
- under the License.
-
- The Initial Developer of the Original Code is Ericsson AB.
- </legalnotice>
-
- <title>tv</title>
- <prepared>Fredrik Gustafson</prepared>
- <responsible></responsible>
- <docno></docno>
- <approved></approved>
- <checked></checked>
- <date>1997-11-17</date>
- <rev>1.0</rev>
- <file>table_visualizer.sgml</file>
- </header>
- <module>tv</module>
- <modulesummary>TV graphically examines ETS and Mnesia tables. </modulesummary>
- <description>
- <warning>
- <p>
- The TV application has been superseded by the Observer application.
- TV will be removed in R16.
- </p>
- </warning>
- <p>TV enables the user to examine ETS and Mnesia tables. Once
- a certain table has been opened in the tool, the content may be viewed at
- various levels of detail. The content viewed may also be sorted, using any
- element as key. The table may be polled anytime; either regularly at
- specified intervals, or manually. New and deleted objects, as well as those
- altered, are marked with characteristic colors. </p>
- </description>
- <funcs>
- <func>
- <name>start() -> Pid</name>
- <fsummary>Start TV.</fsummary>
- <type>
- <v>Pid = pid() </v>
- </type>
- <desc>
- <p><c>start/0</c> starts the TV. </p>
- </desc>
- </func>
- </funcs>
-
- <section>
- <title>See Also</title>
- <p>For a complete description of the TV, please
- see the TV User's Guide. </p>
- </section>
-</erlref>
-
-
diff --git a/lib/tv/doc/src/tv_create_table.gif b/lib/tv/doc/src/tv_create_table.gif
deleted file mode 100644
index 7fae7f30cf..0000000000
--- a/lib/tv/doc/src/tv_create_table.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_create_table.ps b/lib/tv/doc/src/tv_create_table.ps
deleted file mode 100644
index 0a3b24bcf5..0000000000
--- a/lib/tv/doc/src/tv_create_table.ps
+++ /dev/null
@@ -1,1120 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_create_table.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:14:11 2001)
-%%BoundingBox: 0 114 250 471
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 114 250 471
-userdict begin
-%%BeginData:
-DisplayImage
-0 114
-250.000000 357.000000
-12
-410 585
-1
-0
-0
-8
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-aa2455
-999999
-000a01ff0183000b0208040001ff018300000208040000000208040002ff028300000208
-0400000002080400020000ff0080040002000000020804000000020204060200000004ff
-0480020000000405020204000000020204000209000d02ff027700000202040000000202
-040002080000020d0400025e010302110103028d01010206010102640000020204000000
-0202040002080000020d0400025e01010202010702000101020301010201010102100103
-02180100020f010202020100021901050200010702010103020601070209010102060101
-026400000202040000000202040002080000020d0400025e010102050101020301010203
-010102010101020f01010201010102160101020f01020202010002190101020701010203
-01010201010102080101020c010102060101026400000202040000000202040002080000
-0202040602030400025e010102050101020301010203010102010101020e010102050101
-020001010201010302030103020101040201010302070100020001010201010002020103
-0202010102050101020501010207010102030101020c0101020401030203010102000101
-0203010102020103025d0000020204000000040302080000020204000304000002030400
-025e010102050101020401010202010002020101020e0101020501010200010102000101
-020101010201010102010101020101010202010102010101020601000200010102010100
-0201010102010101020101010201010102010101020501010207010102030102020b0101
-02030101020101010202010202000101020201010201010102010101025c000004030101
-020b0000020304000302000002040400025e010102050101020401010201010102020101
-020e01010205010202020101020101010205010102010101020201010201010102060100
-020001020200010002010101020101010202010102000101020001010206010402040101
-0204010302090101020701010202010102010101020201010201010102010101025f0103
-020b0000020304000302000002040400025e010102050101020501010200010002030101
-020e01010205010102030105020201040201010102020105020601000201010102000100
-020101050202010102000101020001010206010102070101020601020208010102040104
-02020101020101010202010102010105025f0103020b0000020404000300000002050400
-025e0101020501010205010302030101020e010102050101020301010205010102010101
-0201010102020101020a0100020201020201010102060107020601010207010102070101
-0208010102030101020101010202010102010101020201010201010102630103020b0000
-020404000300000002050400025e0101020501010206010102040101020f010102020100
-020001010203010102020100020101010201010102010101020201010202010002060100
-020201020201010102020100020301010201010102070101020701010203010102010101
-0208010102030101020101010202010102010101020201010201010102020100025f0103
-020b00000205000002060400025e01010205010102060101020401010210010302010101
-020401030203010202000101020101020201010302070100020301010202010302040101
-020101010207010502030101020401030209010102040102020001010201010402030101
-0202010302600103020b0000020d0400025e01030211010302ff02000103020b0000020d
-040002ff02790103020b0000020d040002ff02790103020c040d02ff027a010302ff0295
-010302ff02950103020200ff008e0400020201030202000004ff048e0202010302ff0295
-010302020500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000020201030202000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c0100050002020103020205000000056f07ff070e050d
-01000202010302020000057007ff070d0000050c0100050002020103020205000000056f
-070100ff000c050d010002020103020200000570070100ff000c050c0100050002020103
-020205000000056f070100ff000c050d010002020103020200000570070100ff000c050c
-0100050002020103020205000000056f070100ff000c050d010002020103020200000570
-070100040100002001000030010000b2050c0100050002020103020205000000050a0100
-05020100050c0100055107010004010000130100000a0100000001000018010200130100
-00b2050d01000202010302020000050b010105010100050c01000551070100030100001f
-010000020100001901000012010000b3050c0100050002020103020205000000050a0101
-050101000502010205030101050001000502010205040101054407010002010000040101
-000001000003010200030102000201000000010100020100000001020001010100000100
-000301020002010000000101000501000003010200020100000201000002010000b4050d
-01000202010302020000050b010005000100050001000501010005020100050101000501
-010105010100050201000503010105440701000801000000010000000100000101000002
-010000040100000201010001010000010100000001000000010000010100000001000000
-010000010100000201000001010100010100000401000002010000020100000101000002
-010000b8050c0100050002020103020205000000050a0100050001000500010005010100
-0502010005010100050201000501010005020100054a0701000801000000010000000100
-000501000004010000020100000201000001010000000100000001000001010000000100
-000001000005010000010100000801000002010000020100000201000001010000b8050d
-01000202010302020000050b010005010101050101000502010005010100050201000501
-0104054a0701000801000000010000000100000201030004010000020100000201000001
-010000000102000101000000010000000100000201030001010000080100000201040002
-01000001010000b8050c0100050002020103020205000000050a01000501010105010100
-05020100050101000502010005010100054e070100080100000001000000010000010100
-000201000004010000020100000201000001010000050100000001000000010000010100
-00020100000101000008010000020100000701000000010000b8050d0100020201030202
-0000050b0100050201000501010005020100050101000501010105010100050201000503
-010105440701000801000000010000000100000101000002010000040100000201000002
-010000020100000101000001010000000100000001000001010000020100000101000008
-010000020100000201000003010100b9050c0100050002020103020205000000050a0100
-050201000502010205030101050001000502010205040101054407010008010000000100
-000001000002010300040100000201000002010000030101000201000000010000000100
-000201030001010000080100000301020005010000b9050d010002020103020200000570
-07010051010000b9050c0100050002020103020205000000056f0701004e010000000100
-00ba050d0100020201030202000005700701004f010000bb050c01000500020201030202
-05000000056f070100ff000c050d010002020103020200000570070100ff000c050c0100
-050002020103020205000000056f070100ff000c050d0100020201030202000005700701
-00ff000c050c0100050002020103020205000000056f070100ff000c050d010002020103
-020200000570070000ff000d050c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-056d01ff0112050b01000202010302020000056e01ff0112050a01000500020201030202
-05000000056d010107ff070e0101050b01000202010302020000056e010107ff070d0000
-0101050a0100050002020103020205000000056d0101070100ff000c0101050b01000202
-010302020000056e0101070100ff000c0101050a0100050002020103020205000000056d
-0101070100ff000c0101050b01000202010302020000056e010107010000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-00d20101050a0100050002020103020205000000056d010107010337010100d20101050b
-01000202010302020000056e0101070100000336010100d20101050a0100050002020103
-020205000000050a0104050801000506010205490101070103180100030a010003060102
-0307010100d20101050b01000202010302020000050d0100050a01000508010005490101
-0701000003170100030a0100030801000307010100d20101050a01000500020201030202
-05000000050c010005040102050201000500010105050100050301020509010005000101
-050301020502010105000100050301020504010105180101070103010101030001000302
-0100030201000308010403020102030201000300010103050100030301020300010100d2
-0101050b01000202010302020000050d0100050301000502010005010101050101000504
-010005020100050201000508010105010100050101000502010005010100050001000500
-010005010100050201000503010105180101070100000300010003000100030001000301
-010003020100030a01000303010003020100030101010301010003040100030201000302
-010200d20101050a0100050002020103020205000000050c010005070100050101000502
-010005040100050201000502010005080100050201000505010005010100050001000500
-01000501010005020100051e010107010301010003000100030001000302010003010100
-030a010003070100030101000302010003040100030201000302010200d20101050b0100
-0202010302020000050d0100050401030501010005020100050401000502010405080100
-050201000502010305010100050001000500010005010104051e01010701000003000100
-03000100030001000302010003010100030a010003040103030101000302010003040100
-0302010600d20101050a0100050002020103020205000000050c01000503010005020100
-05010100050201000504010005020100050c010005020100050101000502010005010100
-050001000500010005010100052201010701030101000300010003000100030301000300
-0100030a01000303010003020100030101000302010003040100030201000303010100d2
-0101050b01000202010302020000050d0100050301000502010005010101050101000504
-010005020100050201000508010005020100050101000502010005010100050001000500
-010005010100050201000503010105180101070100000300010003000100030001000303
-0101030b01000303010003020100030101010301010003040100030201000302010200d2
-0101050a0100050002020103020205000000050c01000504010305010100050001010505
-010005030102050901000502010005020103050101000500010005000100050201020504
-010105180101070103010100030001000300010003040100030c01010302010303010100
-0300010103050100030301020300010100d20101050b01000202010302020000056e0101
-07010000030a0100030101050322010100d20101050a0100050002020103020205000000
-056d010107010308010003000100032b010100d20101050b01000202010302020000056e
-01010701000003080100032c010100d20101050a0100050002020103020205000000056d
-010107010300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-03000100030001000300010000d20101050b01000202010302020000056e0101070100ff
-000c0101050a0100050002020103020205000000056d0101070100ff000c0101050b0100
-0202010302020000056e0101070100ff000c0101050a0100050002020103020205000000
-056d0101070100ff000c0101050b01000202010302020000056e0101070000ff000d0101
-050a0100050002020103020205000000056d01ff0112050b01000202010302020000056e
-01ff0112050a010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c01000500020201030202050000000570000005000000050000000500000005000000
-0508010005020100051a0100050a0100050a01000506010205c601000202010302020000
-0570000005000000050000000500000005000000050001000507010105010100051a0100
-050a0100050a01000508010005c501000500020201030202050000000570000005060100
-050801010501010005020102050201010500010005030102050301010500010005080104
-050201020502010005000101050501000503010205bf0100020201030202000005700000
-050801000507010005000100050001000501010005020100050101000500010005000100
-05010100050201000501010005010101050a010005030100050201000501010105010100
-05040100050201000502010005bd01000500020201030202050000000570000005060100
-050801000500010005000100050501000501010005000100050001000501010005020100
-0501010005020100050a0100050701000501010005020100050401000502010005020100
-05be01000202010302020000057000000508010005070100050101010502010305010100
-0500010005000100050101040501010005020100050a0100050401030501010005020100
-050401000502010405bd0100050002020103020205000000057000000506010005080100
-050101010501010005020100050101000500010005000100050101000505010005020100
-050a010005030100050201000501010005020100050401000502010005c2010002020103
-020200000570000005080100050701000502010005010100050201000501010005000100
-0500010005010100050201000501010005010101050a0100050301000502010005010101
-0501010005040100050201000502010005bd010005000202010302020500000005700000
-050601000508010005020100050201030501010005000100050001000502010205030101
-05000100050b0101050201030501010005000101050501000503010205bf010002020103
-0202000005700000050001000500010005000100050001000500010005ff051001000500
-02020103020205000000057001000500010005000100050001000500010005ff05120100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100020201030202000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050002020103
-020205000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000202010302020000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-0000050000000500000005000000050000000500000005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c0100050002020103020205000000050a010405ff
-057c01000202010302020000050d010005ff057d0100050002020103020205000000050c
-010005030100050201000501010005000101050301020504010105ff0561010002020103
-02020000050d010005030100050201000501010105010100050101000502010005030101
-05ff05600100050002020103020205000000050c01000504010005010100050101000502
-0100050101000502010005ff056701000202010302020000050d01000504010005010100
-05010100050201000501010405ff05660100050002020103020205000000050c01000505
-01000500010005010100050201000501010005ff056b01000202010302020000050d0100
-05050101050201010501010005010100050201000503010105ff05600100050002020103
-020205000000050c0100050601000502010005000101050301020504010105ff05610100
-0202010302020000051501000502010005ff057101000500020201030202050000000511
-0100050001000503010005ff057201000202010302020000051301000504010005ff0571
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005440100
-0567000005670000057401000500020201030202050000000542010005000100051d0100
-0546000005000000050d0100055600000500000005110100051001020505010005120100
-05110100051f01000202010302020000054201000500010005000100051c010005450000
-0500000005000000050c0100055500000500000005000000051001000512010005190100
-05110100051e01000500020201030202050000000540010005000100060105000100050c
-01020503010205020104054200000500000005020000050b010005000101050301020503
-010105000100054200000500000005020000050c01010500010005010100050201000501
-010005000101050501000503010205030102050301020502010405020102050901000500
-0101050301020503010105000100050d0100020201030202000005400100050001000603
-05000100050a010005020100050101000502010005030100054300000500000005040000
-050a01010501010005010100050201000501010005010101054100000500000005040000
-050a01000501010105010100050201000501010105010100050401000505010005020100
-050201000501010005020100050301000503010005020100050801010501010005010100
-050201000501010005010101050c0100050002020103020205000000053e010005000100
-060505000100050901000505010005020100050301000542000005000000050600000509
-010005020100050501000501010005020100054000000500000005060000050901000502
-010005010100050201000501010005020100050401000505010005020100050901000503
-010005030100050201000508010005020100050501000501010005020100050d01000202
-010302020000053e00000500000006070500000005090102050201040503010005410100
-05000100050801000508010005020100050201030501010005020100053f010005000100
-050801000508010005020100050101000502010005010100050201000504010005050100
-050201000506010305030100050301040508010005020100050201030501010005020100
-050c0100050002020103020205000000053e000005000000060505000000050d01000501
-010005070100054201000500010005060100050901000502010005010100050201000501
-010005020100054001000500010005060100050901000502010005010100050201000501
-01000502010005040100050501000502010005050100050201000503010005030100050c
-01000502010005010100050201000501010005020100050d010002020103020200000540
-000005000000060305000000050a01000502010005010100050201000503010005430100
-0500010005040100050a0101050101000501010005020100050101000501010105410100
-0500010005040100050a0100050101010501010005010101050101010501010005040100
-050501000502010005020100050101000502010005030100050301000502010005080101
-0501010005010100050201000501010005010101050c0100050002020103020205000000
-0540000005000000060105000000050c0102050301020505010105420100050001000502
-0100050b010005000101050301030502010105000100054201000500010005020100050c
-010105000100050201010500010005010100050001010505010005050100050301020503
-010305040101050201020509010005000101050301030502010105000100050d01000202
-010302020000054200000500000005000000056301000500010005000100051e01000543
-01000500010005000100051a0100052e010505130100050c010005000202010302020500
-000005420000050000000565010005000100051b0100050201000544010005000100051b
-01000544010005020100050d010002020103020200000544000005670100051d01020546
-0100051c010005450102050d010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-0000050a010305120100051301000506010005ff054c01000202010302020000050b0100
-05020100051101000513010005ff05530100050002020103020205000000050a01000502
-010005010100050001010503010205020104050201020503010205020104050201020503
-010205020100050001010504010105ff053701000202010302020000050b010005020100
-050101010501010005010100050201000503010005030100050201000501010005020100
-0503010005060100050201000502010005010101050101000503010105ff053601000500
-02020103020205000000050a010305020100050501000502010005030100050301000502
-01000501010005070100050601000502010005020100050101000502010005ff053d0100
-0202010302020000050b0100050501000505010005020100050301000503010405010100
-05070100050601000502010005020100050101000502010005ff053c0100050002020103
-020205000000050a01000505010005050100050201000503010005030100050501000507
-0100050601000502010005020100050101000502010005ff053d01000202010302020000
-050b01000505010005050100050201000503010005030100050201000501010005020100
-0503010005060100050201000502010005010100050201000503010105ff053601000500
-02020103020205000000050a010005050100050601020505010105020102050301020505
-0101050401000503010205020100050201000503010105ff053701000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005440100
-0567000005670000057401000500020201030202050000000542010005000100051b0100
-050601020505010005370000050000000524010005130100050e0100051a000005000000
-051e010005120100054001000202010302020000054201000500010005000100051a0100
-05080100053d000005000000050000000523010005130100050e01000519000005000000
-0500000005310100053f0100050002020103020205000000054001000500010006010500
-0100050b0100050001010502010005020100050101000500010105050100050301020503
-0102052e00000500000005020000050b0100050001010502010005000101050301020502
-010405020102050301020502010405020102050301010500010005180000050000000502
-0000050b0100050001010502010005000101050301020502010005020100050201020502
-0104050201020538010002020103020200000540010005000100060305000100050a0101
-050101000501010005020100050101010501010005040100050501000502010005020100
-052c00000500000005040000050a01010501010005010101050101000501010005020100
-050301000503010005020100050101000502010005030100050301000502010005010100
-05010101051700000500000005040000050a010105010100050101010501010005040100
-050201000502010005010100050201000503010005030100050201000536010005000202
-0103020205000000053e0100050001000605050001000509010005020100050101000502
-01000501010005020100050401000505010005020100052f000005000000050600000509
-010005020100050101000505010005020100050301000503010005020100050101000507
-010005030100050201000501010005020100051600000500000005060000050901000502
-010005010100050801000502010005020100050501000503010005030100050201000537
-01000202010302020000053e000005000000060705000000050801000502010005010100
-050201000501010005020100050401000505010005020100052e01000500010005080100
-050801000502010005010100050501000502010005030100050301040501010005070100
-050301040501010005020100051501000500010005080100050801000502010005010100
-050801000503010005000100050301030503010005030104053601000500020201030202
-05000000053e000005000000060505000000050901000502010005010100050201000501
-010005020100050401000505010005020100052f01000500010005060100050901000502
-010005010100050501000502010005030100050301000505010005070100050301000505
-010005020100051601000500010005060100050901000502010005010100050801000503
-01000500010005020100050201000503010005030100053b010002020103020200000540
-000005000000060305000000050a01010501010005010100050101010501010105010100
-05040100050501000502010005020100052c01000500010005040100050a010105010100
-050101000505010005020100050301000503010005020100050101000502010005030100
-05030100050201000501010005010101051701000500010005040100050a010105010100
-050101000508010005040100050301000502010005030100050301000502010005360100
-0500020201030202050000000540000005000000060105000000050b0100050001010503
-0101050001000501010005000101050501000505010005030102052e0100050001000502
-0100050b0100050001010502010005060102050501010502010205030102050501010502
-01020503010105000100051801000500010005020100050b010005000101050201000508
-010005040100050401030504010105020102053801000202010302020000054200000500
-000005000000050c0100055501000500010005000100050c010005550100050001000500
-0100050c0100056401000500020201030202050000000542000005000000050d01000556
-010005000100050d01000556010005000100050d01000565010002020103020200000544
-0000050e010005570100050e010005570100050e01000564010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-02020103020205000000056f072d05ee010002020103020200000570072c000005ed0100
-050002020103020205000000056f0701002b05ee0100020201030202000005700701002b
-05ed0100050002020103020205000000056f0701002b05ee010002020103020200000570
-0701002b05ed0100050002020103020205000000056f0701002b05ee0100020201030202
-000005700701002b05ed0100050002020103020205000000050a010005020100052e0100
-05040100050601000521070100030100002605ee01000202010302020000050b01000501
-0100053501000529070100020101002605ed0100050002020103020205000000050a0100
-050001000504010205020100050201000508010005000101050301020503010205030102
-050201040502010205030102050201000500010105040101050c07010001010000000100
-002605ee01000202010302020000050b0101050401000502010005010100050201000508
-010105010100050101000502010005010100050201000504010005040100050601000502
-010005020100050101010501010005030101050c070100030100002605ed010005000202
-0103020205000000050a0100050001000503010005020100050201000501010005080100
-050201000501010005020100050101000508010005040100050601000502010005020100
-05010100050201000512070100030100002605ee01000202010302020000050b01000501
-010005020104050201000501010005080100050201000501010005020100050201020505
-010005040100050601000502010005020100050101000502010005120701000301000026
-05ed0100050002020103020205000000050a010005010100050201000507010005000100
-050801000502010005010100050201000505010005040100050401000506010005020100
-0502010005010100050201000512070100030100002605ee01000202010302020000050b
-010005020100050101000502010005030101050901010501010005010100050201000501
-010005020100050401000504010005060100050201000502010005010100050201000503
-0101050c070100030100002605ed0100050002020103020205000000050a010005020100
-050201020505010005090100050001010503010205030102050501000505010105040100
-05030102050201000502010005030101050c070100010104002405ee0100020201030202
-0000051c01000509010005470701002b05ed010005000202010302020500000005180100
-05000100050a010005470701002b05ee01000202010302020000051a0100050b01000547
-0701002b05ed0100050002020103020205000000056f0701002b05ee0100020201030202
-000005700701002b05ed0100050002020103020205000000056f0701002b05ee01000202
-01030202000005700701002b05ed0100050002020103020205000000056f0701002b05ee
-0100020201030202000005700700002c05ed010005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-050002020103020205000000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000202010302020000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500020201030202
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000002020103020200000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000202010302020500000005ff058c
-0100020201030202000005ff058c010005000202010302020500000005ff058c01000202
-01030202000005ff058c010005000202010302020500000005ff058c0100020201030202
-000005ff058c010005000202010302020500000005ff058c0100020201030202000005ff
-058c010005000202010302020500000005ff058c0100020201030202000005ff058c0100
-05000202010302020500000005ff058c0100020201030202000005ff058c010005000202
-010302020500000005ff058c0100020201030202000005ff058c01000500020201030202
-0500000005ff058c0100020201030202000005ff058c0100050002020103020205000000
-05ff058c0100020201030202000005ff058c010005000202010302020500000005ff058c
-0100020201030202000005ff058c01000500020201030202050000000557010005000100
-05000100050001000500010005090102051e010005fe0100020201030202000005570100
-05000100050001000500010005000100050000000507010005020100051d010005fd0100
-050002020103020205000000055701000606000005080100050201000501010005000101
-050301020502010005000101050901000500010105020100050001010503010205020100
-050201000502010205030102050201000500010105d10100020201030202000005570100
-050006060500000005070100050201000501010105010100050101000502010005010101
-050101000508010105010100050101010501010005010100050201000501010005020100
-05010100050201000501010005020100050101010501010005cf01000500020201030202
-050000000557010006060000050801000502010005010100050201000501010005020100
-050101000502010005080100050201000501010005050100050201000501010005000100
-050001000501010005050100050201000501010005d40100020201030202000005570100
-050006060500000005070100050201000501010005020100050101040501010005020100
-050801000502010005010100050501000502010005010100050001000500010005020102
-050201040501010005d30100050002020103020205000000055701000606000005080100
-050201000501010005020100050101000505010005020100050801000502010005010100
-050501000502010005010100050001000500010005050100050101000505010005d40100
-020201030202000005570100050006060500000005070100050201000501010105010100
-050101000502010005010100050201000508010105010100050101000505010005020100
-050101000500010005000100050101000502010005010100050201000501010005d30100
-050002020103020205000000055701000606000005090102050201000500010105030102
-050201000502010005080100050001010502010005060102050301000500010005030102
-050301020502010005d40100020201030202000005570100050000000500000005000000
-0500000005000000050e010005ff05190100050002020103020205000000055700000500
-0000050000000500000005000000050f010005ff051a0100020201030202000005710100
-05ff0519010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-020200000556000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000052800000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005460100050002020103020205000000055400000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005280000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000548010002020103
-020200000556000005600100052800000560010005460100050002020103020205000000
-055400000560010005280000056001000548010002020103020200000556000005600100
-052800000560010005460100050002020103020205000000055400000560010005280000
-056001000548010002020103020200000556000005600100052800000560010005460100
-050002020103020205000000055400000560010005280000056001000548010002020103
-020200000556000005600100052800000560010005460100050002020103020205000000
-05540000052a01020502010005020100052a010005280000051c0102051f0102051d0100
-0548010002020103020200000556000005280100050201000501010005010100052c0100
-05280000051a01000502010005200100051e010005460100050002020103020205000000
-0554000005290100050201000501010005000100052c010005280000051b010005020100
-050201020502010005000101050301020503010205050100051d01000548010002020103
-0202000005560000052801000502010005010101052e010005280000051a010005050100
-0502010005010101050101000501010005020100050101000502010005040100051e0100
-054601000500020201030202050000000554000005290100050201000501010005000100
-052c010005280000051b0100050901000501010005020100050101000505010005020100
-05040100051d010005480100020201030202000005560000052801000502010005010100
-05010100052c010005280000051a01000506010305010100050201000501010005050104
-05040100051e010005460100050002020103020205000000055400000529010005020100
-0501010005010100052b010005280000051b010005020100050101000502010005010100
-05020100050101000505010005080100051d010005480100020201030202000005560000
-05280100050201000501010005020100052b010005280000051a01000502010005010100
-0502010005010100050201000501010005020100050101000502010005040100051e0100
-0546010005000202010302020500000005540000052a01020502010005020100052a0100
-05280000051c0102050301030501010005020100050201020503010205050100051d0100
-054801000202010302020000055600000560010005280000056001000546010005000202
-010302020500000005540000056001000528000005600100054801000202010302020000
-055600000560010005280000056001000546010005000202010302020500000005540000
-056001000528000005600100054801000202010302020000055600000560010005280000
-056001000546010005000202010302020500000005540000056001000528000005600100
-054801000202010302020000055600000560010005280000056001000546010005000202
-010302020500000005540000056001000528000005600100054801000202010302020000
-055600000560010005280000056001000546010005000202010302020500000005540000
-056001000528000005600100054801000202010302020000055600000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005280000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000546010005000202
-010302020500000005540000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000528000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001000500010005480100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c0100020201030202000005ff058c010005000202010302020500000005ff
-058c0100020201030202000005ff058c010005000202010302020500000005ff058c0100
-020201030202000005ff058c010005000202010302020500000005ff058c010002020103
-0202000005ff058c010005000202010302020500000005ff058c01000202010302020000
-05ff058c010005000202010302020500000005ff058c0100020201030202000005ff058c
-010005000202010302020500000005ff058c0100020201030202000005ff058c01000500
-0202010302020500000005ff058c0100020201030202000005ff058c0100050002020103
-02020500000005ff058c0100020201030202000005ff058c010005000202010302020500
-000005ff058c010002020101000505ff058c010005000005020204000500000005ff058c
-0100000002020400000002020400000005ff058c01000500000002020400000002020400
-0500000005ff058c01000000020204000000020204000000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500000002020400
-000002020400050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100000002020400000002020400000502ff028300060202
-040000000208040002ff028300000208040000000208040002ff02830000020804000000
-0208040001ff01830000020804000000040901ff018300000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 114 250 471
-%%EOF
diff --git a/lib/tv/doc/src/tv_record_editor_mnesia.gif b/lib/tv/doc/src/tv_record_editor_mnesia.gif
deleted file mode 100644
index fbbdcab515..0000000000
--- a/lib/tv/doc/src/tv_record_editor_mnesia.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_record_editor_mnesia.ps b/lib/tv/doc/src/tv_record_editor_mnesia.ps
deleted file mode 100644
index b4d19f963f..0000000000
--- a/lib/tv/doc/src/tv_record_editor_mnesia.ps
+++ /dev/null
@@ -1,897 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_record_editor_mnesia.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:09:57 2001)
-%%BoundingBox: 0 41 300 330
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 41 300 330
-userdict begin
-%%BeginData:
-DisplayImage
-0 41
-300.000000 289.000000
-12
-385 371
-1
-0
-0
-8
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-999999
-000a01ff016a000b0208040001ff016a00000208040000000208040002ff026a00000208
-0400000002080400020000ff0067040002000000020804000000020204060200000004ff
-0467020000000405020204000000020204000209000d02ff025e00000202040000000202
-040002080000020d04000242010302110103023701010211010102020101022301010231
-01010206010102090101023e00000202040000000202040002080000020d040002420101
-02020107020001010203010102010101020e010402230101020601050204010102020101
-02020100021f01010201010002130100020c0100020b01010206010102090101023e0000
-0202040000000202040002080000020d0400024201010205010102030101020301010201
-0101020e0101020101010222010102060101020801010206010102200100020001010212
-0101020b0101020b010102060101020a0100023e00000202040000000202040002080000
-02020406020304000242010102050101020301010203010102010101020e010102010101
-020201030203010302020103020201010200010102010104020601010205010402020101
-0200010402010103020201010200010102000101020c0100020001040201010302030104
-0200010402080104020101030203010102000101020301010202010302020100023f0000
-020204000000040302080000020204000304000002030400024201010205010102040101
-0202010002020101020e0101020101000202010102010101020101010201010102000101
-020101010201010102000101020001010201010102060101020401010201010102020101
-020101010202010102010101020101010200010102000101020f01010202010102010101
-0201010102050101020b0101020201010201010102020102020001010202010102010101
-020101010242000004030101020b00000203040003020000020404000242010102050101
-020401010201010102020101020e01030203010102010101020101010204010102010101
-020101020202010102010101020601040201010102010101020201010201010102020101
-02010101020101020214010102020101020101010201010202040101020b010102060101
-020201010201010102020101020101010201010102450103020b00000203040003020000
-020404000242010102050101020501010200010002030101020e01010200010102020105
-020101010204010102010101020101010203010102010101020601010204010102010101
-020201010201010102020101020101010201010102150101020201050202010302020101
-020b0101020301040202010102010101020201010201010502450103020b000002040400
-030000000205040002420101020501010205010302030101020e01010200010102020101
-020501010204010102010101020101010203010102010101020601010204010102010101
-020201010201010102020101020101010201010102150101020201010208010202010101
-020b010102020101020101010202010102010101020201010201010102490103020b0000
-02040400030000000205040002420101020501010206010102040101020e010102010101
-020101010202010002010101020201000200010102010101020101010203010102000102
-020601010204010102000102020201010201010102020101020101010201010102030101
-020f010102020101020201000205010102010101020b0101020201010201010102020101
-0201010102020101020101010202010002450103020b0000020500000206040002420101
-020501010206010102040101020e01010201010202010103020301030202010302020101
-020401010200010102060105020101010200010102020101020201020201010302020101
-0203010102100102020101030202010402030102020a0102020101020200010102010104
-020301010202010302460103020b0000020d040002420103021101030293010602680103
-020b0000020d040002ff02600103020b0000020d040002ff02600103020c040d02ff0261
-010302ff027c010302ff027c0103020200ff00750400020201030202000004ff04750202
-010302ff027c010302020500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000202010302020000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050001000202010302020500000005ff057201000500020201030202000005ff05740100
-0202010302020500000005ff057201000500020201030202000005ff0574010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff057401000202010302020500000005ff0572010005000202
-01030202000005ff057401000202010302020500000005ff057201000500020201030202
-000005ff057401000202010302020500000005ff057201000500020201030202000005ff
-057401000202010302020500000005ff057201000500020201030202000005ff05740100
-02020103020205000000054e01ff0116050c010005000202010302020000054f01ff0116
-050d010002020103020205000000054e010107ff07120101050c01000500020201030202
-0000054f010107ff071100000101050d010002020103020205000000054e0101070100ff
-00100101050c010005000202010302020000054f0101070100ff00100101050d01000202
-0103020205000000054e0101070100ff00100101050c010005000202010302020000054f
-010107010000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-00000300000003000000030000000300000003000000030000d00101050d010002020103
-020205000000054e01010701034000cf0101050c010005000202010302020000054f0101
-07010000033e010000cf0101050d010002020103020205000000054e0101070103130100
-030b01010304010003140100030100cf0101050c010005000202010302020000054f0101
-0701000003120100030a0100031c01000300010000cf0101050d01000202010302020500
-0000050f0100050001010503010205020101050001000503010205250101070103010100
-030201000301010003000101030301010300010003020102030401000304010203020100
-03000101030301020303010103000100030100cf0101050c010005000202010302020000
-051001010501010005010100050201000501010005000100050001000501010005020100
-052401010701000003000100030201000301010103010100030101000301010103010100
-030201000301010403040100030201010301010003010100030201000301010003010101
-0300010000cf0101050d010002020103020205000000050f010005020100050501000501
-010005000100050001000501010005020100052401010701030101000302010003010100
-030201000301010003020100030101000302010003030100030601000302010003020100
-03010100030201000301010003020100030100cf0101050c010005000202010302020000
-051001000502010005020103050101000500010005000100050101040524010107010000
-030001000302010003010100030201000301010003020100030101040303010003060100
-03020100030201000301010403010100030201000300010000cf0101050d010002020103
-020205000000050f01000502010005010100050201000501010005000100050001000501
-010005280101070103010100030201000301010003020100030101000302010003010100
-03070100030601000302010003020100030101000305010003020100030100cf0101050c
-010005000202010302020000051001000502010005010100050201000501010005000100
-050001000501010005020100052401010701000003000100030101010301010003020100
-030101000301010103010100030201000303010003060100030201000302010003010100
-0302010003010100030101010300010000cf0101050d010002020103020205000000050f
-010005020100050201030501010005000100050001000502010205250101070103020101
-030001000301010003020100030201010300010003020102030401000306010003020100
-03020100030201020303010103000100030100cf0101050c010005000202010302020000
-054f010107010000033e010000cf0101050d010002020103020205000000054e01010701
-034000cf0101050c010005000202010302020000054f010107010000033e010000cf0101
-050d010002020103020205000000054e0101070103000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-03000100030000cf0101050c010005000202010302020000054f0101070100ff00100101
-050d010002020103020205000000054e0101070100ff00100101050c0100050002020103
-02020000054f0101070100ff00100101050d010002020103020205000000054e01010701
-00ff00100101050c010005000202010302020000054f0101070000ff00110101050d0100
-02020103020205000000054e01ff0116050c010005000202010302020000054f01ff0116
-050d01000202010302020500000005ff057201000500020201030202000005ff05740100
-0202010302020500000005ff057201000500020201030202000005ff0574010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff0574010002020103020205000000055007ff0712050e0100
-05000202010302020000055107ff07110000050f01000202010302020500000005500701
-00ff0010050e0100050002020103020200000551070100ff0010050f0100020201030202
-050000000550070100ff0010050e0100050002020103020200000551070100ff0010050f
-0100020201030202050000000550070100ff0010050e0100050002020103020200000551
-070100ff0010050f010002020103020205000000051a010005050100052d070100130100
-000b0101000401000014010000d1050e010005000202010302020000051b010005050100
-052d070100130100000a0100001c010000d1050f01000202010302020500000005100102
-050301010500010005020101050001000501010005000101050301020503010205030102
-051207010001010000020100000101000000010100030101000001000002010200040100
-00040102000201000000010100030102000301010000010000d1050e0100050002020103
-020200000510010005020100050101000501010105010100050101010501010105010100
-050101000502010005010100050201000501010005020100051107010001010000020100
-000101010001010000010100000101010001010000020100000101040004010000020101
-000101000001010000020100000101000001010100d1050f010002020103020205000000
-051301000501010005020100050101000502010005010100050501000502010005010100
-050501000515070100010100000201000001010000020100000101000002010000010100
-000201000003010000060100000201000002010000010100000201000001010000020100
-00d1050e0100050002020103020200000511010305010100050201000501010005020100
-050101000505010405020102050301020512070100010100000201000001010000020100
-000101000002010000010104000301000006010000020100000201000001010400010100
-0002010000d1050f010002020103020205000000050f0100050201000501010005020100
-050101000502010005010100050501000509010005050100051107010001010000020100
-000101000002010000010100000201000001010000070100000601000002010000020100
-00010100000501000002010000d1050e0100050002020103020200000510010005020100
-050101000501010105010100050101010501010005050100050201000501010005020100
-050101000502010005110701000101000001010100010100000201000001010000010101
-000101000002010000030100000601000002010000020100000101000002010000010100
-0001010100d1050f01000202010302020500000005100103050201010500010005020101
-050001000501010005060102050301020503010205120701000201010000010000010100
-000201000002010100000100000201020004010000060100000201000002010000020102
-000301010000010000d1050e0100050002020103020200000551070100ff0010050f0100
-020201030202050000000550070100ff0010050e01000500020201030202000005510701
-00ff0010050f0100020201030202050000000550070100ff0010050e0100050002020103
-020200000551070100ff0010050f0100020201030202050000000550070100ff0010050e
-0100050002020103020200000551070100ff0010050f0100020201030202050000000550
-070100ff0010050e0100050002020103020200000551070000ff0011050f010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff057401000202010302020500000005ff0572010005000202
-01030202000005ff057401000202010302020500000005ff057201000500020201030202
-000005ff057401000202010302020500000005ff057201000500020201030202000005ff
-0574010002020103020205000000055007ff0712050e0100050002020103020200000551
-07ff07110000050f0100020201030202050000000550070100ff0010050e010005000202
-0103020200000551070100ff0010050f0100020201030202050000000550070100ff0010
-050e0100050002020103020200000551070100ff0010050f010002020103020205000000
-0550070100ff0010050e0100050002020103020200000551070100ff0010050f01000202
-010302020500000005190100052201000511070100130100000b01010004010000140100
-00d1050e010005000202010302020000053e01000511070100130100000a0100001c0100
-00d1050f010002020103020205000000050f0104050201020502010005000101050a0102
-05030102050301010500010005020102050b070100010100000201000001010000000101
-000301010000010000020102000401000004010200020100000001010003010200030101
-0000010000d1050e01000500020201030202000005140100050401000502010105010100
-0508010005020100050101000502010005010100050101010501010005020100050a0701
-000101000002010000010101000101000001010000010101000101000002010000010104
-0004010000020101000101000001010000020100000101000001010100d1050f01000202
-010302020500000005120100050501000502010005020100050801000505010005020100
-05010100050201000501010005020100050a070100010100000201000001010000020100
-000101000002010000010100000201000003010000060100000201000002010000010100
-00020100000101000002010000d1050e0100050002020103020200000512010005060100
-0502010005020100050801000505010005020100050101000502010005010104050a0701
-000101000002010000010100000201000001010000020100000101040003010000060100
-000201000002010000010104000101000002010000d1050f010002020103020205000000
-051001000507010005020100050201000508010005050100050201000501010005020100
-05010100050e070100010100000201000001010000020100000101000002010000010100
-0007010000060100000201000002010000010100000501000002010000d1050e01000500
-020201030202000005100100050801000502010105010100050801000502010005010100
-0502010005010100050101010501010005020100050a0701000101000001010100010100
-000201000001010000010101000101000002010000030100000601000002010000020100
-0001010000020100000101000001010100d1050f010002020103020205000000050f0104
-050401000502010005000101050a010205030102050301010500010005020102050b0701
-000201010000010000010100000201000002010100000100000201020004010000060100
-000201000002010000020102000301010000010000d1050e010005000202010302020000
-051e0100050401050526070100ff0010050f010002020103020205000000051d01000531
-070100ff0010050e010005000202010302020000051e01000531070100ff0010050f0100
-020201030202050000000550070100ff0010050e01000500020201030202000005510701
-00ff0010050f0100020201030202050000000550070100ff0010050e0100050002020103
-020200000551070100ff0010050f0100020201030202050000000550070100ff0010050e
-0100050002020103020200000551070000ff0011050f01000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff057401000202010302020500000005ff0572010005000202
-01030202000005ff057401000202010302020500000005ff057201000500020201030202
-000005ff057401000202010302020500000005ff057201000500020201030202000005ff
-057401000202010302020500000005ff057201000500020201030202000005ff05740100
-0202010302020500000005ff057201000500020201030202000005ff0574010002020103
-020205000000055007ff0712050e010005000202010302020000055107ff07110000050f
-0100020201030202050000000550070100ff0010050e0100050002020103020200000551
-070100ff0010050f0100020201030202050000000550070100ff0010050e010005000202
-0103020200000551070100ff0010050f0100020201030202050000000550070100ff0010
-050e0100050002020103020200000551070100ff0010050f010002020103020205000000
-05180100050c01000528070100130100000b0101000401000014010000d1050e01000500
-020201030202000005190100050c01000528070100130100000a0100001c010000d1050f
-010002020103020205000000051001020502010405020102050201040502010205200701
-000101000002010000010100000001010003010100000100000201020004010000040102
-000201000000010100030102000301010000010000d1050e010005000202010302020000
-0510010005020100050301000503010005020100050301000503010005020100051f0701
-000101000002010000010101000101000001010000010101000101000002010000010104
-0004010000020101000101000001010000020100000101000001010100d1050f01000202
-0103020205000000050f01000507010005070100050301000503010005020100051f0701
-000101000002010000010100000201000001010000020100000101000002010000030100
-0006010000020100000201000001010000020100000101000002010000d1050e01000500
-02020103020200000511010205040100050401030503010005030104051f070100010100
-000201000001010000020100000101000002010000010104000301000006010000020100
-0002010000010104000101000002010000d1050f01000202010302020500000005130100
-050301000503010005020100050301000503010005230701000101000002010000010100
-000201000001010000020100000101000007010000060100000201000002010000010100
-000501000002010000d1050e010005000202010302020000051001000502010005030100
-0503010005020100050301000503010005020100051f0701000101000001010100010100
-000201000001010000010101000101000002010000030100000601000002010000020100
-0001010000020100000101000001010100d1050f01000202010302020500000005100102
-050501010502010305040101050201020520070100020101000001000001010000020100
-000201010000010000020102000401000006010000020100000201000002010200030101
-0000010000d1050e0100050002020103020200000551070100ff0010050f010002020103
-0202050000000550070100ff0010050e0100050002020103020200000551070100ff0010
-050f0100020201030202050000000550070100ff0010050e010005000202010302020000
-0551070100ff0010050f0100020201030202050000000550070100ff0010050e01000500
-02020103020200000551070100ff0010050f0100020201030202050000000550070100ff
-0010050e0100050002020103020200000551070000ff0011050f01000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff057401000202010302020500000005ff0572010005000202
-01030202000005ff057401000202010302020500000005ff057201000500020201030202
-000005ff057401000202010302020500000005ff057201000500020201030202000005ff
-057401000202010302020500000005ff057201000500020201030202000005ff05740100
-02020103020205000000055007ff0712050e010005000202010302020000055107ff0711
-0000050f0100020201030202050000000550070100ff0010050e01000500020201030202
-00000551070100ff0010050f0100020201030202050000000550070100ff0010050e0100
-050002020103020200000551070100ff0010050f01000202010302020500000005500701
-00ff0010050e0100050002020103020200000551070100ff0010050f0100020201030202
-05000000052d01000521070100130100000b0101000401000014010000d1050e01000500
-0202010302020000052e01000521070100130100000a0100001c010000d1050f01000202
-010302020500000005100102050301020502010005020100050101000500010105020104
-050101000500010105020100050201000511070100010100000201000001010000000101
-000301010000010000020102000401000004010200020100000001010003010200030101
-0000010000d1050e01000500020201030202000005100100050201000501010005020100
-050101000502010005010101050101000503010005030101050101000501010005020100
-051107010001010000020100000101010001010000010100000101010001010000020100
-000101040004010000020101000101000001010000020100000101000001010100d1050f
-010002020103020205000000050f01000505010005020100050101000502010005010100
-050201000503010005030100050601000501010005110701000101000002010000010100
-000201000001010000020100000101000002010000030100000601000002010000020100
-0001010000020100000101000002010000d1050e01000500020201030202000005100100
-050501000502010005010100050201000501010005020100050301000503010005060100
-050101000511070100010100000201000001010000020100000101000002010000010104
-0003010000060100000201000002010000010104000101000002010000d1050f01000202
-0103020205000000050f0100050501000502010005010100050201000501010005020100
-050301000503010005070100050001000511070100010100000201000001010000020100
-000101000002010000010100000701000006010000020100000201000001010000050100
-0002010000d1050e01000500020201030202000005100100050201000501010005020100
-050101000501010105010100050201000503010005030100050701010512070100010100
-000101010001010000020100000101000001010100010100000201000003010000060100
-00020100000201000001010000020100000101000001010100d1050f0100020201030202
-050000000510010205030102050301010500010005010100050201000504010105010100
-050801000512070100020101000001000001010000020100000201010000010000020102
-0004010000060100000201000002010000020102000301010000010000d1050e01000500
-0202010302020000053d01000512070100ff0010050f0100020201030202050000000539
-0100050001000513070100ff0010050e010005000202010302020000053b010005140701
-00ff0010050f0100020201030202050000000550070100ff0010050e0100050002020103
-020200000551070100ff0010050f0100020201030202050000000550070100ff0010050e
-0100050002020103020200000551070100ff0010050f0100020201030202050000000550
-070100ff0010050e0100050002020103020200000551070000ff0011050f010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005ff057401000202010302020500000005ff05720100
-0500020201030202000005ff057401000202010302020500000005ff0572010005000202
-01030202000005ff057401000202010302020500000005ff057201000500020201030202
-000005ff057401000202010302020500000005ff057201000500020201030202000005ff
-057401000202010302020500000005ff057201000500020201030202000005ff05740100
-0202010302020500000005ff057201000500020201030202000005ff0574010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff052f000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050b01000500020201030202000005ff052f00000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000500000005000100050b0100
-0202010302020500000005ff052f000005340100050b01000500020201030202000005ff
-052f000005360100050b01000202010302020500000005ff052f0000052a060005080100
-050b01000500020201030202000005ff052f0000050906000502060005110600050a0600
-05080100050b01000202010302020500000005ff052f0000050806010501060005110600
-050b060005060100050b01000500020201030202000005ff052f00000509060105010600
-05020602050206000502060005010604050a060005060100050b01000202010302020500
-000005ff052f000005080600050006000500060005010600050206000501060005020600
-05030600050d060005040100050b01000500020201030202000005ff052f000005090600
-05000600050006000501060005020600050206000500060005040600050e060005040100
-050b01000202010302020500000005ff052f000005080600050106010501060405030600
-05050600050d060005040100050b01000500020201030202000005ff052f000005090600
-0501060105010600050606000500060005040600050c060005060100050b010002020103
-02020500000005ff052f0000050806000502060005010600050206000501060005020600
-05030600050b060005060100050b01000500020201030202000005ff052f000005090600
-05020600050206020502060005020600050406010508060005080100050b010002020103
-02020500000005ff052f0000052a060005080100050b01000500020201030202000005ff
-052f000005360100050b01000202010302020500000005ff052f000005340100050b0100
-0500020201030202000005ff052f000005360100050b01000202010302020500000005ff
-052f000005340100050b01000500020201030202000005ff052f000005360100050b0100
-0202010302020500000005ff052f00000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001000500010005000100050b01000500020201030202000005ff052f0000
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050b01000202010302020500000005ff057201000500020201030202000005ff
-057401000202010302020500000005ff057201000500020201030202000005ff05740100
-0202010302020500000005ff057201000500020201030202000005ff0574010002020103
-02020500000005ff057201000500020201030202000005ff057401000202010302020500
-000005ff057201000500020201030202000005ff057401000202010302020500000005ff
-057201000500020201030202000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100020201030202050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500020201030202050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500020201030202000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-0000050001000202010302020500000005ff057201000500020201030202000005ff0574
-01000202010302020500000005ff057201000500020201030202000005ff057401000202
-010302020500000005ff057201000500020201030202000005ff05740100020201030202
-0500000005ff057201000500020201030202000005ff0574010002020103020205000000
-05ff057201000500020201030202000005ff057401000202010302020500000005ff0572
-01000500020201030202000005ff057401000202010302020500000005ff057201000500
-020201030202000005ff057401000202010302020500000005ff05720100050002020103
-0202000005ff057401000202010302020500000005ff0572010005000202010302020000
-05ff057401000202010302020500000005ff057201000500020201030202000005ff0574
-01000202010302020500000005ff057201000500020201030202000005ff057401000202
-010302020500000005ff0572010005000202010302020000052e00000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000517000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005170000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0528010002020103020205000000052c0000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000051700000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000517000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005280100050002020103
-02020000052e0000054c010005170000054c010005170000054c01000528010002020103
-020205000000052c0000054c010005170000054c010005170000054c0100052801000500
-0202010302020000052e0000054c010005170000054c010005170000054c010005280100
-02020103020205000000052c0000054c010005170000054c010005170000054c01000528
-010005000202010302020000052e0000054c010005170000054c010005170000054c0100
-0528010002020103020205000000052c0000054c010005170000054c010005170000054c
-01000528010005000202010302020000052e0000054c010005170000054c010005170000
-054c01000528010002020103020205000000052c000005110104051f0100051401000517
-000005120102051f01020513010005170000051401030519010005180100052801000500
-0202010302020000052e0000051201000521010005150100051700000510010005020100
-052001000514010005170000051301000502010005180100051901000528010002020103
-020205000000052c00000513010005030100050001010503010205030102050201000500
-010105020104051201000517000005110100050201000502010205020100050001010503
-010205030102050501000513010005170000051401000502010005020102050301020503
-010205020104051601000528010005000202010302020000052e00000512010005030101
-050101000501010005020100050101000502010005010101050101000503010005150100
-051700000510010005050100050201000501010105010100050101000502010005010100
-050201000504010005140100051700000513010005020100050101000502010005010100
-05020100050101000502010005030100051901000528010002020103020205000000052c
-000005130100050301000502010005010100050501000502010005010100050701000514
-010005170000051101000509010005010100050201000501010005050100050201000504
-010005130100051700000514010305020100050201000501010005050100050201000503
-0100051801000528010005000202010302020000052e0000051201000503010005020100
-050201020502010405010100050701000515010005170000051001000506010305010100
-050201000501010005050104050401000514010005170000051301000501010005020104
-050201020502010405030100051901000528010002020103020205000000052c00000513
-010005030100050201000505010005010100050501000507010005140100051700000511
-010005020100050101000502010005010100050201000501010005050100050801000513
-010005170000051401000502010005010100050901000501010005070100051801000528
-010005000202010302020000052e00000512010005030100050201000501010005020100
-050101000502010005010100050701000515010005170000051001000502010005010100
-050201000501010005020100050101000502010005010100050201000504010005140100
-051700000513010005020100050101000502010005010100050201000501010005020100
-05030100051901000528010002020103020205000000052c000005110104050101000502
-010005020102050301020502010005080101051201000517000005120102050301030501
-010005020100050201020503010205050100051301000517000005140100050201000502
-0102050301020503010205050101051601000528010005000202010302020000052e0000
-054c010005170000054c010005170000054c01000528010002020103020205000000052c
-0000054c010005170000054c010005170000054c01000528010005000202010302020000
-052e0000054c010005170000054c010005170000054c0100052801000202010302020500
-0000052c0000054c010005170000054c010005170000054c010005280100050002020103
-02020000052e0000054c010005170000054c010005170000054c01000528010002020103
-020205000000052c0000054c010005170000054c010005170000054c0100052801000500
-0202010302020000052e0000054c010005170000054c010005170000054c010005280100
-02020103020205000000052c0000054c010005170000054c010005170000054c01000528
-010005000202010302020000052e0000054c010005170000054c010005170000054c0100
-0528010002020103020205000000052c0000054c010005170000054c010005170000054c
-01000528010005000202010302020000052e000005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005170000
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100051700000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000528010002020103
-020205000000052c00000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000517000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005170000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100052801000500020201030202000005ff0574
-01000202010302020500000005ff057201000500020201030202000005ff057401000202
-010302020500000005ff057201000500020201030202000005ff05740100020201030202
-0500000005ff057201000500020201030202000005ff0574010002020103020205000000
-05ff057201000500020201030202000005ff057401000202010302020500000005ff0572
-01000500020201030202000005ff057401000202010302020500000005ff057201000500
-020201030202000005ff057401000202010302020500000005ff05720100050002020103
-0202000005ff057401000202010100040500000005ff0572010005000005020204000000
-05ff057401000000020204000000020204000500000005ff057201000500000002020400
-000002020400000005ff0574010000000202040000000202040005000000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050000000202040000000202040000000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010000000202040000000202
-0400000502ff026a00060202040000000208040002ff026a000002080400000002080400
-02ff026a00000208040000000208040001ff016a0000020804000000040901ff016a0000
-0409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 41 300 330
-%%EOF
diff --git a/lib/tv/doc/src/tv_row_marked.gif b/lib/tv/doc/src/tv_row_marked.gif
deleted file mode 100644
index bc80eb34f1..0000000000
--- a/lib/tv/doc/src/tv_row_marked.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_row_marked.ps b/lib/tv/doc/src/tv_row_marked.ps
deleted file mode 100644
index 99631c5046..0000000000
--- a/lib/tv/doc/src/tv_row_marked.ps
+++ /dev/null
@@ -1,1611 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_row_marked.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:11:48 2001)
-%%BoundingBox: 0 61 377 359
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 61 377 359
-userdict begin
-%%BeginData:
-DisplayImage
-0 61
-377.000000 298.000000
-12
-719 569
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-00ff00
-ff0000
-990000
-7f7f7f
-999999
-ff7f7f
-c8ffff
-009900
-7fff7f
-000a01ff01ff01b8000b0208040001ff01ff01b800000208040000000208040002ff02ff
-02b8000002080400000002080400020000ff00ff00b50400020000000208040000000202
-04060200000004ff04ff04b5020000000405020204000000020204000209000d02ff02ff
-02ac00000202040000000202040002080000020d04000274010302110103023201020258
-0102020c010102010101021e010102290101020601010208010102310101022a01010230
-0101028200000202040000000202040002080000020d0400027401010202010702000101
-0203010102010101020e01050200010702010103020d0101020401010204010302030103
-020e010302060103020301030203010302060103020b0101020a01010202010102190100
-02030101021c0100020b01010206010102090101021b010202020100020d0101022a0101
-020c0104021e0101028200000202040000000202040002080000020d0400027401010205
-0101020301010203010102010101020e0101020701010203010102010101020c01010202
-010302030101020101010201010102010101020801010201010102010101020401010201
-01010201010102010101020101010201010102040101020101010201010102060101020a
-0101020201010218010102210101020b01010206010102090101021b010202020100020d
-01010238010102020101021d010102820000020204000000020204000208000002020406
-020304000274010102050101020301010203010102010101020e01010207010102030101
-020501010209010102030101020701010201010102010101020601020202010102010101
-020801010201010102010101020101010201010102040101020101010202010202030101
-020a01010203010102020103020301030202010302010104020101010202010302030101
-02000101020a0104020101030203010102000101020301010202010302030101021a0100
-020001010201010002020103020301040202010302020101020901010200010102010101
-020301030203010102020101020001010202010102010103020201010200010102010101
-020301030202010102000101020101010202010302020101020201010271000002020400
-000004030208000002020400030400000203040002740101020501010204010102020100
-02020101020e0101020701010203010202040101020a0100020301010207010102010101
-020101010205010102040101020101010208010102010101020101010201010102010101
-02040101020101010204010102020100020b010102030101020101010201010102010101
-020101010200010102010101020101010203010102010101020101010202010202000101
-020a01010202010102010101020201020200010102020101020101010201010102020101
-021a01000200010102010100020101010201010102010101020101010201010102010101
-020101010209010202000102020001010201010102010101020201010202010202000101
-020101010200010102000101020201020200010202000101020101010201010102010101
-0200010102010101020101010201010102010101020201010271000004030101020b0000
-0203040003020000020404000274010102050101020401010201010102020101020e0104
-0204010102040103020d0101020401010205010202020101020101010204010102050101
-020101010207010102020101020101010202010402040101020101010205010102020101
-020901010203010102010101020101010201010102080101020101010203010102010101
-020101010202010102010101020a01010206010102020101020101010202010102010101
-0201010102020101021a0100020001020200010002010101020101010201010102010101
-0201010102010101020d0101020101010201010102050101020201010202010102010101
-020101010200010102000101020201010201010102010101020501010201010202030101
-0201010102010101020101010202010002750103020b0000020304000302000002040400
-0274010102050101020501010200010002030101020e01010207010102060102020e0100
-020301010207010102010101020101010205010102040101020101010206010102030101
-020101010205010102040101020101010204010102020100020b01010203010102010101
-020101010201010102050104020101010203010102010101020101010202010102010101
-020a0101020301040202010102010101020201010201010502020101021a010002010101
-020001000201010102010101020101010201010102010105020d01010201010102010101
-020201040202010102020101020101010201010102000101020001010202010102010101
-0201010102020104020101010204010102010105020201010200010102750103020b0000
-02040400030000000205040002740101020501010205010302030101020e010102070101
-02070101020d010102030101020701010201010102010101020601020202010102010101
-0205010102040101020101010205010102040101020101010202010202030101020a0101
-020301010201010102010101020101010204010102010101020101010203010102010101
-020101010202010102010101020a01010202010102010101020201010201010102020101
-0201010102060101021a0100020201020201010102010101020101010201010102010101
-021101010201010102010101020101010201010102020101020201010201010102010101
-020101010200010102010101020101010201010102010101020101010201010102040101
-02010101020601010200010002760103020b000002040400030000000205040002740101
-020501010206010102040101020e01010207010102030101020101010201010102080101
-020401010203010102010101020101010201010102010101020401010201010102010101
-020101010200010502010101020101010201010102010101020101010200010102010101
-0201010102060101020a0101020201010201010102010101020101010202010002000101
-02010101020101010203010102010101020101010202010102010101020a010102020101
-02010101020201010201010102020101020101010202010002010101021b010002020102
-020101010201010102010101020001020201010102020100020101010209010102010101
-020101010201010102010101020201010202010102010101020201010207010102010101
-020101010201010102010101020101010204010102010101020201000203010202760103
-020b0000020500000206040002740101020501010206010102040101020e010502030101
-020401030202010102080101020401010204010302030103020201010209010302020101
-0200010502020103020301030202010102010103020b0101020a01010202010102020103
-0203010302020102020001010201010202010101020201030203010102010101020b0102
-020101020200010102010104020301010202010302020101021b01000203010102020103
-020301010200010102020103020201010209010102010101020101010202010202000101
-020101010202010102010101020301050202010102010101020101010202010202000101
-0200010102040101020201030204010102770103020b0000020d04000274010302110103
-0232010202190100023d0102020c01010237010602230101029e010102780103020b0000
-020d040002dd010002ff0254010102780103020b0000020d040002ff02ff02ae0103020c
-040d02ff02ff02af010302ff02ff02ca010302ff02ff02ca0103020200ff00ff00c30400
-020201030202000004ff04ff04c30202010302ff02ff02ca010302020500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500020201030202000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500010002020103020205000000
-05ff05ff05c001000500020201030202000005ff05ff05c2010002020103020205000000
-05ff05ff05c001000500020201030202000005ff05ff05c2010002020103020205000000
-05ff05ff05c0010005000202010302020000050c06040504060005030602051f06040505
-0600050406000504060005190600050206000504060005270602050b06000506060005ff
-05df060005020600050906020514010002020103020205000000050b0600050f0600051f
-060005090600050a06000519060005020600052c060005020600050a060005ff05e70600
-05020600050b06000513010005000202010302020000050c060005060602050506000503
-060205180600050606010500060005020602050206040517060005020600050206020503
-060205020600050206000517060005020600050106000500060105020604050206020503
-060205020600050006010503060205ff05ca060005020600050206020505060005020600
-05000601050d010002020103020205000000050b06000508060005050600050206000502
-06000517060005050600050106010504060005040600051a060005000600050506000502
-060005020600050106000502060005170600050206000501060105010600050306000506
-060005020600050206000501060105010600050106000502060005ff05c9060005020600
-0501060005020600050406000502060105010600050b010005000202010302020000050c
-060305050600050506000502060005020600051706030502060005020600050406000504
-0600051a0600050006000505060005020600050206000501060005000600050006000517
-060005020600050106000502060005030600050606000502060005020600050106000502
-06000501060005ff05cd06040501060005020600050406000502060005020600050c0100
-02020103020205000000050b060005080600050506000502060405170600050506000502
-06000504060005040600051a060005000600050506000502060405010600050006000500
-060005170600050206000501060005020600050306000506060005020600050206000501
-0600050206000502060205ff05ca06000502060005010604050406000502060005020600
-050b010005000202010302020000050c0600050806000505060005020600051b06000505
-0600050206000504060005040600051b0600050606000502060005050600050006000500
-060005170600050206000501060005020600050306000506060005020600050206000501
-0600050206000505060005ff05c906000502060005010600050806000502060005020600
-050c010002020103020205000000050b0600050806000505060005020600050206000517
-060005050600050106010504060005040600051b06000506060005020600050206000501
-060005000600050006000517060005020600050106010501060005030600050606000502
-0600050206000501060005020600050106000502060005ff05c906000502060005010600
-05020600050406000502060105010600050b010005000202010302020000050c06000508
-060005050600050306020518060405020601050006000504060005050601051906000506
-060005030602050306000500060005190602050206000500060105050601050406000503
-060205020600050206000502060205ff05ca060005020600050206020505060005020600
-05000601050d01000202010302020500000005a8060005ff05ff05050600050f01000500
-0202010302020000050b0606052a0606052a0606052a06060500060005ff05ef0606050e
-06000510010002020103020205000000050a0606052a0606052a0606052a060605000600
-05ff05ef0606050e0600050f01000500020201030202000005ff05ff05c2010002020103
-02020500000005ff05ff05c001000500020201030202000005ff05ff05c2010002020103
-020205000000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000202010302020000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-02020103020205ff05ff05c402020103020205ff05ff05c402020103020205ff05ff05c4
-02020103020205ff05ff05c402020103020205ff05ff05c402020103020205ff05ff05c4
-02020103020205ff05ff05c402020103020205ff05ff05c4020201030202053600000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000051a00000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050100000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050100000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000051a00000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000051a00000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000051a00000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-00000500000005ff057c0202010302020535000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500010005180000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000100000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500010000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050001000518000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500010005180000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000100
-051800000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500010005ff057b0202010302020536000005140100051a
-00000514010005010000051401000501000005140100051a000005140100051a00000514
-0100051a00000514010005ff057c02020103020205350000051601000518000005160100
-000005160100000005160100051800000516010005180000051601000518000005160100
-05ff057b0202010302020536000005140100051a00000514010005010000051401000501
-000005140100051a000005140100051a000005140100051a00000514010005ff057c0202
-010302020535000005050602050306020506010005180000051601000000051601000000
-0516010005180000051601000518000005160100051800000516010005ff057b02020103
-020205360000050406020503060205050100051a00000514010005010000051401000501
-000005140100051a00000506060405080100051a00000508060105090100051a00000508
-06030507010005ff057c0202010302020535000005040604050106040505010005180000
-051006000504010000000510060005040100000005040600051001000518000005050608
-0507010005180000050806030509010005180000050706070506010005ff057b02020103
-0202053600000503060005010601050106000501060105040100051a0000050f06000503
-010005010000050f0600050301000501000005030600050f0100051a00000503060a0505
-0100051a00000507060305080100051a000005050603050106030504010005ff057c0202
-01030202053500000503060d0504010005180000050d0600050106000504010000000504
-0600050a06000504010000000504060005010600050d0100051800000504060305020603
-050601000518000005090601050a01000518000005060602050306020505010005ff057b
-020201030202053600000501060005000603050006020500060405020100051a0000050c
-060005010600050301000501000005030600050a06000503010005010000050306000501
-0600050c0100051a0000050206030504060305040100051a000005140100051a00000505
-0602050306020504010005ff057c02020103020205350000050206000500060305000602
-050006040503010005180000050a06000501060005010600050401000000050406000504
-060005040600050401000000050406000501060005010600050a01000518000005030602
-050306070503010005180000050706040509010005180000050706010502060205060100
-05ff057b020201030202053600000501060005000603050006020500060405020100051a
-000005090600050106000501060005030100050100000503060005040600050406000503
-01000501000005030600050106000501060005090100051a000005020602050406050503
-0100051a00000507060305080100051a0000050a06020506010005ff057c020201030202
-053500000502060005000603050006020500060405030100051800000507060005010600
-050106000501060005040100000005040600050406000501060005010600050401000000
-050406000501060005010600050106000507010005180000050306020505060305050100
-05180000050906020509010005180000050a06020508010005ff057b0202010302020536
-000005010600050006070500060405020100051a00000506060005010600050106000501
-060005030100050100000503060005040600050106000501060005030100050100000503
-060005010600050106000501060005060100051a0000050206030505060105050100051a
-00000508060205080100051a0000050806020508010005ff057c02020103020205350000
-050206000500060405010600050006040503010005180000050406000501060005010600
-050106000501060005040100000005040600050106000501060005010600050106000504
-010000000504060005010600050106000501060005010600050401000518000005040603
-050d010005180000050906020509010005180000050906020509010005ff057b02020103
-020205360000050106060501060605020100051a00000503060005010600050106000501
-060005010600050301000501000005030600050106000501060005010600050106000503
-010005010000050306000501060005010600050106000501060005030100051a00000503
-060905060100051a00000508060205080100051a00000514010005ff057c020201030202
-053500000502060005000602050506000500060205030100051800000504060005010600
-050106000501060005010600050401000000050406000501060005010600050106000501
-060005040100000005040600050106000501060005010600050106000504010005180000
-050506070508010005180000050806040508010005180000050906020509010005ff057b
-020201030202053600000501060005000602050506000500060205020100051a00000503
-060005010600050106000501060005010600050301000501000005030600050106000501
-060005010600050106000503010005010000050306000501060005010600050106000501
-060005030100051a00000506060405080100051a00000506060605060100051a00000508
-06020508010005ff057c0202010302020535000005020604050506040503010005180000
-051601000000051601000000051601000518000005160100051800000516010005180000
-0516010005ff057b0202010302020536000005140100051a000005140100050100000514
-01000501000005140100051a000005140100051a000005140100051a00000514010005ff
-057c02020103020205350000051601000518000005160100000005160100000005160100
-05180000051601000518000005160100051800000516010005ff057b0202010302020536
-000005140100051a00000514010005010000051401000501000005140100051a00000514
-0100051a000005140100051a00000514010005ff057c0202010302020535000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005180000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010000000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000518000005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005180000
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100051800000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000500010005ff057b02020103
-020205360100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100051a0100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005010100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005010100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100051a0100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100051a0100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100051a0100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005ff057c02020103020205ff05ff05c4020201030202
-05ff05ff05c402020103020205ff05ff05c402020103020205ff05ff05c4020201030202
-05ff05ff05c402020103020205ff05ff05c402020103020205ff05ff05c4020201030202
-05ff05ff05c402020103020205ff05ff05c402020103020205ff05ff05c4020201030202
-05ff05ff05c4020201030202050301ff01ff01bc0503020201030202050301ff01ff01a8
-050000000500000005000000050000000500000005000000050000000500000005000000
-050001000503020201030202050301ff01ff01a800000500000005000000050000000500
-000005000000050000000500000005000000050001010503020201030202050301020bff
-0bff0ba2010205000000050e0100050001000503020201030202050301020bff0bff0ba1
-000001020000051001010503020201030202050301020b0100ff00ff00a0010205000000
-050e0100050001000503020201030202050301020b0100040101007101010002010100ff
-00ff002001020000051001010503020201030202050301020b0100030100007501000001
-010100ff00ff0020010205000000050e0100050001000503020201030202050301020b01
-000301000003010000160100001001000006010200100100000c0100001c010000010101
-00ff00ff002001020000051001010503020201030202050301020b010003010000030100
-002801000008010000100100000c0100001c01000001010100ff00ff0020010205000000
-050e0100050001000503020201030202050301020b010003010000030100000101000003
-010200020100000001010003010200020100000001010009010000000101000501000003
-010200030102000201000001010000030102000201000000010100030102000201000000
-01010003010100000100000301000001010100ff00ff0020010200000502010a05020101
-0503020201030202050301020b0100030100000301000000010000030100000201000001
-010100010100000401000002010100010100000801010001010000040100000201000002
-010000010100000201000001010000000100000301000002010000010101000101000001
-01000002010000010101000101000001010000010101000301000001010100ff00ff0020
-0102050000000502010805020100050001000503020201030202050301020b0100010101
-000401010008010000010100000801000002010000020100000801000002010000040100
-000601000001010000050101000401000002010000010100000201000001010000020100
-0001010000050100000201000004010300ff00ff00200102000005040106050401010503
-020201030202050301020b01000301000003010100050103000101000008010000020100
-000201000008010000020100000401000003010300010100000501010004010400010100
-0002010000010104000101000005010000020100000301000001010100ff00ff00200102
-050000000504010405040100050001000503020201030202050301020b01000301000003
-010000000100000301000002010000010100000801000002010000020100000801000002
-010000040100000201000002010000010100000501000000010000030100000501000002
-010000010100000501000005010000020100000301000001010100ff00ff002001020000
-05060102050601010503020201030202050301020b010003010000030100000101000002
-010000020100000101000008010000020100000201000003010100020101000101000004
-010000020100000201000001010000020100000101000001010000020100000201000001
-0101000101000001010000020100000101000005010000010101000301000001010100ff
-00ff00200102050000000506010005060100050001000503020201030202050301020b01
-000301000003010000020100000201030001010000080100000201000002010000030101
-000201000000010100050100000301030002010200020100000201000002010200020100
-0000010100030102000201000006010100000100000301000001010100ff00ff00200102
-0000051001010503020201030202050301020b0100030100002901000045010000030100
-0001010100ff00ff0020010205000000050e010005000100050302020103020205030102
-0b0100040101002501010042010000020100000101010002010100ff00ff002001020000
-051001010503020201030202050301020b01007201020007010100ff00ff002001020500
-0000050e0100050001000503020201030202050301020b0100ff00ff00a0010200000510
-01010503020201030202050301020b0100ff00ff00a0010205000000050e010005000100
-0503020201030202050301020b0000ff00ff00a101020000051001010503020201030202
-050301ff01ff01a805000000050001000500010005000100050001000500010005000100
-0500010005000100050001000503020201030202050301ff01ff01a80000050001000500
-010005000100050001000500010005000100050001000500010005000101050302020103
-0202050301ff01ff01bc05030202010302020503010005ff05ff05a80100050001000500
-010005000100050001000500010005000100050001000500010005000100050302020103
-02020503010005ff05ff05a7010005000100050001000500010005000100050001000500
-0100050001000500010005000000010005030202010302020503010005010bff0bff0ba3
-0502010003060100030600000500010005030202010302020503010005010bff0bff0ba2
-000005010100050003050000050003060500000001000503020201030202050301000501
-0b0100ff00ff00a105020100030505000100050003050000050001000503020201030202
-0503010005010b0100ff00ff00a105010100050003040500000005000100030505000000
-010005030202010302020503010005010b0100ff00ff00a1050201000304000005020100
-030400000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-03030000050201000500030405000000010005030202010302020503010005010b0100ff
-00ff00a10502010003030500000005020100050003030000050001000503020201030202
-0503010005010b0100ff00ff00a105010100050003020500000005040100030305000000
-010005030202010302020503010005010b0100ff00ff00a1050201000302000005060100
-030200000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-03010000050601000500030205000000010005030202010302020503010005010b0100ff
-00ff00a10502010003010500000005060100050003010000050001000503020201030202
-0503010005010b0100ff00ff00a105010100050003000500000005080100030105000000
-010005030202010302020503010005010b0100ff00ff00a10502010003000000050a0100
-030000000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-000005000100050001000500010005000100050001000500010005000300050000000100
-05030202010302020503010005010b0100ff00ff00a10502010005000100050001000500
-010005000100050001000500010005000100050000000500010005030202010302020503
-010005010b0100ff00ff00a1050101000500030e05000000010005030202010302020503
-010005010b01000301010071010100ff00ff002705020100050000000500000005000000
-050000000500000005000000050000000500000005000100050302020103020205030100
-05010b01000201000075010000ff00ff0026050101000500000005000000050000000500
-000005000000050000000500000005000100050000000100050302020103020205030100
-05010b01000201000003010000160100001001000006010200100100000c0100001c0100
-00ff00ff00260502010005000000050a0100050000000500010005030202010302020503
-010005010b010002010000030100002801000008010000100100000c0100001c010000ff
-00ff00260501010005000000050c01000500000001000503020201030202050301000501
-0b0100020100000301000001010000030102000201000000010100030102000201000000
-010100090100000001010005010000030102000301020002010000010100000301020002
-01000000010100030102000201000000010100030101000001000003010000ff00ff0026
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-000201000003010000000100000301000002010000010101000101000004010000020101
-000101000008010100010100000401000002010000020100000101000002010000010100
-000001000003010000020100000101010001010000010100000201000001010100010100
-00010100000101010003010000ff00ff00260501010005000000050c0100050000000100
-05030202010302020503010005010b010000010100040101000801000001010000080100
-000201000002010000080100000201000004010000060100000101000005010100040100
-000201000001010000020100000101000002010000010100000501000002010000040101
-00ff00ff00240502010005000000050a0100050000000500010005030202010302020503
-010005010b01000201000003010100050103000101000008010000020100000201000008
-010000020100000401000003010300010100000501010004010400010100000201000001
-01040001010000050100000201000003010000ff00ff00260501010005000000050c0100
-05000000010005030202010302020503010005010b010002010000030100000001000003
-010000020100000101000008010000020100000201000008010000020100000401000002
-010000020100000101000005010000000100000301000005010000020100000101000005
-010000050100000201000003010000ff00ff00260502010005000000050a010005000000
-0500010005030202010302020503010005010b0100020100000301000001010000020100
-000201000001010000080100000201000002010000030101000201010001010000040100
-000201000002010000010100000201000001010000010100000201000002010000010101
-0001010000010100000201000001010000050100000101010003010000ff00ff00260501
-010005000000050c010005000000010005030202010302020503010005010b0100020100
-000301000002010000020103000101000008010000020100000201000003010100020100
-000001010005010000030103000201020002010000020100000201020002010000000101
-000301020002010000060101000001000003010000ff00ff00260502010005000000050a
-0100050000000500010005030202010302020503010005010b0100020100002901000045
-01000003010000ff00ff00260501010005000000050c0100050000000100050302020103
-02020503010005010b01000301010025010100420100000201000001010100ff00ff0027
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-0071010200ff00ff002c0501010005000000050c01000500000001000503020201030202
-0503010005010b0100ff00ff00a10502010005000000050a010005000000050001000503
-0202010302020503010005010b0100ff00ff00a10501010005000000050c010005000000
-010005030202010302020503010005010b0100ff00ff00a10502010005000000050a0100
-050000000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-0000050c010005000000010005030202010302020503010005010b0100ff00ff00a10502
-010005000000050a0100050000000500010005030202010302020503010005010b0100ff
-00ff00a10501010005000000050c01000500000001000503020201030202050301000501
-0b0100ff00ff00a10502010005000000050a010005000000050001000503020201030202
-0503010005010b0100ff00ff00a10501010005000000050c010005000000010005030202
-010302020503010005010b0100ff00ff00a10502010005000000050a0100050000000500
-010005030202010302020503010005010b0100ff00ff00a10501010005000000050c0100
-05000000010005030202010302020503010005010b0100ff00ff00a10502010005000000
-050a0100050000000500010005030202010302020503010005010b0100ff00ff00a10501
-010005000000050c010005000000010005030202010302020503010005010b0100ff00ff
-00a10502010005000000050a010005000000050001000503020201030202050301000501
-0b0100ff00ff00a10501010005000000050c010005000000010005030202010302020503
-010005010b0100ff00ff00a10502010005000000050a0100050000000500010005030202
-010302020503010005010b0100ff00ff00a10501010005000000050c0100050000000100
-05030202010302020503010005010b0100ff00ff00a10502010005000000050a01000500
-00000500010005030202010302020503010005010b0100ff00ff00a10501010005000000
-050c010005000000010005030202010302020503010005010b0100ff00ff00a105020100
-05000000050a0100050000000500010005030202010302020503010005010b0100ff00ff
-00a10501010005000000050c010005000000010005030202010302020503010005010b01
-00ff00ff00a10502010005000000050a0100050000000500010005030202010302020503
-010005010b0100ff00ff00a10501010005000000050c0100050000000100050302020103
-02020503010005010b0100ff00ff00a10502010005000000050a01000500000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000000050c01000500
-0000010005030202010302020503010005010b0100ff00ff00a10502010005000000050a
-0100050000000500010005030202010302020503010005010b0100ff00ff00a105010100
-05000000050c010005000000010005030202010302020503010005010b0100ff00ff00a1
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-00ff00ff00a10501010005000000050c0100050000000100050302020103020205030100
-05010b0100ff00ff00a10502010005000000050a01000500000005000100050302020103
-02020503010005010b0100ff00ff00a10501010005000000050c01000500000001000503
-0202010302020503010005010b0100ff00ff00a10502010005000000050a010005000000
-0500010005030202010302020503010005010b0100ff00ff00a10501010005000000050c
-010005000000010005030202010302020503010005010b0100ff00ff00a1050201000500
-0000050a0100050000000500010005030202010302020503010005010b0100ff00ff00a1
-0501010005000000050c010005000000010005030202010302020503010005010b0100ff
-00ff00a10502010005000000050a01000500000005000100050302020103020205030100
-05010b0100ff00ff00a10501010005000000050c01000500000001000503020201030202
-0503010005010b0100ff00ff00a10502010005000000050a010005000000050001000503
-0202010302020503010005010b0100ff00ff00a10501010005000000050c010005000000
-010005030202010302020503010005010b0100ff00ff00a10502010005000000050a0100
-050000000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-0000050c010005000000010005030202010302020503010005010b0100ff00ff00a10502
-010005000000050a0100050000000500010005030202010302020503010005010b0100ff
-00ff00a10501010005000000050c01000500000001000503020201030202050301000501
-0b0100ff00ff00a10502010005000000050a010005000000050001000503020201030202
-0503010005010b0100ff00ff00a10501010005000000050c010005000000010005030202
-010302020503010005010b0100ff00ff00a10502010005000000050a0100050000000500
-010005030202010302020503010005010b0100ff00ff00a10501010005000000050c0100
-05000000010005030202010302020503010005010b0100ff00ff00a10502010005000000
-050a0100050000000500010005030202010302020503010005010b0100ff00ff00a10501
-010005000000050c010005000000010005030202010302020503010005010b0100ff00ff
-00a10502010005000000050a010005000000050001000503020201030202050301000501
-0b0100ff00ff00a10501010005000000050c010005000000010005030202010302020503
-010005010b0100ff00ff00a10502010005000000050a0100050000000500010005030202
-010302020503010005010b0100ff00ff00a10501010005000000050c0100050000000100
-05030202010302020503010005010b0100ff00ff00a10502010005000000050a01000500
-00000500010005030202010302020503010005010b0100ff00ff00a10501010005000000
-050c010005000000010005030202010302020503010005010b0100ff00ff00a105020100
-05000000050a0100050000000500010005030202010302020503010005010b0100ff00ff
-00a10501010005000000050c010005000000010005030202010302020503010005010b01
-00ff00ff00a10502010005000000050a0100050000000500010005030202010302020503
-010005010b0100ff00ff00a10501010005000000050c0100050000000100050302020103
-02020503010005010b0100ff00ff00a10502010005000000050a01000500000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000000050c01000500
-0000010005030202010302020503010005010b0100ff00ff00a10502010005000000050a
-0100050000000500010005030202010302020503010005010b0100ff00ff00a105010100
-05000000050c010005000000010005030202010302020503010005010b0100ff00ff00a1
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-00ff00ff00a10501010005000000050c0100050000000100050302020103020205030100
-05010b0100ff00ff00a10502010005000000050a01000500000005000100050302020103
-02020503010005010b0100ff00ff00a10501010005000000050c01000500000001000503
-0202010302020503010005010b0100ff00ff00a10502010005000000050a010005000000
-0500010005030202010302020503010005010b0100ff00ff00a10501010005000000050c
-010005000000010005030202010302020503010005010b0100ff00ff00a1050201000500
-0000050a0100050000000500010005030202010302020503010005010b0100ff00ff00a1
-0501010005000000050c010005000000010005030202010302020503010005010b0100ff
-00ff00a10502010005000000050a01000500000005000100050302020103020205030100
-05010b0100ff00ff00a10501010005000000050c01000500000001000503020201030202
-0503010005010b0100ff00ff00a10502010005000000050a010005000000050001000503
-0202010302020503010005010b0100ff00ff00a10501010005000000050c010005000000
-010005030202010302020503010005010b0100ff00ff00a10502010005000000050a0100
-050000000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-0000050c010005000000010005030202010302020503010005010b0100ff00ff00a10502
-010005000000050a0100050000000500010005030202010302020503010005010b0100ff
-00ff00a10501010005000000050c01000500000001000503020201030202050301000501
-0b0100ff00ff00a10502010005000000050a010005000000050001000503020201030202
-0503010005010b0100ff00ff00a10501010005000000050c010005000000010005030202
-010302020503010005010b0100ff00ff00a10502010005000000050a0100050000000500
-010005030202010302020503010005010b0100ff00ff00a10501010005000000050c0100
-05000000010005030202010302020503010005010b0100ff00ff00a10502010005000000
-050a0100050000000500010005030202010302020503010005010b0100ff00ff00a10501
-010005000000050c010005000000010005030202010302020503010005010b0100ff00ff
-00a10502010005000000050a010005000000050001000503020201030202050301000501
-0b0100ff00ff00a10501010005000000050c010005000000010005030202010302020503
-010005010b0100ff00ff00a10502010005000000050a0100050000000500010005030202
-010302020503010005010b0100ff00ff00a10501010005000000050c0100050000000100
-05030202010302020503010005010b0100ff00ff00a10502010005000000050a01000500
-00000500010005030202010302020503010005010b0100ff00ff00a10501010005000000
-050c010005000000010005030202010302020503010005010b0100ff00ff00a105020100
-05000000050a0100050000000500010005030202010302020503010005010b0100ff00ff
-00a10501010005000000050c010005000000010005030202010302020503010005010b01
-00ff00ff00a10502010005000000050a0100050000000500010005030202010302020503
-010005010b0100ff00ff00a10501010005000000050c0100050000000100050302020103
-02020503010005010b0100ff00ff00a10502010005000000050a01000500000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000000050c01000500
-0000010005030202010302020503010005010b0100ff00ff00a10502010005000000050a
-0100050000000500010005030202010302020503010005010b0100ff00ff00a105010100
-05000000050c010005000000010005030202010302020503010005010b0100ff00ff00a1
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-00ff00ff00a10501010005000000050c0100050000000100050302020103020205030100
-05010b0100ff00ff00a10502010005000000050a01000500000005000100050302020103
-02020503010005010b0100ff00ff00a10501010005000000050c01000500000001000503
-0202010302020503010005010b0100ff00ff00a10502010005000000050a010005000000
-0500010005030202010302020503010005010b0100ff00ff00a10501010005000000050c
-010005000000010005030202010302020503010005010b0100ff00ff00a1050201000500
-0000050a0100050000000500010005030202010302020503010005010b0100ff00ff00a1
-0501010005000000050c010005000000010005030202010302020503010005010b0100ff
-00ff00a10502010005000000050a01000500000005000100050302020103020205030100
-05010b0100ff00ff00a10501010005000000050c01000500000001000503020201030202
-0503010005010b0100ff00ff00a10502010005000000050a010005000000050001000503
-0202010302020503010005010b0100ff00ff00a10501010005000000050c010005000000
-010005030202010302020503010005010b0100ff00ff00a10502010005000000050a0100
-050000000500010005030202010302020503010005010b0100ff00ff00a1050101000500
-0000050c010005000000010005030202010302020503010005010b0100ff00ff00a10502
-010005000000050a0100050000000500010005030202010302020503010005010b0100ff
-00ff00a10501010005000000050c01000500000001000503020201030202050301000501
-0b0100ff00ff00a10502010005000000050a010005000000050001000503020201030202
-0503010005010b0100ff00ff00a10501010005000000050c010005000000010005030202
-010302020503010005010b0100ff00ff00a10502010005000000050a0100050000000500
-010005030202010302020503010005010b0100ff00ff00a10501010005000000050c0100
-05000000010005030202010302020503010005010b0100ff00ff00a10502010005000000
-050a0100050000000500010005030202010302020503010005010b0100ff00ff00a10501
-010005000000050c010005000000010005030202010302020503010005010b0100ff00ff
-00a10502010005000000050a010005000000050001000503020201030202050301000501
-0b0100ff00ff00a10501010005000000050c010005000000010005030202010302020503
-010005010b0100ff00ff00a10502010005000000050a0100050000000500010005030202
-010302020503010005010b0100ff00ff00a10501010005000000050c0100050000000100
-05030202010302020503010005010b0100ff00ff00a10502010005000000050a01000500
-00000500010005030202010302020503010005010b0100ff00ff00a10501010005000000
-050c010005000000010005030202010302020503010005010b0100ff00ff00a105020100
-05000000050a0100050000000500010005030202010302020503010005010b0100ff00ff
-00a10501010005000000050c010005000000010005030202010302020503010005010b01
-00ff00ff00a10502010005000000050a0100050000000500010005030202010302020503
-010005010b0100ff00ff00a10501010005000000050c0100050000000100050302020103
-02020503010005010b0100ff00ff00a10502010005000000050a01000500000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000000050c01000500
-0000010005030202010302020503010005010b0100ff00ff00a10502010005000000050a
-0100050000000500010005030202010302020503010005010b0100ff00ff00a105010100
-05000000050c010005000000010005030202010302020503010005010b0100ff00ff00a1
-0502010005000000050a0100050000000500010005030202010302020503010005010b01
-00ff00ff00a10501010005000000050c0100050000000100050302020103020205030100
-05010b0100ff00ff00a10502010005000000050a01000500000005000100050302020103
-02020503010005010b0100ff00ff00a10501010005000000050c01000500000001000503
-0202010302020503010005010b0100ff00ff00a10502010005000000050a010005000000
-0500010005030202010302020503010005010b0100ff00ff00a10501010005000000050c
-010005000000010005030202010302020503010005010b0100ff00ff00a1050201000500
-0000050a0100050000000500010005030202010302020503010005010b0100ff00ff00a1
-0501010005000000050c010005000000010005030202010302020503010005010b0100ff
-00ff00a10502010005000000050a01000500000005000100050302020103020205030100
-05010b0100ff00ff00a10501010005000000050c01000500000001000503020201030202
-0503010005010b0100ff00ff00a10502010005000000050a010005000000050001000503
-0202010302020503010005010b0100ff00ff00a10501010005000000050c010005000000
-010005030202010302020503010005010b0100ff00ff00a1050201000500000005000100
-050001000500010005000100050001000500010005000000050001000503020201030202
-0503010005010b0100ff00ff00a105010100050000000500010005000100050001000500
-010005000100050001000500010005000000010005030202010302020503010005010b01
-00ff00ff00a105020100030e00000500010005030202010302020503010005010b0100ff
-00ff00a10501010005000000050000000500000005000000050000000500000005000000
-0500000005000000010005030202010302020503010005010b0100ff00ff00a105020100
-030000000500000005000000050000000500000005000000050000000500000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000300050000000508
-01000500030005000000010005030202010302020503010005010b0100ff00ff00a10502
-010003010500000005080100030000000500010005030202010302020503010005010b01
-00ff00ff00a1050101000500030100000508010003010500000001000503020201030202
-0503010005010b0100ff00ff00a105020100030200000506010005000301000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000302050000000504
-01000500030205000000010005030202010302020503010005010b0100ff00ff00a10502
-010003030500000005040100030200000500010005030202010302020503010005010b01
-00ff00ff00a1050101000500030300000504010003030500000001000503020201030202
-0503010005010b0100ff00ff00a105020100030400000502010005000303000005000100
-05030202010302020503010005010b0100ff00ff00a10501010005000304050000000500
-01000500030405000000010005030202010302020503010005010b0100ff00ff00a10502
-010003050500010005000100030400000500010005030202010302020503010005010b01
-00ff00ff00a1050101000500030500000500010003050500000001000503020201030202
-0503010005010b0100ff00ff00a105020100030601000500030500000500010005030202
-010302020503010005010b0000ff00ff00a2050101000500030605000306050000000100
-05030202010302020503010005ff05ff05a8010005000000050000000500000005000000
-050000000500000005000000050000000500010005030202010302020503010005ff05ff
-05a701000500000005000000050000000500000005000000050000000500000005000000
-0500000001000503020201030202050301ff01ff01bc0503020201030202050301000f01
-0717010007190e01000a0100000201000002010000050100000101000007010000060100
-000201000002010000010100002901000008010000000100000201000002010000050100
-000101000002010000050100000301000003010000020100000101000002010000250100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-01030202050301000f010717010007190e01000a01000002010000020100000101000002
-010000010100000201000003010000060100000201000002010000010100000201000025
-010000090100000301000002010000010100000201000001010000020100000101000002
-010000030100000301000002010000010100000201000025010000630100006301000063
-0100003e010005140100030e0000052401000503020201030202050301000f0107320e01
-000a01000003010200030102000301020004010000060100000201000002010000020102
-002601000009010000040103000201020003010300020102000501010002010300010100
-0002010000250100006301000063010000630100003e0100051301000500030e05000000
-052301000503020201030202050301000f0107320e01000a010000570100006301000063
-01000063010000630100003e010005140100030e00000524010005030202010302020503
-01000f0107320e0100070100000101000057010000630100006301000063010000630100
-003e0100051301000500030e05000000052301000503020201030202050301000f010732
-0e01000801010058010000630100006301000063010000630100003e010005140100030e
-0000052401000503020201030202050301000f0107320e01006301000063010000630100
-0063010000630100003e0100051301000500030e05000000052301000503020201030202
-050301000f0107320e010063010000630100006301000063010000630100003e01000514
-0100030e0000052401000503020201030202050301000f010e3400630100006301000063
-01000063010000630100003e0100051301000500030e0500000005230100050302020103
-0202050301000f000e3501ff01ff013805140100030e0000052401000503020201030202
-050301000c360d6301000d6301000d6301000d6301000d6301000d3e0100051301000500
-030e05000000052301000503020201030202050301000c3509000d6301000d6301000d63
-01000d6301000d6301000d3e010005140100030e00000524010005030202010302020503
-01000c01083209010d6301000d6301000d6301000d6301000d6301000d3e010005130100
-0500030e05000000052301000503020201030202050301000c01083209010d6301000d63
-01000d6301000d6301000d6301000d3e010005140100030e000005240100050302020103
-0202050301000c0108160102081809010d6301000d6301000d6301000d6301000d630100
-0d3e0100051301000500030e05000000052301000503020201030202050301000c010815
-010008020100081709010d0701000d1601000d4201000d0701000d0601020d1001000d0c
-01000d3001000d6301000d6301000d6301000d3e010005140100030e0000052401000503
-020201030202050301000c010815010008020100081709010d0701000d5a01000d070100
-0d0801000d1001000d0c01000d3001000d6301000d6301000d6301000d3e010005130100
-0500030e05000000052301000503020201030202050301000c0108150100080201000817
-09010d0701000d0101000d0301020d0201000d0001010d0301020d0201000d0001010d3b
-01000d0701000d0001010d0501000d0301020d0301020d0201000d0101000d0301020d02
-01000d0001010d0301020d0201000d0001010d0301010d0001000d1701000d6301000d63
-01000d6301000d3e010005140100030e0000052401000503020201030202050301000c01
-08160102081809010d0701000d0001000d0301000d0201000d0101010d0101000d040100
-0d0201010d0101000d3a01000d0701010d0101000d0401000d0201000d0201000d010100
-0d0201000d0101000d0001000d0301000d0201000d0101010d0101000d0101000d020100
-0d0101010d0101000d0101000d0101010d1701000d6301000d6301000d6301000d3e0100
-051301000500030e05000000052301000503020201030202050301000c01081501000802
-0100081709010d0701010d0801000d0101000d0801000d0201000d0201000d3a01000d07
-01000d0201000d0401000d0601000d0101000d0501010d0401000d0201000d0101000d02
-01000d0101000d0201000d0101000d0501000d0201000d1701000d6301000d6301000d63
-01000d3e010005140100030e0000052401000503020201030202050301000c0108150100
-08020100081709010d0701010d0501030d0101000d0801000d0201000d0201000d3a0100
-0d0701000d0201000d0401000d0301030d0101000d0501010d0401040d0101000d020100
-0d0101040d0101000d0501000d0201000d1701000d6301000d6301000d6301000d3e0100
-051301000500030e05000000052301000503020201030202050301000c01081501000802
-0100081709010d0701000d0001000d0301000d0201000d0101000d0801000d0201000d02
-01000d3a01000d0701000d0201000d0401000d0201000d0201000d0101000d0501000d00
-01000d0301000d0501000d0201000d0101000d0501000d0501000d0201000d1701000d63
-01000d6301000d6301000d3e010005140100030e00000524010005030202010302020503
-01000c0108160102081809010d0701000d0101000d0201000d0201000d0101000d080100
-0d0201000d0201000d3a01000d0701010d0101000d0401000d0201000d0201000d010100
-0d0201000d0101000d0101000d0201000d0201000d0101010d0101000d0101000d020100
-0d0101000d0501000d0101010d1701000d6301000d6301000d6301000d3e010005130100
-0500030e05000000052301000503020201030202050301000c01083209010d0701000d02
-01000d0201030d0101000d0801000d0201000d0201000d3a01000d0701000d0001010d05
-01000d0301030d0201020d0201000d0201000d0201020d0201000d0001010d0301020d02
-01000d0601010d0001000d1701000d6301000d6301000d6301000d3e010005140100030e
-0000052401000503020201030202050301000c01083209010d6301000d4a01000d170100
-0d6301000d6301000d6301000d3e0100051301000500030e050000000523010005030202
-01030202050301000c01083209010d6301000d4601000d0201000d1701000d6301000d63
-01000d6301000d3e010005140100030e0000052401000503020201030202050301000c01
-083209010d6301000d4701020d1801000d6301000d6301000d6301000d3e010005130100
-0500030e05000000052301000503020201030202050301000c01083209010d6301000d63
-01000d6301000d6301000d6301000d3e010005140100030e000005240100050302020103
-0202050301000c01083209010d6301000d6301000d6301000d6301000d6301000d3e0100
-051301000500030e05000000052301000503020201030202050301000c0109340d630100
-0d6301000d6301000d6301000d6301000d3e010005140100030e00000524010005030202
-01030202050301000c00093501ff01ff0138051301000500030e05000000052301000503
-020201030202050301000a360063010000630100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000a3501000063010000630100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-01030202050301000a0101340063010000630100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000a0101340063010000630100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-01030202050301000a0101160002011a0063010000630100006301000063010000630100
-003e010005140100030e0000052401000503020201030202050301000a01011500000102
-0000011900070100000e01000014010000340100002b0102003401000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0a010115000001020000011900070100000e0100004a0100002d01000034010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0a0101150000010200000119000701000001010000030102000201040002010200020100
-000001010003010200020100000001010003010200260100000701000002010000010100
-00000101000201000000010100030102000301020005010000030102002d010000630100
-0063010000630100003e0100051301000500030e05000000052301000503020201030202
-050301000a01011500000102000001190007010000000100000301000002010000030100
-000301000002010000010101000101000004010000020101000101000001010000020100
-002501000007010000020100000101010001010000010101000101000001010000020100
-0001010000020100000401000002010000020100002c0100006301000063010000630100
-003e010005140100030e0000052401000503020201030202050301000a01011600030119
-000701010008010000030100000701000001010000080100000201000002010000050100
-002501000007010000020100000101000002010000010100000201000001010000090100
-0004010000060100002c0100006301000063010000630100003e0100051301000500030e
-05000000052301000503020201030202050301000a010119000001190007010100050103
-000301000004010300010100000801000002010000020100000201030025010000070100
-000201000001010000020100000101000002010000020102000301030004010000030103
-002c0100006301000063010000630100003e010005140100030e00000524010005030202
-01030202050301000a0101180000011a0007010000000100000301000002010000030100
-000301000002010000010100000801000002010000020100000101000002010000250100
-000701000002010000010100000201000001010000020100000501000001010000020100
-000401000002010000020100002c0100006301000063010000630100003e010005130100
-0500030e05000000052301000503020201030202050301000a0101150002011b00070100
-000101000002010000020100000301000003010000020100000101000008010000020100
-000201000001010000020100002501000007010000010101000101010001010000010101
-0001010000010100000201000001010000020100000401000002010000020100002c0100
-006301000063010000630100003e010005140100030e0000052401000503020201030202
-050301000a01013400070100000201000002010300040101000201030001010000080100
-000201000002010000020103002501000008010100000100000101000000010100020100
-0000010100030102000301030004010000030103002c0100006301000063010000630100
-003e0100051301000500030e05000000052301000503020201030202050301000a010134
-00630100000e010000050100004c0100006301000063010000630100003e010005140100
-030e0000052401000503020201030202050301000a01013400630100000e010000050100
-004c0100006301000063010000630100003e0100051301000500030e0500000005230100
-0503020201030202050301000a01013400630100000e010000050100004c010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0a0101340063010000630100006301000063010000630100003e0100051301000500030e
-05000000052301000503020201030202050301000a010134006301000063010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0a0101340063010000630100006301000063010000630100003e0100051301000500030e
-05000000052301000503020201030202050301000a0001ff01ff016e05140100030e0000
-052401000503020201030202050301000c36006301000063010000630100006301000063
-0100003e0100051301000500030e05000000052301000503020201030202050301000c35
-09000063010000630100006301000063010000630100003e010005140100030e00000524
-01000503020201030202050301000c010832090100630100006301000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0c01083209010063010000630100006301000063010000630100003e010005140100030e
-0000052401000503020201030202050301000c0108130100080401020815090100630100
-00630100006301000063010000630100003e0100051301000500030e0500000005230100
-0503020201030202050301000c0108110102080301000802010008140901006301000032
-0102002d0100006301000063010000630100003e010005140100030e0000052401000503
-020201030202050301000c01081301000803010008020100081409010063010000340100
-002d0100006301000063010000630100003e0100051301000500030e0500000005230100
-0503020201030202050301000c0108130100080301000802010008140901000701010000
-010000030102000301010000010000010100000001010002010000020100000201020034
-010000070100000001010003010200020100000001010002010000000101000201010000
-01000003010200050100000201010000010000260100006301000063010000630100003e
-010005140100030e0000052401000503020201030202050301000c010813010008030100
-080201000814090100070100000001000000010000010100000201000001010000010101
-000101010001010000010100000201000001010000020100003301000007010100010100
-000101000002010000010101000101000001010100010100000101000000010000000100
-000101000002010000040100000201000000010000000100002501000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0c0108130100080301000802010008140901000701000000010000000100000501000001
-010000020100000101000002010000010100000201000001010000370100000701000002
-010000010100000201000001010000050100000501000000010000000100000501000004
-010000020100000001000000010000250100006301000063010000630100003e01000514
-0100030e0000052401000503020201030202050301000c01081301000803010008020100
-081409010007010000000100000001000002010300010100000201000001010000020100
-000101000002010000020102003401000007010000020100000101000002010000010100
-000501000005010000000100000001000002010300040100000201000000010000000100
-00250100006301000063010000630100003e0100051301000500030e0500000005230100
-0503020201030202050301000c0108130100080301000802010008140901000701000000
-010000000100000101000002010000010100000201000001010000020100000101000002
-010000050100003301000007010000020100000101000002010000010100000501000005
-010000000100000001000001010000020100000401000002010000000100000001000025
-0100006301000063010000630100003e010005140100030e000005240100050302020103
-0202050301000c0108110104080201020815090100070100000001000000010000010100
-000201000001010000010101000101000002010000010100000101010001010000020100
-003301000007010000020100000101000002010000010100000501000005010000000100
-000001000001010000020100000401000002010000000100000001000025010000630100
-0063010000630100003e0100051301000500030e05000000052301000503020201030202
-050301000c01083209010007010000000100000001000002010300020101000001000001
-010000020100000201010000010000020102003401000007010000020100000201020002
-010000050100000501000000010000000100000201030004010000020100000001000000
-010000250100006301000063010000630100003e010005140100030e0000052401000503
-020201030202050301000c01083209010019010000480100006301000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0c010832090100150100000201000048010000630100006301000063010000630100003e
-010005140100030e0000052401000503020201030202050301000c010832090100160102
-0049010000630100006301000063010000630100003e0100051301000500030e05000000
-052301000503020201030202050301000c01083209010063010000630100006301000063
-010000630100003e010005140100030e0000052401000503020201030202050301000c01
-083209010063010000630100006301000063010000630100003e0100051301000500030e
-05000000052301000503020201030202050301000c010934006301000063010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0c00093501ff01ff0138051301000500030e050000000523010005030202010302020503
-01000c360063010000630100006301000063010000630100003e010005140100030e0000
-052401000503020201030202050301000c35090000630100006301000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0c01083209010063010000630100006301000063010000630100003e010005140100030e
-0000052401000503020201030202050301000c0108320901006301000063010000630100
-0063010000630100003e0100051301000500030e05000000052301000503020201030202
-050301000c01081301000805010008160901006301000063010000630100006301000063
-0100003e010005140100030e0000052401000503020201030202050301000c0108110102
-0803010208160901001601020005010000420100002b0102003401000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-0c010813010008050100081609010018010000490100002d010000340100006301000063
-010000630100003e010005140100030e0000052401000503020201030202050301000c01
-081301000805010008160901000701010000010000030102000501000003010200020100
-00000101003b010000070100000201000001010000000101000201000000010100030102
-000301020005010000030102002d0100006301000063010000630100003e010005130100
-0500030e05000000052301000503020201030202050301000c0108130100080501000816
-090100070100000001000000010000010100000201000004010000050100000201010001
-0100003a0100000701000002010000010101000101000001010100010100000101000002
-01000001010000020100000401000002010000020100002c010000630100006301000063
-0100003e010005140100030e0000052401000503020201030202050301000c0108130100
-080501000816090100070100000001000000010000050100000401000005010000020100
-00020100003a010000070100000201000001010000020100000101000002010000010100
-000901000004010000060100002c0100006301000063010000630100003e010005130100
-0500030e05000000052301000503020201030202050301000c0108130100080501000816
-09010007010000000100000001000002010300040100000501000002010000020100003a
-010000070100000201000001010000020100000101000002010000020102000301030004
-010000030103002c0100006301000063010000630100003e010005140100030e00000524
-01000503020201030202050301000c010813010008050100081609010007010000000100
-00000100000101000002010000040100000501000002010000020100003a010000070100
-000201000001010000020100000101000002010000050100000101000002010000040100
-0002010000020100002c0100006301000063010000630100003e0100051301000500030e
-05000000052301000503020201030202050301000c010811010408010104081409010007
-01000000010000000100000101000002010000040100000501000002010000020100003a
-010000070100000101010001010100010100000101010001010000010100000201000001
-010000020100000401000002010000020100002c0100006301000063010000630100003e
-010005140100030e0000052401000503020201030202050301000c010832090100070100
-00000100000001000002010300040100000501000002010000020100003a010000080101
-000001000001010000000101000201000000010100030102000301030004010000030103
-002c0100006301000063010000630100003e0100051301000500030e0500000005230100
-0503020201030202050301000c010832090100630100000e010000050100004c01000063
-01000063010000630100003e010005140100030e00000524010005030202010302020503
-01000c010832090100630100000e010000050100004c0100006301000063010000630100
-003e0100051301000500030e05000000052301000503020201030202050301000c010832
-090100630100000e010000050100004c0100006301000063010000630100003e01000514
-0100030e0000052401000503020201030202050301000c01083209010063010000630100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-01030202050301000c01083209010063010000630100006301000063010000630100003e
-010005140100030e0000052401000503020201030202050301000c010934006301000063
-0100006301000063010000630100003e0100051301000500030e05000000052301000503
-020201030202050301000c00093501ff01ff013805140100030e00000524010005030202
-010302020503010005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000063010000630100006301000063010000630100003e01000513
-01000500030e050000000523010005030202010302020503010000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050001000063010000630100
-006301000063010000630100003e010005140100030e0000052401000503020201030202
-05030100050000000532010005000063010000630100006301000063010000630100003e
-0100051301000500030e0500000005230100050302020103020205030100000005340100
-0063010000630100006301000063010000630100003e010005140100030e000005240100
-050302020103020205030100050000000513010005040102051501000500006301000063
-0100006301000063010000630100003e0100051301000500030e05000000052301000503
-02020103020205030100000005120102050301000502010005150100001f010000420100
-001201000017010200340100006301000063010000630100003e010005140100030e0000
-052401000503020201030202050301000500000005130100050301000502010005140100
-050000630100001201000019010000340100006301000063010000630100003e01000513
-01000500030e050000000523010005030202010302020503010000000514010005030100
-050201000515010000070101000001000003010200020100000001010003010200030102
-003b01000008010200030101000001000002010200020100000001010002010000000101
-0005010000030102000201000000010100260100006301000063010000630100003e0100
-05140100030e000005240100050302020103020205030100050000000513010005060100
-051501000500000701000000010000000100000101000002010000010101000101000004
-01000002010000020100003a010000070100000201000001010000010101000101000002
-010000010101000101000001010100010100000401000002010000020100000101010001
-010000250100006301000063010000630100003e0100051301000500030e050000000523
-010005030202010302020503010000000514010005050100051701000007010000000100
-0000010000050100000101000008010000060100003a0100000701000002010000010100
-000201000001010000020100000101000002010000010100000201000004010000060100
-000101000002010000250100006301000063010000630100003e010005140100030e0000
-052401000503020201030202050301000500000005130100050401000517010005000007
-0100000001000000010000020103000101000008010000030103003a0100000701000002
-010000010100000201000001010400010100000201000001010000020100000401000003
-0103000101000002010000250100006301000063010000630100003e0100051301000500
-030e05000000052301000503020201030202050301000000051401000503010005020100
-051501000007010000000100000001000001010000020100000101000008010000020100
-00020100003a010000070100000201000001010000020100000101000005010000020100
-000101000002010000040100000201000002010000010100000201000025010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-050000000511010405010104051401000500000701000000010000000100000101000002
-010000010100000801000002010000020100003a01000007010000020100000101000001
-010100010100000201000001010000020100000101010001010000040100000201000002
-0100000101000002010000250100006301000063010000630100003e0100051301000500
-030e05000000052301000503020201030202050301000000053401000007010000000100
-0000010000020103000101000008010000030103003a0100000801020003010100000100
-000201020002010000020100000101000000010100050100000301030001010000020100
-00250100006301000063010000630100003e010005140100030e00000524010005030202
-0103020205030100050000000532010005000063010000230100003e0100006301000063
-010000630100003e0100051301000500030e050000000523010005030202010302020503
-01000000053401000063010000230100003e0100006301000063010000630100003e0100
-05140100030e000005240100050302020103020205030100050000000532010005000063
-010000230100003e0100006301000063010000630100003e0100051301000500030e0500
-000005230100050302020103020205030100000005340100006301000063010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-050000000532010005000063010000630100006301000063010000630100003e01000513
-01000500030e050000000523010005030202010302020503010000000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000063010000630100
-006301000063010000630100003e010005140100030e0000052401000503020201030202
-050301000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001ff01ff0138051301000500030e05000000052301000503020201030202
-050301000c360063010000630100006301000063010000630100003e010005140100030e
-0000052401000503020201030202050301000c3509000063010000630100006301000063
-010000630100003e0100051301000500030e050000000523010005030202010302020503
-01000c01083209010063010000630100006301000063010000630100003e010005140100
-030e0000052401000503020201030202050301000c010832090100630100006301000063
-01000063010000630100003e0100051301000500030e0500000005230100050302020103
-0202050301000c0108130100080401020815090100630100006301000063010000630100
-00630100003e010005140100030e0000052401000503020201030202050301000c010811
-010208030100080201000814090100170100004a01000007010000300102002601000063
-01000063010000630100003e0100051301000500030e0500000005230100050302020103
-0202050301000c0108130100080701000814090100170100004a01000007010000320100
-00260100006301000063010000630100003e010005140100030e00000524010005030202
-01030202050301000c010813010008070100081409010007010100000100000301020002
-010400020102004201000007010000000101000201000000010100030102000201010000
-010000020101000001000003010200020100000001010005010000030102000201000000
-010100180100006301000063010000630100003e0100051301000500030e050000000523
-01000503020201030202050301000c010813010008050101081509010007010000000100
-000001000001010000020100000301000003010000020100004101000007010100010100
-000101010001010000010100000201000001010000000100000001000001010000000100
-000001000001010000020100000101010001010000040100000201000002010000010101
-0001010000170100006301000063010000630100003e010005140100030e000005240100
-0503020201030202050301000c0108130100080701000814090100070100000001000000
-010000050100000301000003010000450100000701000002010000010100000501000002
-010000010100000001000000010000010100000001000000010000050100000101000002
-01000004010000060100000101000002010000170100006301000063010000630100003e
-0100051301000500030e05000000052301000503020201030202050301000c0108130100
-080701000814090100070100000001000000010000020103000301000004010200420100
-000701000002010000010100000501000002010000010100000001000000010000010100
-000001000000010000020103000101000002010000040100000301030001010000020100
-00170100006301000063010000630100003e010005140100030e00000524010005030202
-01030202050301000c010813010008030100080201000814090100070100000001000000
-010000010100000201000003010000070100004101000007010000020100000101000005
-010000020100000101000000010000000100000101000000010000000100000101000002
-010000010100000201000004010000020100000201000001010000020100001701000063
-01000063010000630100003e0100051301000500030e0500000005230100050302020103
-0202050301000c0108110104080201020815090100070100000001000000010000010100
-000201000003010000030100000201000041010000070101000101000001010000050100
-000201000001010000000100000001000001010000000100000001000001010000020100
-000101010001010000040100000201000002010000010100000201000017010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0c0108320901000701000000010000000100000201030004010100020102004201000007
-010000000101000201000006010200020100000001000000010000010100000001000000
-010000020103000101000000010100050100000301030001010000020100001701000063
-01000063010000630100003e0100051301000500030e0500000005230100050302020103
-0202050301000c0108320901006301000031010000300100006301000063010000630100
-003e010005140100030e0000052401000503020201030202050301000c01083209010063
-01000031010000300100006301000063010000630100003e0100051301000500030e0500
-0000052301000503020201030202050301000c0108320901006301000031010000300100
-006301000063010000630100003e010005140100030e0000052401000503020201030202
-050301000c01083209010063010000630100006301000063010000630100003e01000513
-01000500030e05000000052301000503020201030202050301000c010832090100630100
-00630100006301000063010000630100003e010005140100030e00000524010005030202
-01030202050301000c0109340063010000630100006301000063010000630100003e0100
-051301000500030e05000000052301000503020201030202050301000c00093501ff01ff
-013805140100030e0000052401000503020201030202050301000c360063010000630100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-01030202050301000c3509000063010000630100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000c0108320901006301000063
-0100006301000063010000630100003e0100051301000500030e05000000052301000503
-020201030202050301000c01083209010063010000630100006301000063010000630100
-003e010005140100030e0000052401000503020201030202050301000c01081301000806
-0100081509010063010000630100006301000063010000630100003e0100051301000500
-030e05000000052301000503020201030202050301000c01081101020805010108150901
-0011010000500100001e01000018010000290100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000c0108130100080401000800
-01000815090100630100001e01000018010000290100006301000063010000630100003e
-0100051301000500030e05000000052301000503020201030202050301000c0108130100
-080401000800010008150901000701000000010100030102000201000000010100030102
-004201000008010100000100000101000002010000020102000201040002010200020100
-000201000002010200020100000001010003010200020100000001010003010100000100
-00100100006301000063010000630100003e010005140100030e00000524010005030202
-01030202050301000c010813010008030100080101000815090100070101000101000004
-010000020101000101000001010000020100004101000007010000010101000101000002
-010000010100000201000003010000030100000201000001010000020100000101000002
-010000010101000101000001010000020100000101010001010000010100000101010010
-0100006301000063010000630100003e0100051301000500030e05000000052301000503
-020201030202050301000c01081301000802010008020100081509010007010000020100
-000401000002010000020100000501000041010000070100000201000001010000020100
-000101000007010000070100000101000002010000010100000501000002010000010100
-0002010000010100000501000002010000100100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000c0108130100080201050814
-090100070100000201000004010000020100000201000002010300410100000701000002
-010000010100000201000002010200040100000401030002010000000100000301020002
-010000020100000101040001010000050100000201000010010000630100006301000063
-0100003e0100051301000500030e05000000052301000503020201030202050301000c01
-081301000806010008150901000701000002010000040100000201000002010000010100
-000201000041010000070100000201000001010000020100000501000003010000030100
-000201000002010000000100000601000001010000020100000101000005010000050100
-0002010000100100006301000063010000630100003e010005140100030e000005240100
-0503020201030202050301000c0108110104080301020814090100070100000201000004
-010000020100000201000001010000020100004101000007010000010101000101000001
-010100010100000201000003010000030100000201000003010000030100000201000001
-010100010100000101000002010000010100000501000001010100100100006301000063
-010000630100003e0100051301000500030e050000000523010005030202010302020503
-01000c010832090100070100000201000004010000020100000201000002010300410100
-000801010000010000020101000001000002010200050101000201030003010000040102
-000201000000010100030102000201000006010100000100001001000063010000630100
-00630100003e010005140100030e0000052401000503020201030202050301000c010832
-090100630100000b01000044010000100100006301000063010000630100003e01000513
-01000500030e05000000052301000503020201030202050301000c010832090100630100
-0007010000020100004001000002010000100100006301000063010000630100003e0100
-05140100030e0000052401000503020201030202050301000c0108320901006301000008
-01020042010200110100006301000063010000630100003e0100051301000500030e0500
-0000052301000503020201030202050301000c0108320901006301000063010000630100
-0063010000630100003e010005140100030e000005240100050302020103020205030100
-0c01083209010063010000630100006301000063010000630100003e0100051301000500
-030e05000000052301000503020201030202050301000c01093400630100006301000063
-01000063010000630100003e010005140100030e00000524010005030202010302020503
-01000c00093501ff01ff0138051301000500030e05000000052301000503020201030202
-050301000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000063010000630100006301000063010000630100003e010005140100030e
-000005240100050302020103020205030100000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500010000630100006301000063010000630100
-00630100003e0100051301000500030e0500000005230100050302020103020205030100
-050000000532010005000063010000630100006301000063010000630100003e01000514
-0100030e0000052401000503020201030202050301000000053401000063010000630100
-006301000063010000630100003e0100051301000500030e050000000523010005030202
-010302020503010005000000051301000503010405140100050000630100006301000063
-01000063010000630100003e010005140100030e00000524010005030202010302020503
-01000000051201020503010005190100000f010200030102004901000007010000230100
-000b010200030102001f0100006301000063010000630100003e0100051301000500030e
-050000000523010005030202010302020503010005000000051301000503010005180100
-05000011010000050100004901000007010000230100000d010000050100001f01000063
-01000063010000630100003e010005140100030e00000524010005030202010302020503
-010000000514010005030100051901000008010200050100000501000003010200420100
-000701000000010100030102000201000000010100020100000001010003010200020104
-00010100000201000004010000050100001f0100006301000063010000630100003e0100
-051301000500000005000000050000000500000005000000050000000500000005000000
-05000000052301000503020201030202050301ff01ff0170051400000500000005000000
-050000000500000005000000050000000500000005000000052401000503020201030202
-0503010005ff05ff05ba010005030202010302020503010005ff05ff05ba010005030202
-010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba0100
-05030202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff
-05ba010005030202010302020503010005ff05ff05ba0100050302020103020205030100
-05ff05ff05ba01000503020201030202050301000549010005ff05ff056f010005030202
-01030202050301000548010105ff05ff056f010005030202010302020503010005470100
-0500010005ff05ff056f01000503020201030202050301000549010005ff05ff056f0100
-0503020201030202050301000549010005ff05ff056f0100050302020103020205030100
-0549010005ff05ff056f01000503020201030202050301000549010005ff05ff056f0100
-0503020201030202050301000549010005ff05ff056f0100050302020103020205030100
-0547010405ff05ff056d010005030202010302020503010005ff05ff05ba010005030202
-010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba0100
-05030202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff
-05ba01000503020201030202050301000538010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-054a01000503020201030202050301000537010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-054b01000503020201030202050301000538010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000003ff03ff031505000000054a01000503020201030202050301000537
-010005000000050000000500000005000000050000000500000005000000050000000500
-0000050000000500000005000000050000000500000005000000050003ff03ff03150000
-054b01000503020201030202050301000538010005000000050c0000050c010003ff03ff
-031505000000054a01000503020201030202050301000537010005000000050c0100050c
-0100050003ff03ff03150000054b01000503020201030202050301000538010005000000
-050c0000050c010003ff03ff031505000000054a01000503020201030202050301000537
-010005000000050c0100050c0100050003ff03ff03150000054b01000503020201030202
-050301000538010005000000050c0000050c010003ff03ff031505000000054a01000503
-020201030202050301000537010005000000050c0100050c0100050003ff03ff03150000
-054b01000503020201030202050301000538010005000000050c0000050c010003ff03ff
-031505000000054a01000503020201030202050301000537010005000000050c0100050c
-0100050003ff03ff03150000054b01000503020201030202050301000538010005000000
-050c0000050c010003ff03ff031505000000054a01000503020201030202050301000537
-010005000000050c0100050c0100050003ff03ff03150000054b01000503020201030202
-050301000538010005000000050c0000050c010003ff03ff031505000000054a01000503
-020201030202050301000537010005000000050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050003ff03ff03150000054b01000503020201030202050301000538010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010003ff03ff031505000000054a01000503
-020201030202050301000537010005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000054b01000503
-020201030202050301000538000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000054a01000503
-0202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba
-010005030202010302020503010005ff05ff05ba010005030202010302020503010005ff
-05ff05ba010005030202010302020503010005ff05ff05ba010005030202010302020503
-010005ff05ff05ba010005030202010302020503010005ff05ff05ba0100050302020103
-02020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba01000503
-0202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba
-010005030202010302020503010005ff05ff05ba010005030202010302020503010005ff
-05ff05ba010005030202010302020503010005ff05ff05ba010005030202010302020503
-010005ff05ff05ba010005030202010302020503010005ff05ff05ba0100050302020103
-02020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba01000503
-0202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba
-010005030202010302020503010005ff05ff05ba010005030202010302020503010005ff
-05ff05ba010005030202010302020503010005ff05ff05ba010005030202010302020503
-010005ff05ff05ba010005030202010302020503010005ff05ff05ba0100050302020103
-02020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba01000503
-0202010302020503010005ff05ff05ba010005030202010302020503010005ff05ff05ba
-010005030202010302020503010005ff05ff05ba010005030202010302020503010005ff
-05ff05ba010005030202010302020503010005ff05ff05ba010005030202010302020503
-010005ff05ff05ba010005030202010100040503010005ff05ff05ba0100050300050202
-0400050301ff01ff01bc050300000202040000000202040005ff05ff05c4000002020400
-00000202040005ff05ff05c400000202040000000202040005ff05ff05c4000002020400
-00000202040005ff05ff05c4000002020400000002020400000502ff02ff02b800060202
-040000000208040002ff02ff02b800000208040000000208040002ff02ff02b800000208
-040000000208040001ff01ff01b80000020804000000040901ff01ff01b800000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 61 377 359
-%%EOF
diff --git a/lib/tv/doc/src/tv_row_marked_popup.gif b/lib/tv/doc/src/tv_row_marked_popup.gif
deleted file mode 100644
index 9b3bc87959..0000000000
--- a/lib/tv/doc/src/tv_row_marked_popup.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_row_marked_popup.ps b/lib/tv/doc/src/tv_row_marked_popup.ps
deleted file mode 100644
index 7a909110d9..0000000000
--- a/lib/tv/doc/src/tv_row_marked_popup.ps
+++ /dev/null
@@ -1,1324 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_row_marked_popup.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:12:10 2001)
-%%BoundingBox: 0 64 377 377
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 64 377 377
-userdict begin
-%%BeginData:
-DisplayImage
-0 64
-377.000000 313.000000
-12
-760 630
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-ff0000
-d9d9d9
-b22222
-828282
-00ff00
-009100
-90ee90
-c3c3c3
-999999
-757575
-c8ffff
-000a01ff01ff01e1000b0208040001ff01ff01e100000208040000000208040002ff02ff
-02e1000002080400000002080400020000ff00ff00de0400020000000208040000000202
-04060200000004ff04ff04de020000000405020204000000020204000209000d02ff02ff
-02d500000202040000000202040002080000020d040002a501010206010102150101021e
-0101022901010206010102430101022a010102260101023201010233010102ae00000202
-040000000202040002080000020d04000277010502000107020101030206010702090101
-02060101021501010219010002030101021c0100020b010102060101022e010202020100
-020d0101022a0101020c0104021401010232010102160100021b010102ae000002020400
-00000202040002080000020d04000277010102070101020301010201010102080101020c
-010102060101021501010218010102210101020b010102060101022e010202020100020d
-01010238010102020101024801010215010102cc00000202040000000202040002080000
-0202040602030400027701010207010102030101020c0101020401030203010102000101
-020301010202010302020101020901010202010302030103020201030201010402010101
-020201030203010102000101020a01040201010302030101020001010203010102020103
-022701000200010102010100020201030203010402020103020201010209010102000101
-020101010203010302030101020201010200010102020101020101030202010402020101
-020101010202010102020101020001010203010102000101020301030203010402020104
-020501040202010102010101020501030201010402000101020101010204010302020101
-020001010201010102020103020201040202010402020103020301010200010102060104
-020201030274000002020400000004030208000002020400030400000203040002770101
-0207010102030102020b0101020301010201010102020102020001010202010102010101
-020101010201010102090101020101010201010102010101020101010200010102010101
-020101010203010102010101020101010202010202000101020a01010202010102010101
-020201020200010102020101020101010201010102260100020001010201010002010101
-020101010201010102010101020101010201010102010101020901020200010202000101
-020101010201010102020101020201020200010102010101020001010200010102010101
-020101010202010102010101020201010202010202000101020201020200010102010101
-020101010201010102050101020801010201010102020101020101010204010102010101
-020101010202010102010101020301010201010102010101020001010201010102010101
-020101010200010102050101020501010201010102020102020001010204010102050101
-020101010273000004030101020b00000203040003020000020404000277010402040101
-0204010302090101020701010202010102010101020201010201010102010101020d0101
-020101010201010102010101020801010201010102030101020101010201010102020101
-02010101020a010102060101020201010201010102020101020101010201010102260100
-0200010202000100020101010201010102010101020101010201010102010101020d0101
-020101010201010102050101020201010202010102010101020101010200010102000101
-020101010201010102020101020101010202010102020101020101010202010102010101
-020101010201010102010102020401020207010102010101020201010201010102040101
-020101010201010102030101020001000204010102010101020101020203010102010101
-020401020204010202040101020101010202010102010101020401020204010102010101
-02760103020b000002030400030200000204040002770101020701010206010202080101
-0204010402020101020101010202010102010105020d0101020101010201010102010101
-02050104020101010203010102010101020101010202010102010101020a010102030104
-020201010201010102020101020101050226010002010101020001000201010102010101
-020101010201010102010105020d01010201010102010101020201040202010102020101
-020101010201010102000101020001010201010102010101020201010201010102020101
-020201010201010102020101020101010201010502020103020301030205010102010101
-020201010201010102040105020101010204010102050105020101010204010102010101
-020501030203010302020101020101010202010102010101020501030202010502760103
-020b00000204040003000000020504000277010102070101020701010208010102030101
-020101010202010102010101020201010201010102110101020101010201010102010101
-0204010102010101020101010203010102010101020101010202010102010101020a0101
-020201010201010102020101020101010202010102010101022a01000202010202010101
-020101010201010102010101020101010211010102010101020101010201010102010101
-020201010202010102010101020101010201010102000101020001010200010202020101
-020101010202010102020101020101010202010102010101020101010208010202040102
-020401010201010102020101020101010204010102050101020301000200010102040101
-020501010204010102010101020701020204010202010101020101010202010102010101
-0207010202010101027a0103020b00000204040003000000020504000277010102070101
-020301010201010102080101020301010201010102020101020101010202010102010101
-020201000201010102090101020101010201010102010101020201000200010102010101
-020101010203010102010101020101010202010102010101020a01010202010102010101
-020201010201010102020101020101010202010002260100020201020201010102010101
-020101010200010202010101020201000201010102090101020101010201010102010101
-020101010202010102020101020101010202010102070101020001010202010102000102
-020201010202010102010101020201010201010102010101020201000205010102050101
-020101010200010102000102020201010200010202010101020001010202010002010101
-020201010201010102000101020001010202010002010101020401010201010102020100
-020401010205010102010101020101010202010102010101020101010204010102010101
-0202010002760103020b0000020500000206040002770105020301010204010302090101
-020401020200010102010104020301010202010302020101020901010202010302030103
-02020102020001010201010202010101020201030203010102010101020b010202010102
-020001010201010402030101020201030227010002030101020201030203010102000101
-020201030202010102090101020101010201010102020102020001010201010102020101
-020101010203010502050101020301010200010102020101020201010201010102020101
-020101010202010302020104020201040202010102010101020001010203010102000101
-020101010201010302030102020001010201010102000101020101030202010102040101
-020201030201010402020104020301030203010102010101020101010200010402030103
-02770103020b0000020d040002fc010602a201010201010102ff022a0103020b0000020d
-040002ff02a7010302ff022b0103020b0000020d040002ff02ff02d70103020c040d02ff
-02ff02d8010302ff02ff02f3010302ff02ff02f30103020200ff00ff00ec040002020103
-0202000004ff04ff04ec0202010302ff02ff02f30103020200ff00ff00ed020201030202
-00ff00ff00ec0800020201030202000106ff06ff06e90801020201030202000106ff06ff
-06e90801020201030202000106ff06ff06e90801020201030202000106ff06ff06e90801
-020201030202000106ff06ff06e908010202010302020001060b07040604070006030702
-061f07040610070206200702060b070006060700062d0700060207000604070006ff06fa
-07000602070006090702061308010202010302020001060b0700060f0700062107000614
-0700061f070006020700060a0700063507000602070006ff06ff0600070006020700060b
-0700061308010202010302020001060b0700060607020605070006030702061a07000604
-070206030702060507000603070206180700060207000601070006000701060207040602
-070206030702060207000600070106030702061807000602070006020702060307020602
-07000602070006ff06eb07000602070006020702060507000602070006000701060c0801
-0202010302020001060b0700060807000605070006020700060207000619070006030700
-060207000601070006020700060407000602070006020700061707000602070006010701
-060107000603070006060700060207000602070006010701060107000601070006020700
-0618070006000700060507000602070006020700060107000602070006ff06eb07000602
-07000601070006020700060407000602070106010700060b08010202010302020001060b
-070306050700060507000602070006020700061907000603070006020700060107000602
-07000604070006020700061b070006020700060107000602070006030700060607000602
-070006020700060107000602070006010700061c07000600070006050700060207000602
-070006010700060007000600070006ff06eb070406010700060207000604070006020700
-06020700060b08010202010302020001060b070006080700060507000602070406190700
-060307000602070006010700060207000604070006030702061807000602070006010700
-060207000603070006060700060207000602070006010700060207000602070206190700
-06000700060507000602070406010700060007000600070006ff06eb0700060207000601
-0704060407000602070006020700060b08010202010302020001060b0700060807000605
-070006020700061d07000603070006020700060107000602070006040700060607000617
-070006020700060107000602070006030700060607000602070006020700060107000602
-07000605070006190700060607000602070006050700060007000600070006ff06eb0700
-0602070006010700060807000602070006020700060b08010202010302020001060b0700
-060807000605070006020700060207000619070006030700060207000601070006020700
-060407000602070006020700061707000602070006010701060107000603070006060700
-060207000602070006010700060207000601070006020700061907000606070006020700
-0602070006010700060007000600070006ff06eb07000602070006010700060207000604
-07000602070106010700060b08010202010302020001060b070006080700060507000603
-0702061a0700060407020603070206050700060307020619070206020700060007010605
-07010604070006030702060207000602070006020702061a070006060700060307020603
-07000600070006ff06ec07000602070006020702060507000602070006000701060c0801
-0202010302020001067d070006ff06ff06590700060f08010202010302020001060a0706
-062a07060631070606000700063d070606ff06fe0706060e0700060f0801020201030202
-0001060a0706062a07060631070606000700063d070606ff06fe0706060e0700060f0801
-020201030202000106ff06ff06e90801020201030202000106ff06ff06e9080102020103
-0202000106ff06ff06e90801020201030202000108ff08ff08eb020201030202000008ff
-08ff08ec02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202010302020603
-0016061600160616004406160016061600160616001606ff06be02020103020206030015
-080006160015080006160015080000150800001508000616001508000616001508000616
-0015080006ff06be02020103020206030001061208010616000106120801061600010612
-080100010612080100010612080106160001061208010616000106120801061600010612
-080106ff06be020201030202060300010612080106160001061208010616000106120801
-000106120801000106120801061600010612080106160001061208010616000106120801
-06ff06be0202010302020603000106120801061600010603070206030702060408010616
-000106120801000106120801000106120801061600010612080106160001061208010616
-00010612080106ff06be0202010302020603000106080702060608010616000106030702
-060307020604080106160001061208010001061208010001061208010616000106050704
-0607080106160001060707010608080106160001060707030606080106ff06be02020103
-020206030001060b0701060408010616000106020704060107040603080106160001060e
-0700060208010001060e070006020801000106020700060e080106160001060307080605
-080106160001060607030607080106160001060507070604080106ff06be020201030202
-06030001060d070006000700060108010616000106020700060107010601070006010701
-0603080106160001060e0700060208010001060e070006020801000106020700060e0801
-061600010602070a06040801061600010606070306070801061600010604070306010703
-0603080106ff06be02020103020206030001060207020608070106010801061600010601
-070d0602080106160001060b07000601070006020801000106020700060a070006020801
-00010602070006010700060b080106160001060207030602070306040801061600010607
-0701060808010616000106040702060307020603080106ff06be02020103020206030001
-060107080602070206010801061600010600070006000703060007020600070406010801
-06160001060b07000601070006020801000106020700060a070006020801000106020700
-06010700060b080106160001060107030604070306030801061600010612080106160001
-06040702060307020603080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106080700060107000601
-070006020801000106020700060407000604070006020801000106020700060107000601
-070006080801061600010601070206030707060108010616000106050704060708010616
-000106050701060207020604080106ff06be020201030202060300010601070906060801
-061600010600070006000703060007020600070406010801061600010608070006010700
-060107000602080100010602070006040700060407000602080100010602070006010700
-060107000608080106160001060107020604070506020801061600010606070306070801
-06160001060907020605080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106050700060107000601
-070006010700060208010001060207000604070006010700060107000602080100010602
-070006010700060107000601070006050801061600010601070206050703060308010616
-0001060707020607080106160001060807020606080106ff06be02020103020206030001
-0601070d0602080106160001060007000600070706000704060108010616000106050700
-060107000601070006010700060208010001060207000604070006010700060107000602
-080100010602070006010700060107000601070006050801061600010601070306050701
-0604080106160001060707020607080106160001060707020607080106ff06be02020103
-020206030001060107030607070006030801061600010600070006000704060107000600
-070406010801061600010602070006010700060107000601070006010700060208010001
-060207000601070006010700060107000601070006020801000106020700060107000601
-07000601070006010700060208010616000106020703060b080106160001060707020607
-080106160001060707020607080106ff06be020201030202060300010601070206070700
-060408010616000106000706060107060601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106020709
-06050801061600010607070206070801061600010612080106ff06be0202010302020603
-000106010701060707000605080106160001060007000600070206050700060007020601
-080106160001060207000601070006010700060107000601070006020801000106020700
-060107000601070006010700060107000602080100010602070006010700060107000601
-070006010700060208010616000106030707060608010616000106060704060608010616
-0001060707020607080106ff06be02020103020206030001060107090606080106160001
-060007000600070206050700060007020601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106050704
-0607080106160001060507060605080106160001060707020607080106ff06be02020103
-020206030001061208010616000106000704060507040601080106160001061208010001
-0612080100010612080106160001061208010616000106120801061600010612080106ff
-06be02020103020206030001061208010616000106120801061600010612080100010612
-080100010612080106160001061208010616000106120801061600010612080106ff06be
-020201030202060300010612080106160001061208010616000106120801000106120801
-00010612080106160001061208010616000106120801061600010612080106ff06be0202
-010302020603000108140616000108140616000108140001081400010814061600010814
-06160001081406160001081406ff06be0202010302020603000008150616000008150616
-00000815000008150000081506160000081506160000081506160000081506ff06be0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed020201030202060301ff01ff01e5
-06030202010302020603010000ff00ff00cf010000120100060302020103020206030100
-00ff00ff00cf010000110800010006030202010302020603010000ff00ff00cf01000001
-060e0801010006030202010302020603010000ff00ff00cf01000001060e080101000603
-0202010302020603010000ff00ff00cf01000001060e0801010006030202010302020603
-0100003401010071010100ff00ff002401000001060e0801010006030202010302020603
-0100003301000075010000ff00ff002301000001060e0801010006030202010302020603
-010000070103000401000005010100190100000301000016010000100100000601020010
-0100000c0100001c010000ff00ff002301000001060e0801010006030202010302020603
-010000070100000201000002010100040100000101000018010000030100002801000008
-010000100100000c0100001c010000ff00ff002301000001060e08010100060302020103
-020206030100000701000002010000010100000001000004010000010100000301010012
-010000030100000101000003010200020100000001010003010200020100000001010009
-010000000101000501000003010200030102000201000001010000030102000201000000
-010100030102000201000000010100030101000001000003010000ff00ff002301000001
-0601010a0601080101000603020201030202060301000007010000020100000301000004
-010000010100000301010012010000030100000001000003010000020100000101010001
-010000040100000201010001010000080101000101000004010000020100000201000001
-010000020100000101000000010000030100000201000001010100010100000101000002
-0100000101010001010000010100000101010003010000ff00ff00230100000106020108
-060208010100060302020103020206030100000701030004010000040100000101000016
-010100040101000801000001010000080100000201000002010000080100000201000004
-010000060100000101000005010100040100000201000001010000020100000101000002
-01000001010000050100000201000004010100ff00ff0021010000010603010606030801
-010006030202010302020603010000070100000101000004010000040100000101000018
-010000030101000501030001010000080100000201000002010000080100000201000004
-010000030103000101000005010100040104000101000002010000010104000101000005
-0100000201000003010000ff00ff00230100000106040104060408010100060302020103
-020206030100000701000002010000030100000401000001010000180100000301000000
-010000030100000201000001010000080100000201000002010000080100000201000004
-010000020100000201000001010000050100000001000003010000050100000201000001
-01000005010000050100000201000003010000ff00ff0023010000010605010206050801
-010006030202010302020603010000070100000201000003010000040100000101000003
-010100120100000301000001010000020100000201000001010000080100000201000002
-010000030101000201010001010000040100000201000002010000010100000201000001
-010000010100000201000002010000010101000101000001010000020100000101000005
-0100000101010003010000ff00ff00230100000106060100060608010100060302020103
-020206030100000701000002010000010104000301010004010100120100000301000002
-010000020103000101000008010000020100000201000003010100020100000001010005
-010000030103000201020002010000020100000201020002010000000101000301020002
-010000060101000001000003010000ff00ff002301000001060e08010100060302020103
-0202060301000033010000290100004501000003010000ff00ff002301000001060e0801
-0100060302020103020206030100003401010025010100420100000201000001010100ff
-00ff002401000001060e0801010006030202010302020603010000a2010200ff00ff0029
-01000001060e0801010006030202010302020603010000ff00ff00cf01000001060e0801
-010006030202010302020603010000ff00ff00cf01000001060e08010100060302020103
-02020603010000ff00ff00cf01000001060e0801010006030202010302020603010000ff
-00ff00cf010000010810010006030202010302020603010000ff00ff00cf010000000811
-01000603020201030202060301ff01ff01e50603020201030202060301ff01ff01d10617
-0202010302020603010006ff06ff06bc0812010006170202010302020603010006ff06ff
-06bc08110000010006170202010302020603010006010dff0dff0db8060108010c060800
-0c060001010006170202010302020603010006010dff0dff0db70000060108010c050000
-08000c060001010006170202010302020603010006010d0100ff00ff00b6060108010c05
-000008010c050001010006170202010302020603010006010d0100ff00ff00b606010801
-0c04000108010c050001010006170202010302020603010006010d0100ff00ff00b60601
-08010c040001060008010c040001010006170202010302020603010006010d0100ff00ff
-00b6060108010c030001060108010c040001011406030202010302020603010006010d01
-00ff00ff00b6060108010c030001060208010c0300010100061201000603020201030202
-0603010006010d0100ff00ff00b6060108010c020001060308010c030001010006120100
-06030202010302020603010006010d0100ff00ff00b6060108010c020001060408010c02
-000101000612010006030202010302020603010006010d0100ff00ff00b6060108010c01
-0001060508010c02000101000612010006030202010302020603010006010d0100ff00ff
-00b6060108010c010001060608010c010001010006120100060302020103020206030100
-06010d0100ff00ff00b6060108010c000001060708010c01000101000612010006030202
-010302020603010006010d0100ff00ff00b6060108010c000001060808010c0000010100
-0612010006030202010302020603010006010d0100ff00ff00b6060108010001080b0c00
-000101000612010006030202010302020603010006010d0100ff00ff00b6060108010000
-080d000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0c0e000101000612010006030202010302020603010006010d01000301010071010100ff
-00ff003c06010801001001000612010006030202010302020603010006010d0100000c01
-01000c7501000c010e0000ff00ff003806010801000d0800000101000612010006030202
-010302020603010006010d0100000c0101000c0301000c1601000c1001000c0601020c10
-01000c0c01000c1c01000c010e0000ff00ff0038060108010001060a0801000101000612
-010006030202010302020603010006010d0100000c0101000c0301000c2801000c080100
-0c1001000c0c01000c1c01000c010e0000ff00ff0038060108010001060a080100010100
-0612010006030202010302020603010006010d0100000c0101000c0301000c0101000c03
-01020c0201000c0001010c0301020c0201000c0001010c0901000c0001010c0501000c03
-01020c0301020c0201000c0101000c0301020c0201000c0001010c0301020c0201000c00
-01010c0301010c0001000c0301000c010e0000ff00ff0038060108010001060a08010001
-01000612010006030202010302020603010006010d0100000c0101000c0301000c000100
-0c0301000c0201000c0101010c0101000c0401000c0201010c0101000c0801010c010100
-0c0401000c0201000c0201000c0101000c0201000c0101000c0001000c0301000c020100
-0c0101010c0101000c0101000c0201000c0101010c0101000c0101000c0101010c030100
-0c010e0000ff00ff0038060108010001060a080100010100061201000603020201030202
-0603010006010d01000001010c0401010c0801000c0101000c0801000c0201000c020100
-0c0801000c0201000c0401000c0601000c0101000c0501010c0401000c0201000c010100
-0c0201000c0101000c0201000c0101000c0501000c0201000c0401010e0000ff00ff0038
-060108010001060a0801000101000612010006030202010302020603010006010d010000
-0c0101000c0301010c0501030c0101000c0801000c0201000c0201000c0801000c020100
-0c0401000c0301030c0101000c0501010c0401040c0101000c0201000c0101040c010100
-0c0501000c0201000c0301000c010e0000ff00ff0038060108010001060a080100010100
-0612010006030202010302020603010006010d0100000c0101000c0301000c0001000c03
-01000c0201000c0101000c0801000c0201000c0201000c0801000c0201000c0401000c02
-01000c0201000c0101000c0501000c0001000c0301000c0501000c0201000c0101000c05
-01000c0501000c0201000c0301000c010e0000ff00ff0038060108010001060a08010001
-01000612010006030202010302020603010006010d0100000c0101000c0301000c010100
-0c0201000c0201000c0101000c0801000c0201000c0201000c0301010c0201010c010100
-0c0401000c0201000c0201000c0101000c0201000c0101000c0101000c0201000c020100
-0c0101010c0101000c0101000c0201000c0101000c0501000c0101010c0301000c010e00
-00ff00ff0038060108010001060a08010001010006120100060302020103020206030100
-06010d0100000c0101000c0301000c0201000c0201030c0101000c0801000c0201000c02
-01000c0301010c0201000c0001010c0501000c0301030c0201020c0201000c0201000c02
-01020c0201000c0001010c0301020c0201000c0601010c0001000c0301000c010e0000ff
-00ff0038060108010001060a080100010100061201000603020201030202060301000601
-0d0100000c0101000c2901000c4501000c0301000c010e0000ff00ff0038060108010001
-060a0801000101000612010006030202010302020603010006010d0100000c0201010c25
-01010c4201000c0201000c0101010c020e0000ff00ff0038060108010001060a08010001
-01000612010006030202010302020603010006010d0100000e7001020e0800ff00ff0038
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001060a08010001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010001060a080100010100061201000603
-0202010302020603010006010d0100ff00ff00b6060108010001060a0801000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010001060a08010001
-01000612010006030202010302020603010006010d0100ff00ff00b6060108010001060a
-0801000101000612010006030202010302020603010006010d0100ff00ff00b606010801
-0001060a0801000101000612010006030202010302020603010006010d0100ff00ff00b6
-060108010001060a0801000101000612010006030202010302020603010006010d0100ff
-00ff00b6060108010001060a080100010100061201000603020201030202060301000601
-0d0100ff00ff00b6060108010001060a0801000101000612010006030202010302020603
-010006010d0100ff00ff00b6060108010001080c00010100061201000603020201030202
-0603010006010d0100ff00ff00b6060108010000080d0001010006120100060302020103
-02020603010006010d0100ff00ff00b6060108010c0e0001010006120100060302020103
-02020603010006010d0100ff00ff00b60601080100100100061201000603020201030202
-0603010006010d0100ff00ff00b6060108010c00000c0800000101000612010006030202
-010302020603010006010d0100ff00ff00b6060108010c000001060808010c0000010100
-0612010006030202010302020603010006010d0100ff00ff00b6060108010c0100010607
-08010c00000101000612010006030202010302020603010006010d0100ff00ff00b60601
-08010c010001060608010c01000101000612010006030202010302020603010006010d01
-00ff00ff00b6060108010c020001060508010c0100010100061201000603020201030202
-0603010006010d0100ff00ff00b6060108010c020001060408010c020001010006120100
-06030202010302020603010006010d0100ff00ff00b6060108010c030001060308010c02
-000101000612010006030202010302020603010006010d0100ff00ff00b6060108010c03
-0001060208010c03000101000612010006030202010302020603010006010d0100ff00ff
-00b6060108010c040001060108010c030001010006120100060302020103020206030100
-06010d0100ff00ff00b6060108010c040001060008010c04000101000612010006030202
-010302020603010006010d0100ff00ff00b6060108010c05000008020c04000101000612
-010006030202010302020603010006010d0100ff00ff00b6060108010c05000008010c05
-000101000612010006030202010302020603010006010d0100ff00ff00b6060108010c06
-08010c05000101000612010006030202010302020603010006010d0000ff00ff00b70601
-08010c0608000c06000101000612010006030202010302020603010006ff06ff06bc0801
-001001000612010006030202010302020603010006ff06ff06bc08000011010006120100
-0603020201030202060301ff01ff01d1061201000603020201030202060301000b010932
-0a0100630100006301000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000b010916010209180a010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000b01091501000902010009170a010063010000170100002001020026
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000b01091501000902010009170a01006301000017010000220100
-002601000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000b01091501000902010009170a01000e0100000001010003
-0102000201000000010100420100000f0102000201040001010000020100000101000000
-010100030102000201000000010100050100000301020002010000000101001801000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000b010916010209180a01000e010100010100000101000002010000010101
-0001010000410100000e0100000201000003010000030100000201000001010100010100
-000101000002010000010101000101000004010000020100000201000001010100010100
-001701000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000b01091501000902010009170a01000e0100000201000001
-0100000201000001010000450100000e0100000701000003010000020100000101000005
-010000020100000101000002010000040100000601000001010000020100001701000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000b01091501000902010009170a01000e0100000201000001010400010100
-00450100000f010200040100000301000002010000010100000501040001010000020100
-000401000003010300010100000201000017010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000b01091501000902
-010009170a01000e01000002010000010100000501000045010000120100000301000003
-010000020100000101000005010000050100000201000004010000020100000201000001
-010000020100001701000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000b010916010209180a01000e010100010100
-00010100000201000001010000450100000e010000020100000301000003010000010101
-000101000005010000020100000101010001010000040100000201000002010000010100
-00020100001701000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000b0109320a01000e010000000101000301020002
-010000450100000f01020005010100020101000001000001010000060102000201000000
-010100050100000301030001010000020100001701000063010000630100006301000063
-010000020100061308010c0e0001062301000603020201030202060301000b0109320a01
-000e01000053010000310100003001000063010000630100006301000063010000020100
-061308010c0e0001062301000603020201030202060301000b0109320a01000e01000053
-010000310100003001000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000b0109320a01000e01000053010000310100
-003001000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000b0109320a01006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000b01
-09320a010063010000630100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000b010a34006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000b000a3501ff01ff0161061308010c0e00010623010006030202010302020603
-0100009a0100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100003508000063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061601020618080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106150100060201000617080100260100003b01000019010000170102002d01000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000001061501000602010006170801006301000019010000190100002d0100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000001061501000602010006170801000e010100000100000301020002
-010000000101000301020003010200340100000f01020003010100000100000201020002
-010000000101000201000000010100050100000301020002010000000101001f01000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000001061501000602010006170801000e0100000001000000010000010100
-00020100000101010001010000040100000201000002010000330100000e010000020100
-000101000001010100010100000201000001010100010100000101010001010000040100
-00020100000201000001010100010100001e010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061601030617
-0801000e010000000100000001000005010000010100000801000006010000330100000e
-010000020100000101000002010000010100000201000001010000020100000101000002
-010000040100000601000001010000020100001e01000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106190100
-06170801000e010000000100000001000002010300010100000801000003010300330100
-000e01000002010000010100000201000001010400010100000201000001010000020100
-00040100000301030001010000020100001e010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061801000618
-0801000e0100000001000000010000010100000201000001010000080100000201000002
-010000330100000e01000002010000010100000201000001010000050100000201000001
-0100000201000004010000020100000201000001010000020100001e0100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010615010206190801000e01000000010000000100000101000002010000010100
-00080100000201000002010000330100000e010000020100000101000001010100010100
-000201000001010000020100000101010001010000040100000201000002010000010100
-00020100001e01000063010000630100006301000063010000020100061308010c0e0001
-06230100060302020103020206030100000106320801000e010000000100000001000002
-010300010100000801000003010300330100000f01020003010100000100000201020002
-010000020100000101000000010100050100000301030001010000020100001e01000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-02020603010000010632080100630100002a010000370100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100002a01000037010000630100006301000063010000630100000201000613
-08010c0e00010623010006030202010302020603010000010632080100630100002a0100
-003701000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010834006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000000083501ff01ff0161061308010c0e00010623010006030202010302020603
-010005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000f6301000f6301000f6301000f6301000f6301000f6301000f02010006130801
-0c0e00010623010006030202010302020603010000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050001000f6301000f6301000f6301000f63
-01000f6301000f6301000f020100061308010c0e00010623010006030202010302020603
-0100050000000532010005000f6301000f6301000f6301000f6301000f6301000f630100
-0f020100061308010c0e0001062301000603020201030202060301000000053401000f63
-01000f6301000f6301000f6301000f6301000f6301000f020100061308010c0e00010623
-01000603020201030202060301000500000005130100050401020515010005000f630100
-0f6301000f6301000f6301000f6301000f6301000f020100061308010c0e000106230100
-0603020201030202060301000000051201020503010005020100051501000f0e01000f16
-01000f3b01000f0e01000f0601020f1001000f0c01000f2901000f6301000f6301000f63
-01000f6301000f020100061308010c0e0001062301000603020201030202060301000500
-00000513010005030100050201000514010005000f0e01000f5301000f0e01000f080100
-0f1001000f0c01000f2901000f6301000f6301000f6301000f6301000f02010006130801
-0c0e00010623010006030202010302020603010000000514010005030100050201000515
-01000f0e01000f0101000f0301020f0201000f0001010f0301020f0201000f0001010f34
-01000f0e01000f0001010f0501000f0301020f0301020f0201000f0101000f0301020f02
-01000f0001010f0301020f0201000f0001010f0301010f0001000f1001000f6301000f63
-01000f6301000f6301000f020100061308010c0e00010623010006030202010302020603
-0100050000000513010005030100050201000514010005000f0e01000f0001000f030100
-0f0201000f0101010f0101000f0401000f0201010f0101000f3301000f0e01010f010100
-0f0401000f0201000f0201000f0101000f0201000f0101000f0001000f0301000f020100
-0f0101010f0101000f0101000f0201000f0101010f0101000f0101000f0101010f100100
-0f6301000f6301000f6301000f6301000f020100061308010c0e00010623010006030202
-01030202060301000000051401000503010005020100051501000f0e01010f0801000f01
-01000f0801000f0201000f0201000f3301000f0e01000f0201000f0401000f0601000f01
-01000f0501010f0401000f0201000f0101000f0201000f0101000f0201000f0101000f05
-01000f0201000f1001000f6301000f6301000f6301000f6301000f020100061308010c0e
-000106230100060302020103020206030100050000000513010005030100050201000514
-010005000f0e01010f0501030f0101000f0801000f0201000f0201000f3301000f0e0100
-0f0201000f0401000f0301030f0101000f0501010f0401040f0101000f0201000f010104
-0f0101000f0501000f0201000f1001000f6301000f6301000f6301000f6301000f020100
-061308010c0e000106230100060302020103020206030100000005140100050301000502
-0100051501000f0e01000f0001000f0301000f0201000f0101000f0801000f0201000f02
-01000f3301000f0e01000f0201000f0401000f0201000f0201000f0101000f0501000f00
-01000f0301000f0501000f0201000f0101000f0501000f0501000f0201000f1001000f63
-01000f6301000f6301000f6301000f020100061308010c0e000106230100060302020103
-0202060301000500000005110104050201020515010005000f0e01000f0101000f020100
-0f0201000f0101000f0801000f0201000f0201000f3301000f0e01010f0101000f040100
-0f0201000f0201000f0101000f0201000f0101000f0101000f0201000f0201000f010101
-0f0101000f0101000f0201000f0101000f0501000f0101010f1001000f6301000f630100
-0f6301000f6301000f020100061308010c0e000106230100060302020103020206030100
-0000053401000f0e01000f0201000f0201030f0101000f0801000f0201000f0201000f33
-01000f0e01000f0001010f0501000f0301030f0201020f0201000f0201000f0201020f02
-01000f0001010f0301020f0201000f0601010f0001000f1001000f6301000f6301000f63
-01000f6301000f020100061308010c0e0001062301000603020201030202060301000500
-00000532010005000f6301000f5101000f1001000f6301000f6301000f6301000f630100
-0f020100061308010c0e0001062301000603020201030202060301000000053401000f63
-01000f4d01000f0201000f1001000f6301000f6301000f6301000f6301000f0201000613
-08010c0e000106230100060302020103020206030100050000000532010005000f630100
-0f4e01020f1101000f6301000f6301000f6301000f6301000f020100061308010c0e0001
-062301000603020201030202060301000000053401000f6301000f6301000f6301000f63
-01000f6301000f6301000f020100061308010c0e00010623010006030202010302020603
-0100050000000532010005000f6301000f6301000f6301000f6301000f6301000f630100
-0f020100061308010c0e0001062301000603020201030202060301000000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100050001000f6301000f63
-01000f6301000f6301000f6301000f6301000f020100061308010c0e0001062301000603
-020201030202060301000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050001ff01ff0161061308010c0e000106230100060302020103
-020206030100050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500010000630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000000534
-010000630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100050000000513010005050100051601000500
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000000051201020503010205170100001e01000043
-0100000e01000006010200100100000c0100002901000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100050000000513
-010005050100051601000500001e010000430100000e01000008010000100100000c0100
-002901000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000000051401000505010005170100000e0101000001000003
-01020002010400020102003b0100000e0100000001010005010000030102000301020002
-010000010100000301020002010000000101000301020002010000000101000301010000
-0100001001000063010000630100006301000063010000020100061308010c0e00010623
-0100060302020103020206030100050000000513010005050100051601000500000e0100
-00000100000001000001010000020100000301000003010000020100003a0100000e0101
-000101000004010000020100000201000001010000020100000101000000010000030100
-000201000001010100010100000101000002010000010101000101000001010000010101
-001001000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000000051401000505010005170100000e0100000001000000
-0100000501000003010000030100003e0100000e01000002010000040100000601000001
-010000050101000401000002010000010100000201000001010000020100000101000005
-010000020100001001000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100050000000513010005050100051601000500
-000e01000000010000000100000201030003010000040102003b0100000e010000020100
-000401000003010300010100000501010004010400010100000201000001010400010100
-000501000002010000100100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000000051401000505010005170100000e
-0100000001000000010000010100000201000003010000070100003a0100000e01000002
-010000040100000201000002010000010100000501000000010000030100000501000002
-010000010100000501000005010000020100001001000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100050000000511
-010405010104051401000500000e01000000010000000100000101000002010000030100
-0003010000020100003a0100000e01010001010000040100000201000002010000010100
-000201000001010000010100000201000002010000010101000101000001010000020100
-000101000005010000010101001001000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000005340100000e01000000
-010000000100000201030004010100020102003b0100000e010000000101000501000003
-010300020102000201000002010000020102000201000000010100030102000201000006
-010100000100001001000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100050000000532010005000063010000510100
-001001000063010000630100006301000063010000020100061308010c0e000106230100
-06030202010302020603010000000534010000630100004d010000020100001001000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000500000005320100050000630100004e0102001101000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000005340100006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000500000005320100050000630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010000630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001ff01ff
-0161061308010c0e000106230100060302020103020206030100009a0100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100003508000063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000604010206150801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061101020603
-010006020100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006030100
-060201000614080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060301000602
-010006140801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000606010006150801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000605010006160801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061301000604010006170801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000603010006020100061408010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010611010406010104061408010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010834006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000000083501ff01ff0161061308010c0e00010623010006030202010302020603
-0100009a0100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100003508000063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061301000604010206150801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061101020603010006020100061408010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006070100061408010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010613
-010006070100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006050101
-061508010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010613010006070100061408010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006070100061408010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010613010006030100060201000614080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106110104060201020615080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106320801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000108340063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000000083501ff01ff0161061308010c0e000106230100060302020103
-020206030100009a01000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000035080000630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006060100061508010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010611010206050101061508010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006040100060001000615080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106130100060401000600010006150801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000603010006010100061508010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010613
-010006020100060201000615080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106130100
-060201050614080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060601000615
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106110104060301020614080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000108340063010000630100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000000083501ff01ff0161061308010c0e
-000106230100060302020103020206030100009a01000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000035
-080000630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006030104
-061408010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010611010206030100061808010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006030100061808010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010613010006030100061808010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006030103061508010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010613
-010006070100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006070100
-061408010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010613010006020100060301000614
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106110104060101030615080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000108340063010000630100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000000083501ff01ff0161061308010c0e
-000106230100060302020103020206030100009a01000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000035
-080000630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006050102
-061408010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010611010206040100061708010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006030100061808010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010613010006030100061808010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006030103061508010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010613
-010006030100060201000614080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106130100
-060301000602010006140801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000603
-010006020100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010611010406020102
-061508010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106320801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010834006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000000083501ff01ff
-0161061308010c0e000106230100060302020103020206030100009a0100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100003508000063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000603010406140801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061101020603
-010006020100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006060100
-061508010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010613010006060100061508010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006060100061508010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010613010006060100061508010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006050100061608010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010613
-010006050100061608010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010611010406030100
-061608010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106320801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010834006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000000083501ff01ff
-0161061308010c0e000106230100060302020103020206030100009a0100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100003508000063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000604010206150801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061101020603
-010006020100061408010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006030100
-060201000614080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060301000602
-010006140801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000604010206150801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000603010006020100061408010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006030100060201000614080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106130100060301000602010006140801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061101040602010206150801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001083400630100
-006301000063010000630100006301000063010000020100061308010010062301000603
-020201030202060301ff01ff019906130800001106230100060302020103020206030100
-06ff06ff06e3010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-06030202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff
-06e301000603020201030202060301000649010006ff06ff069801000603020201030202
-060301000648010106ff06ff069801000603020201030202060301000647010006000100
-06ff06ff069801000603020201030202060301000649010006ff06ff0698010006030202
-01030202060301000649010006ff06ff0698010006030202010302020603010006490100
-06ff06ff069801000603020201030202060301000649010006ff06ff0698010006030202
-01030202060301000649010006ff06ff0698010006030202010302020603010006470104
-06ff06ff0696010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-060302020103020206030100063708ff08ff0860064a0100060302020103020206030100
-063708ff08ff085f0000064a010006030202010302020603010006370801001d0cff0cff
-0c3e0001064a010006030202010302020603010006370801001c08000cff0cff0c3e0001
-064a0100060302020103020206030100063708010001060b08000000060b08010cff0cff
-0c3e0001064a0100060302020103020206030100063708010001060b08000000060b0801
-0cff0cff0c3e0001064a0100060302020103020206030100063708010001060b08000000
-060b08010cff0cff0c3e0001064a0100060302020103020206030100063708010001060b
-08000000060b08010cff0cff0c3e0001064a010006030202010302020603010006370801
-0001060b08000000060b08010cff0cff0c3e0001064a0100060302020103020206030100
-063708010001060b08000000060b08010cff0cff0c3e0001064a01000603020201030202
-06030100063708010001060b08000000060b08010cff0cff0c3e0001064a010006030202
-0103020206030100063708010001060b08000000060b08010cff0cff0c3e0001064a0100
-060302020103020206030100063708010001060b08000000060b08010cff0cff0c3e0001
-064a0100060302020103020206030100063708010001060b08000000060b08010cff0cff
-0c3e0001064a0100060302020103020206030100063708010001060b08000000060b0801
-0cff0cff0c3e0001064a0100060302020103020206030100063708010001080c0000080d
-0cff0cff0c3e0001064a0100060302020103020206030100063708010000081c0cff0cff
-0c3e0001064a01000603020201030202060301000637080100ff00ff005e064a01000603
-020201030202060301000637080000ff00ff005f064a0100060302020103020206030100
-06ff06ff06e3010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-06030202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff
-06e3010006030202010302020603010006ff06ff06e30100060302020103020206030100
-06ff06ff06e3010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-06030202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff
-06e3010006030202010302020603010006ff06ff06e30100060302020103020206030100
-06ff06ff06e3010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-06030202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff
-06e3010006030202010302020603010006ff06ff06e30100060302020103020206030100
-06ff06ff06e3010006030202010302020603010006ff06ff06e301000603020201030202
-0603010006ff06ff06e3010006030202010302020603010006ff06ff06e3010006030202
-010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e30100
-06030202010100040603010006ff06ff06e301000603000502020400060301ff01ff01e5
-060300000202040000000202040006ff06ff06ed00000202040000000202040006ff06ff
-06ed00000202040000000202040006ff06ff06ed00000202040000000202040006ff06ff
-06ed000002020400000002020400000502ff02ff02e100060202040000000208040002ff
-02ff02e100000208040000000208040002ff02ff02e100000208040000000208040001ff
-01ff01e10000020804000000040901ff01ff01e100000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 64 377 377
-%%EOF
diff --git a/lib/tv/doc/src/tv_search_result.gif b/lib/tv/doc/src/tv_search_result.gif
deleted file mode 100644
index 3e615b4875..0000000000
--- a/lib/tv/doc/src/tv_search_result.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_search_result.ps b/lib/tv/doc/src/tv_search_result.ps
deleted file mode 100644
index 14d0331a8f..0000000000
--- a/lib/tv/doc/src/tv_search_result.ps
+++ /dev/null
@@ -1,2739 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_search_result.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:10:46 2001)
-%%BoundingBox: 0 34 400 249
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 34 400 249
-userdict begin
-%%BeginData:
-DisplayImage
-0 34
-400.000000 215.000000
-12
-1051 565
-1
-0
-0
-32
-ffffff
-000000
-d8d8d8
-4ac1df
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-00ff00
-ff0000
-aa2455
-990000
-7f7f7f
-999999
-ff7f7f
-009900
-7fff7f
-ffd700
-998100
-ffff7f
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-03ba01010000010100000100000001000000010000000100000001000000010000000100
-000101000002010103ff03ff03ff03ff0300010200000100000001000000010000000100
-000001000000010000000100000101000002010103f5000a01ff01ff0137000a03be0101
-000101000000010000000100000001000000010000000100000101000002010103f60000
-0208050001ff01ff013700000208050003bf010100010100000001000000010000000100
-00000100000101000002010103f700000208050002ff02ff023700000208050003c00101
-00010100000001000000010000000100000101000002010103f800000208050002ff02ff
-023700000208050003c10101000101000000010000000100000101000002010103f90000
-0202050602ff02ff0237000005050202050003c201010001010000000100000101000002
-010103fa0000020205000209000d02ff02ff022b00000202050003c30101000101000001
-01000002010103fb00000202050002080000020d05000234010302110103023201020258
-0102020c010102010101021e010102290101020601010208010102310101022a01010230
-0101024100000202050003c40101000201000002010103fc00000202050002080000020d
-05000234010102020107020001010203010102010101020e01050200010702010103020d
-0101020401010204010302030103020e010302060103020301030203010302060103020b
-0101020a0101020201010219010002030101021c0100020b01010206010102090101021b
-010202020100020d0101022a0101020c0104021e0101024100000202050003c501010000
-01000002010103fd00000202050002080000020d05000234010102050101020301010203
-010102010101020e0101020701010203010102010101020c010102020103020301010201
-010102010101020101010208010102010101020101010204010102010101020101010201
-0101020101010201010102040101020101010201010102060101020a0101020201010218
-010102210101020b01010206010102090101021b010202020100020d0101023801010202
-0101021d0101024100000202050003c601010002010103fe000002020500020800000202
-0506020305000234010102050101020301010203010102010101020e0101020701010203
-010102050101020901010203010102070101020101010201010102060102020201010201
-010102080101020101010201010102010101020101010204010102010101020201020203
-0101020a0101020301010202010302030103020201030201010402010101020201030203
-010102000101020a0104020101030203010102000101020301010202010302030101021a
-010002000101020101000202010302030104020201030202010102090101020001010201
-010102030103020301010202010102000101020201010201010302020101020001010201
-010102030103020201010200010102010101020201030202010102020101023000000202
-050003c701000001010103ff000005030208000002020500040400000203050002340101
-02050101020401010202010002020101020e0101020701010203010202040101020a0100
-020301010207010102010101020101010205010102040101020101010208010102010101
-02010101020101010201010102040101020101010204010102020100020b010102030101
-020101010201010102010101020101010200010102010101020101010203010102010101
-020101010202010202000101020a01010202010102010101020201020200010102020101
-020101010201010102020101021a01000200010102010100020101010201010102010101
-020101010201010102010101020101010209010202000102020001010201010102010101
-020201010202010202000101020101010200010102000101020201020200010202000101
-020101010201010102010101020001010201010102010101020101010201010102020101
-02300000050303c7010303ff03000101020b000002030500040200000204050002340101
-02050101020401010201010102020101020e01040204010102040103020d010102040101
-020501020202010102010101020401010205010102010101020701010202010102010101
-020201040204010102010101020501010202010102090101020301010201010102010101
-0201010102080101020101010203010102010101020101010202010102010101020a0101
-02060101020201010201010102020101020101010201010102020101021a010002000102
-02000100020101010201010102010101020101010201010102010101020d010102010101
-020101010205010102020101020201010201010102010101020001010200010102020101
-020101010201010102050101020101020203010102010101020101010201010102020100
-0234010103c8010103ff03010101020b0000020305000402000002040500023401010205
-0101020501010200010002030101020e01010207010102060102020e0100020301010207
-010102010101020101010205010102040101020101010206010102030101020101010205
-010102040101020101010204010102020100020b01010203010102010101020101010201
-010102050104020101010203010102010101020101010202010102010101020a01010203
-01040202010102010101020201010201010502020101021a010002010101020001000201
-010102010101020101010201010102010105020d01010201010102010101020201040202
-010102020101020101010201010102000101020001010202010102010101020101010202
-010402010101020401010201010502020101020001010234010103ff03cc0101020b0000
-02040500040000000205050002340101020501010205010302030101020e010102070101
-02070101020d010102030101020701010201010102010101020601020202010102010101
-0205010102040101020101010205010102040101020101010202010202030101020a0101
-020301010201010102010101020101010204010102010101020101010203010102010101
-020101010202010102010101020a01010202010102010101020201010201010102020101
-0201010102060101021a0100020201020201010102010101020101010201010102010101
-021101010201010102010101020101010201010102020101020201010201010102010101
-020101010200010102010101020101010201010102010101020101010201010102040101
-0201010102060101020001000235010103ff03cc0101020b000002040500040000000205
-050002340101020501010206010102040101020e01010207010102030101020101010201
-010102080101020401010203010102010101020101010201010102010101020401010201
-010102010101020101010200010502010101020101010201010102010101020101010200
-0101020101010201010102060101020a0101020201010201010102010101020101010202
-01000200010102010101020101010203010102010101020101010202010102010101020a
-01010202010102010101020201010201010102020101020101010202010002010101021b
-010002020102020101010201010102010101020001020201010102020100020101010209
-010102010101020101010201010102010101020201010202010102010101020201010207
-010102010101020101010201010102010101020101010204010102010101020201000203
-01020235010103ff03cc0101020b00000205000002060500023401010205010102060101
-02040101020e010502030101020401030202010102080101020401010204010302030103
-0202010102090103020201010200010502020103020301030202010102010103020b0101
-020a01010202010102020103020301030202010202000101020101020201010102020103
-0203010102010101020b0102020101020200010102010104020301010202010302020101
-021b01000203010102020103020301010200010102020103020201010209010102010101
-020101010202010202000101020101010202010102010101020301050202010102010101
-020101010202010202000101020001010204010102020103020401010236010103ff03cc
-0101020b0000020d050002340103021101030232010202190100023d0102020c01010237
-010602230101029e01010237010103ff03cc0101020b0000020d0500029d010002ff0254
-01010237010103ae0100030801000305010103ff030a0101020b0000020d050002ff02ff
-022d010103ae0100030801000306010003ff030a0101020c050d02ff02ff022e010103ae
-0100030801000306010003ff030a010102ff02ff0249010103ac01040301010303000103
-0303010003030102030201030307010203010100030001010307010003e2010102ff02ff
-0249010103ae010003020100030201000300010003020100030201000302010003020100
-03000100030a01000302010003000101030101000306010003e2010102ff02ff02490101
-03ae01000302010003020100030001000302010003020100030201040301010203070100
-0302010003000100030201000306010003e2010102ff02ff0249010103ae010003020100
-030101010300010003020100030201000302010003080100030601000302010003000100
-030201000306010003e2010102ff02ff0249010103af0101030101010300010003000103
-0302010203020102030101030308010203010100030201000306010003e2010102020600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-0000060000000202010103ff03cc01010202000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000600000006000000060000000600000006000202010103ff03cc0101
-02020600000006ff06ff064001000202010103ff03cc01010202000006ff06ff06400100
-06000202010103ff03cc010102020600000006ff06ff064001000202010103ff03cc0101
-0202000006ff06ff0640010006000202010103ff03cc010102020600000006ff06ff0640
-01000202010103ff03cc010102020000060c07040604070006030702061f070406050700
-060407000604070006190700060207000604070006270702060b07000606070006ff065e
-070006020700060907020613010006000202010103ff03cc0101020206000000060b0700
-060f0700061f070006090700060a07000619070006020700062c070006020700060a0700
-06ff0666070006020700060b0700061401000202010103ff03cc010102020000060c0700
-060607020605070006030702061807000606070106000700060207020602070406170700
-060207000602070206030702060207000602070006170700060207000601070006000701
-06020704060207020603070206020700060007010603070206ff06490700060207000602
-0702060507000602070006000701060c010006000202010103ff03cc0101020206000000
-060b07000608070006050700060207000602070006170700060507000601070106040700
-06040700061a070006000700060507000602070006020700060107000602070006170700
-060207000601070106010700060307000606070006020700060207000601070106010700
-060107000602070006ff0648070006020700060107000602070006040700060207010601
-0700060c01000202010103ff03cc010102020000060c0703060507000605070006020700
-060207000617070306020700060207000604070006040700061a07000600070006050700
-060207000602070006010700060007000600070006170700060207000601070006020700
-0603070006060700060207000602070006010700060207000601070006ff064c07040601
-070006020700060407000602070006020700060b010006000202010103ff03cc01010202
-06000000060b070006080700060507000602070406170700060507000602070006040700
-06040700061a070006000700060507000602070406010700060007000600070006170700
-060207000601070006020700060307000606070006020700060207000601070006020700
-0602070206ff064907000602070006010704060407000602070006020700060c01000202
-010103ff03cc010102020000060c0700060807000605070006020700061b070006050700
-060207000604070006040700061b07000606070006020700060507000600070006000700
-061707000602070006010700060207000603070006060700060207000602070006010700
-060207000605070006ff064807000602070006010700060807000602070006020700060b
-010006000202010103ff03cc0101020206000000060b0700060807000605070006020700
-060207000617070006050700060107010604070006040700061b07000606070006020700
-060207000601070006000700060007000617070006020700060107010601070006030700
-0606070006020700060207000601070006020700060107000602070006ff064807000602
-07000601070006020700060407000602070106010700060c01000202010103ff03cc0101
-02020000060c070006080700060507000603070206180704060207010600070006040700
-060507010619070006060700060307020603070006000700061907020602070006000701
-06050701060407000603070206020700060207000602070206ff06490700060207000602
-0702060507000602070006000701060c010006000202010103ff03cc0101020206000000
-06a8070006ff06840700061001000202010103ff03cc010102020000060b0706062a0706
-062a0706062a07060600070006ff066e0706060e0700060f010006000202010103ff03cc
-0101020206000000060a0706062a0706062a0706062a07060600070006ff066e0706060e
-0700061001000202010103ff03cc01010202000006ff06ff0640010006000202010103ff
-03cc010102020600000006ff06ff064001000202010103ff03cc01010202000006ff06ff
-0640010006000202010103ff03cc01010202060000000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-01000600010006000100060001000600010006000100060001000202010103ff03cc0101
-020200000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000202010103ff03cc0101020206ff06ff06430202010103ff03cc
-0101020206ff06ff06430202010103ff03cc0101020206ff06ff06430202010103ff03cc
-0101020206ff06ff06430202010103ff03cc0101020206ff06ff06430202010103ff03cc
-0101020206ff06ff06430202010103ff03cc0101020206ff06ff06430202010103ff03cc
-0101020206ff06ff06430202010103ff03cc010102020636000006000000060000000600
-00000600000006000000060000000600000006000000060000000600000006000000061a
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000601000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000601000006000000060000000600
-00000600000006000000060000000600000006000000060000000600000006000000061a
-000006000000060000000600000006000000060000000600000006000000060000000600
-00000600000006000000061a000006000000060000000600000006000000060000000600
-00000600000006000000060000000600000006000000061a000006000000060000000600
-0000060000000600000006000000060000000600000006000000060000000600000006fb
-0202010103ff03cc01010202063500000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060001000618000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600010000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060001000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000100
-061800000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060001000618000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600010006180000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000600010006fa0202010103ff03cc010102020636000006140100061a
-00000614010006010000061401000601000006140100061a000006140100061a00000614
-0100061a00000614010006fb0202010103ff03cc01010202063500000616010006180000
-061601000000061601000000061601000618000006160100061800000616010006180000
-0616010006fa0202010103ff03cc010102020636000006140100061a0000061401000601
-0000061401000601000006140100061a000006140100061a000006140100061a00000614
-010006fb0202010103ff03cc010102020635000006050702060307020606010006180000
-061601000000061601000000061601000618000006160100061800000616010006180000
-0616010006fa0202010103ff03cc0101020206360000060407020603070206050100061a
-00000614010006010000061401000601000006140100061a00000606070406080100061a
-00000608070106090100061a0000060807030607010006fb0202010103ff03cc01010202
-063500000604070406010704060501000618000006100700060401000000061007000604
-010000000604070006100100061800000605070806070100061800000608070306090100
-06180000060707070606010006fa0202010103ff03cc0101020206360000060307000601
-0701060107000601070106040100061a0000060f07000603010006010000060f07000603
-01000601000006030700060f0100061a00000603070a06050100061a0000060707030608
-0100061a000006050703060107030604010006fb0202010103ff03cc0101020206350000
-0603070d0604010006180000060d07000601070006040100000006040700060a07000604
-010000000604070006010700060d01000618000006040703060207030606010006180000
-06090701060a01000618000006060702060307020605010006fa0202010103ff03cc0101
-0202063600000601070006000703060007020600070406020100061a0000060c07000601
-0700060301000601000006030700060a070006030100060100000603070006010700060c
-0100061a0000060207030604070306040100061a000006140100061a0000060507020603
-07020604010006fb0202010103ff03cc0101020206350000060207000600070306000702
-060007040603010006180000060a07000601070006010700060401000000060407000604
-070006040700060401000000060407000601070006010700060a01000618000006030702
-060307070603010006180000060707040609010006180000060707010602070206060100
-06fa0202010103ff03cc0101020206360000060107000600070306000702060007040602
-0100061a0000060907000601070006010700060301000601000006030700060407000604
-0700060301000601000006030700060107000601070006090100061a0000060207020604
-070506030100061a00000607070306080100061a0000060a07020606010006fb02020101
-03ff03cc0101020206350000060207000600070306000702060007040603010006180000
-060707000601070006010700060107000604010000000604070006040700060107000601
-070006040100000006040700060107000601070006010700060701000618000006030702
-060507030605010006180000060907020609010006180000060a07020608010006fa0202
-010103ff03cc010102020636000006010700060007070600070406020100061a00000606
-070006010700060107000601070006030100060100000603070006040700060107000601
-070006030100060100000603070006010700060107000601070006060100061a00000602
-07030605070106050100061a00000608070206080100061a0000060807020608010006fb
-0202010103ff03cc01010202063500000602070006000704060107000600070406030100
-061800000604070006010700060107000601070006010700060401000000060407000601
-070006010700060107000601070006040100000006040700060107000601070006010700
-06010700060401000618000006040703060d010006180000060907020609010006180000
-060907020609010006fa0202010103ff03cc010102020636000006010706060107060602
-0100061a0000060307000601070006010700060107000601070006030100060100000603
-070006010700060107000601070006010700060301000601000006030700060107000601
-0700060107000601070006030100061a00000603070906060100061a0000060807020608
-0100061a00000614010006fb0202010103ff03cc01010202063500000602070006000702
-060507000600070206030100061800000604070006010700060107000601070006010700
-060401000000060407000601070006010700060107000601070006040100000006040700
-060107000601070006010700060107000604010006180000060507070608010006180000
-060807040608010006180000060907020609010006fa0202010103ff03cc010102020636
-00000601070006000702060507000600070206020100061a000006030700060107000601
-070006010700060107000603010006010000060307000601070006010700060107000601
-07000603010006010000060307000601070006010700060107000601070006030100061a
-00000606070406080100061a00000606070606060100061a0000060807020608010006fb
-0202010103ff03cc01010202063500000602070406050704060301000618000006160100
-000006160100000006160100061800000616010006180000061601000618000006160100
-06fa0202010103ff03cc010102020636000006140100061a000006140100060100000614
-01000601000006140100061a000006140100061a000006140100061a00000614010006fb
-0202010103ff03cc01010202063500000616010006180000061601000000061601000000
-0616010006180000061601000618000006160100061800000616010006fa0202010103ff
-03cc010102020636000006140100061a0000061401000601000006140100060100000614
-0100061a000006140100061a000006140100061a00000614010006fb0202010103ff03cc
-010102020635000006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006180000060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-000006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010000000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000618000006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006180000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100061800000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-0600010006fa0202010103ff03cc01010202063601000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100061a01000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060101000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060101000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100061a01000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100061a01000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100061a01000600010006000100060001000600
-01000600010006000100060001000600010006000100060001000600010006fb02020101
-03ff03cc0101020206ff06ff06430202010103ff03cc0101020206ff06ff064302020101
-0303000a01ff01b0000a03010101020206ff06ff064302020101030300000208050001ff
-01b000000208050003010101020206ff06ff064302020101030300000208050002ff02b0
-00000208050003010101020206ff06ff064302020101030300000208050002ff02b00000
-0208050003010101020206ff06ff064302020101030300000202050602ff02b000000505
-0202050003010101020206ff06ff06430202010103030000020205000209000d02ff02a4
-00000202050003010101020206ff06ff064302020101030300000202050002080000020d
-0500029001030211010302330101021501010206010102a1000002020500030101010202
-06ff06ff064302020101030300000202050002080000020d050002900101020201070200
-01010203010102010101020e010302200101020c0103020401010206010102110100028e
-00000202050003010101020206ff06ff064302020101030300000202050002080000020d
-05000290010102050101020301010203010102010101020d010102010101021f0101020b
-0101020101010203010102190101028e00000202050003010101020206ff06ff06430202
-010103030000020205000208000002020506020305000290010102050101020301010203
-010102010101020d01010206010302030103020201010200010102010103020201010200
-01010207010102030101020201010200010102030101020201030203010302000104028c
-000002020500030101010202060301ff01ff013b06030202010103030000050302080000
-0202050004040000020305000290010102050101020401010202010002020101020d0102
-020401010201010102010101020101010201010102000101020001010201010102010102
-020001010206010102030101020201020200010102020101020101010201010102010101
-0201010102000101028e000005030301010102020603010006ff06ff0625010006000000
-060000000600000006000000060000000600000006000000060000000600000006000100
-06030202010103030101020b000002030500040200000204050002900101020501010204
-01010201010102020101020e010302020101020101010205010102010102020201010205
-010102010101020601010203010102020101020101010202010102010101020101010201
-010102040101029101010301010102020603010006ff06ff062501000000060000000600
-000006000000060000000600000006000000060000000600000006000101060302020101
-03030101020b000002030500040200000204050002900101020501010205010102000100
-020301010210010202010105020201040201010102030101020501010201010102060101
-020301010202010102010101020201010201010502010101020401010291010103010101
-02020603010006010dff0dff0d210601010006000000060e010006000100060302020101
-03030101020b000002040500040000000205050002900101020501010205010302030101
-021101010201010102050101020101010201010102030101020501010201010102060101
-020301010202010102010101020201010201010102050101020401010291010103010101
-02020603010006010dff0dff0d2000000601010000000610010106030202010103030101
-020b000002040500040000000205050002900101020501010206010102040101020d0101
-020101010201010102020100020101010201010102010101020301010202010002010101
-020101010207010102010101020301010201010102020101020101010202010002010101
-0202010002000101029101010301010102020603010006010d0100ff00ff001f06010100
-06000000060e01000600010006030202010103030101020b000002050000020605000290
-0101020501010206010102040101020e0103020301030203010202000101020001010204
-01030202010102010101020801030204010402030101020201030203010302020102028f
-01010301010102020603010006010d0100ff00ff001f0601010000000610010106030202
-010103030101020b0000020d050002900103021101030254010102a40101030101010202
-0603010006010d0100ff00ff001f0601010006000000060e010006000100060302020101
-03030101020b0000020d050002fd010202a501010301010102020603010006010d0100ff
-00ff001f0601010000000610010106030202010103030101020b0000020d050002ff02a6
-01010301010102020603010006010d0100ff00ff001f0601010006000000060e01000600
-010006030202010103030101020c050d02ff02a701010301010102020603010006010d01
-00ff00ff001f0601010000000602010a060201010603020201010303010102ff02c20101
-0301010102020603010006010d0100ff00ff001f06010100060000000602010806020100
-060001000603020201010303010102ff02c201010301010102020603010006010d0100ff
-00ff001f06010100000006040106060401010603020201010303010102ff02c201010301
-010102020603010006010d0100ff00ff001f060101000600000006040104060401000600
-01000603020201010303010102ff02c201010301010102020603010006010d0100ff00ff
-001f06010100000006060102060601010603020201010303010102ff02c2010103010101
-02020603010006010d0100ff00ff001f0601010006000000060601000606010006000100
-06030202010103030101020206ff06bc020201010301010102020603010006010d0100ff
-00ff001f0601010000000610010106030202010103030101020206ff06bc020201010301
-010102020603010006010d0100ff00ff001f0601010006000000060e0100060001000603
-0202010103030101020206ff06bc020201010301010102020603010006010d0100ff00ff
-001f0601010000000610010106030202010103030101020206ff06bc0202010103010101
-02020603010006010d0100ff00ff001f0601010006000000060e01000600010006030202
-010103030101020206ff06bc020201010301010102020603010006010d0100ff00ff001f
-0601010000000610010106030202010103030101020206ff06bc02020101030101010202
-0603010006010d0100ff00ff001f0601010006000000060e010006000100060302020101
-03030101020206ff06bc020201010301010102020603010006010d0000ff00ff00200601
-010000000610010106030202010103030101020206ff06bc020201010301010102020603
-010006ff06ff062501000600000006000100060001000600010006000100060001000600
-010006000100060001000600010006030202010103030101020206ff06bc020201010301
-010102020603010006ff06ff062501000000060001000600010006000100060001000600
-01000600010006000100060001000600010106030202010103030101020206ff06bc0202
-0101030101010202060301ff01ff013b0603020201010303010102020608000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006080202010103010101020206ff06ff
-064302020101030301010202060700000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600010006070202010103010101020206ff06ff064302020101030301010202
-0608000006ff06a8010006080202010103010101020206ff06ff06430202010103030101
-02020607000006ff06aa010006070202010103010101020206ff06ff0643020201010303
-010102020608000006ff06a8010006080202010103010101020206ff06ff064302020101
-0303010102020607000006ff06aa010006070202010103010101020206ff06ff06430202
-01010303010102020608000006ff06a8010006080202010103010101020206ff06ff0643
-020201010303010102020607000006ff06aa010006070202010103010101020206ff06ff
-0643020201010303010102020608000006ff06a8010006080202010103010101020206ff
-06ff0643020201010303010102020607000006ff06aa0100060702020101030101010202
-06ff06ff0643020201010303010102020608000006ff06a8010006080202010103010101
-020206ff06ff0643020201010303010102020607000006ff06aa01000607020201010301
-0101020206ff06ff0643020201010303010102020608000006ff06a80100060802020101
-03010101020206ff06ff0643020201010303010102020607000006ff0649000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000611010006070202010103010101020206ff06ff0643020201010303
-010102020608000006ff0647000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006110100060802020101
-03010101020206ff06ff0643020201010303010102020607000006ff06490000064c0100
-0611010006070202010103010101020206ff06ff06430202010103030101020206080000
-06ff06470000064c01000611010006080202010103010101020206ff06ff064302020101
-03030101020206070000060d0102061e0100060f010106ff06060000064c010006110100
-06070202010103010101020206ff06ff06430202010103030101020206080000060b0100
-06020100061d0100060e010006ff06070000064c01000611010006080202010103010101
-020206ff06ff06430202010103030101020206070000060c010006060102060301020602
-010006000101060301020602010006000101060b01000604010206020100060001010604
-010106f20000064c01000611010006070202010103010101020206ff06ff064302020101
-03030101020206080000060c010006040100060201000601010006020100060101010601
-010006010100060201000601010106010100060801040601010006020100060101010601
-01000603010106f10000064c010006110100060802020101030101010202060301ff01ff
-013b06030202010103030101020206070000060e01010602010006020100060501000601
-0100060501000605010006020100060a010006030100060201000601010006fc0000064c
-0100061101000607020201010301010102020603010006ff06ed0100064a010006030202
-010103030101020206080000060f01000601010406020103060101000605010006050100
-06020100060a010006030100060201000601010006fb000006120102061e010006160100
-06110100060802020101030101010202060301000663010506ff06830100064a01000603
-0202010103030101020206070000060c0100060201000601010006050100060201000601
-0100060501000605010006020100060a010006030100060201000601010006fc00000610
-010006020100061d01000617010006110100060702020101030101010202060301000662
-010706ff06820100064a010006030202010103030101020206080000060b010006020100
-060101000602010006010100060201000601010006050100060201000601010006020100
-060a01000603010006020100060101000607010106f10000061101000606010206030102
-060201000600010106030102060201000600010106130100061101000608020201010301
-0101020206030100066101020603010206ff06810100064a010006030202010103030101
-020206070000060d0102060301020603010306010100060601020602010006020100060a
-010006040102060201000607010106f20000061101000604010006020100060101000602
-010006010101060101000601010006020100060101010601010006130100061101000607
-0202010103010101020206030100066101010605010106ff06810100064a010006030202
-01010303010102020608000006ff06470000061301010602010006020100060501000601
-010006050100060501000602010006120100061101000608020201010301010102020603
-0100066101020603010206ff06810100064a010006030202010103030101020206070000
-06ff06490000061401000601010406020103060101000605010006050100060201000613
-010006110100060702020101030101010202060301000662010706ff06820100064a0100
-0603020201010303010102020608000006ff064700000611010006020100060101000605
-010006020100060101000605010006050100060201000612010006110100060802020101
-030101010202060301000663010506ff06830100064a0100060302020101030301010202
-0607000006ff064900000610010006020100060101000602010006010100060201000601
-010006050100060201000601010006020100061301000611010006070202010103010101
-0202060301000665010106ff06850100064a010006030202010103030101020206080000
-06ff06470000061201020603010206030103060101000606010206020100060201000612
-010006110100060802020101030101010202060301000665010106ff06850100064a0100
-0603020201010303010102020607000006ff06490000064c010006110100060702020101
-030101010202060301000665010106ff06850100064a0100060302020101030301010202
-0608000006ff06470000064c010006110100060802020101030101010202060301000665
-010106ff06850100064a01000603020201010303010102020607000006ff06490000064c
-010006110100060702020101030101010202060301000665010106ff06850100064a0100
-0603020201010303010102020608000006ff06470000064c010006110100060802020101
-030101010202060301000665010106ff06850100064a0100060302020101030301010202
-06070000060b0dff0d2806140000064c0100061101000607020201010301010102020603
-0100066101010600010206ff06850100064a010006030202010103030101020206080000
-060a0dff0d27000006130000064c01000611010006080202010103010101020206030100
-066101010600010206ff06850100064a010006030202010103030101020206070000060b
-0d0100ff002606140000064c010006110100060702020101030101010202060301000661
-010506ff06850100064a010006030202010103030101020206080000060a0d0100ff0026
-06130000064c010006110100060802020101030101010202060301000661010506ff0685
-0100064a010006030202010103030101020206070000060b0d0100ff002606140000064c
-01000611010006070202010103010101020206030100066101020600010106ff06850100
-064a010006030202010103030101020206080000060a0d0100ff002606130000064c0100
-061101000608020201010301010102020603010006ff06ed0100064a0100060302020101
-03030101020206070000060b0d0100ff0026061400000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000611
-0100060702020101030101010202060301ff01ef064a0100060302020101030301010202
-06080000060a0d0100ff0026061300000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000611010006080202
-010103010101020206030100063513610c04060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-0000060000000600000006000000060000000600000006000000060000000c0406000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000c040600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000c04060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000001000614010006000100060001000600
-010006000100060001000600010006000100060001000624010006030202010103030101
-020206070000060b0d01001f010000ff0005067501000607020201010301010102020603
-01000635136012000c030100000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-0000060000000600000006000000060000000600000006000c0301000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000c03010000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-00000600000006000000060000000600000006000c030100000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060001000613010006000100060001000600
-010006000100060001000600010006000100060001000600000006230100060302020101
-03030101020206080000060a0d01001d0100000001000000010000ff0003067401000608
-020201010301010102020603010006351301115d12010c01010206000000065c01000c01
-010206000000065c01000c01010206000000065c01000c01010206000000061f01000614
-0100040e00000624010006030202010103030101020206070000060b0d01000101000002
-01000002010200030102000301020003010200ff00040675010006070202010103010101
-02020603010006351301112c0100112f12010c0101020000062b0102062d010006000c01
-01020000062b0102062d010006000c0101020000062d0100062d010006000c0101020000
-06200100061301000600040e060000000623010006030202010103030101020206080000
-060a0d010001010000020100000101000002010000010100000201000001010000020100
-0002010200ff0004067401000608020201010301010102020603010006351301112a0102
-112f12010c010102060000000629010006020100062d01000c0101020600000006290100
-06020100062d01000c01010206000000062b0101062e01000c01010206000000061f0100
-06140100040e00000624010006030202010103030101020206070000060b0d0100010100
-0002010000050100000101000009010000010100000001000000010000ff000306750100
-0607020201010301010102020603010006351301112c0100112f12010c0101020000062a
-010006020100062c010006000c0101020000062e0100062c010006000c0101020000062b
-010006000100062d010006000c010102000006200100061301000600040e060000000623
-010006030202010103030101020206080000060a0d010002010000000100000301030002
-0102000301030003010000ff000506740100060802020101030101010202060301000635
-1301112c0100112f12010c010102060000000629010006020100062d01000c0101020600
-0000062d0100062d01000c01010206000000062a010006000100062e01000c0101020600
-0000061f010006140100040e00000624010006030202010103030101020206070000060b
-0d010002010000000100000201000002010000050100000101000002010000ff000a0675
-01000607020201010301010102020603010006351301112c0100112f12010c0101020000
-062d0100062d010006000c0101020000062c0101062d010006000c0101020000062a0100
-06010100062d010006000c010102000006200100061301000600040e0600000006230100
-06030202010103030101020206080000060a0d0100030100000301000002010000010100
-00020100000101000002010000ff000a0674010006080202010103010101020206030100
-06351301112c0100112f12010c01010206000000062b0100062f01000c01010206000000
-062d0100062d01000c010102060000000628010006020100062e01000c01010206000000
-061f010006140100040e00000624010006030202010103030101020206070000060b0d01
-0003010000040103000201020003010300ff000a06750100060702020101030101010202
-0603010006351301112c0100112f12010c0101020000062b0100062f010006000c010102
-0000062e0100062c010006000c010102000006290105062c010006000c01010200000620
-0100061301000600040e060000000623010006030202010103030101020206080000060a
-0d0100ff0026067401000608020201010301010102020603010006351301112c0100112f
-12010c010102060000000629010006020100062d01000c01010206000000062901000602
-0100062d01000c01010206000000062c0100062e01000c01010206000000061f01000614
-0100040e00000624010006030202010103030101020206070000060b0d0100ff00260614
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006110100060702020101030101010202060301000635
-1301112a0104112d12010c0101020000062a0104062c010006000c0101020000062b0102
-062d010006000c0101020000062c0102062c010006000c01010200000620010006130100
-0600040e060000000623010006030202010103030101020206080000060a0d0100ff0026
-061300000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000611010006080202010103010101020206030100
-06351301115d12010c01010206000000065c01000c01010206000000065c01000c010102
-06000000065c01000c01010206000000061f010006140100040e00000624010006030202
-010103030101020206070000060b0d0100ff002606140000064c01000611010006070202
-01010301010102020603010006351301115d12010c0101020000065c010006000c010102
-0000065c010006000c0101020000065c010006000c010102000006200100061301000600
-040e060000000623010006030202010103030101020206080000060a0d0100ff00260613
-0000064c0100061101000608020201010301010102020603010006351301115d12010c01
-010206000000065c01000c01010206000000065c01000c01010206000000065c01000c01
-010206000000061f010006140100040e0000062401000603020201010303010102020607
-0000060b0d0100ff002606140000064c0100061101000607020201010301010102020603
-010006351301115d12010c0101020000065c010006000c0101020000065c010006000c01
-01020000065c010006000c010102000006200100061301000600040e0600000006230100
-06030202010103030101020206080000060a0d0100ff002606130000064c010006110100
-0608020201010301010102020603010006351301115d12010c01010206000000065c0100
-0c01010206000000065c01000c01010206000000065c01000c01010206000000061f0100
-06140100040e00000624010006030202010103030101020206070000060b0d0100ff0026
-06140000064c0100061101000607020201010301010102020603010006351301115d1201
-0c0101020000065c010006000c0101020000065c010006000c0101020000065c01000600
-0c010102000006200100061301000600040e060000000623010006030202010103030101
-020206080000060a0d0000ff002706130000064c01000611010006080202010103010101
-02020603010006351301125f0c0101020600000006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000c01010206000000
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-06000100060001000c010102060000000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100060001000c0101020600000006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010106140100040e000006240100
-0603020201010303010102020607000006ff06490000064c010006110100060702020101
-030101010202060301000635130012600c00010300000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-01000600010006000100060001000600010006000100060001000600010006000c000103
-000006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0100060001000600010006000c0001030000060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000c00010300000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100061301000600
-040e06000000062301000603020201010303010102020608000006ff0647000006120102
-061f01020613010006110100060802020101030101010202060301001036006301000063
-010000630100006301000022010006140100040e00000624010006030202010103030101
-02020607000006ff06490000061001000602010006200100061401000611010006070202
-01010301010102020603010010350f000063010000630100006301000063010000220100
-061301000600040e06000000062301000603020201010303010102020608000006ff0647
-000006110100060201000602010206020100060001010603010206030102060501000613
-01000611010006080202010103010101020206030100100108320f010063010000630100
-00630100006301000022010006140100040e000006240100060302020101030301010202
-0607000006ff064900000610010006050100060201000601010106010100060101000602
-010006010100060201000604010006140100061101000607020201010301010102020603
-0100100108320f010063010000630100006301000063010000220100061301000600040e
-06000000062301000603020201010303010102020608000006ff06470000061101000609
-010006010100060201000601010006050100060201000604010006130100061101000608
-020201010301010102020603010010010815010408170f01006301000063010000630100
-006301000022010006140100040e00000624010006030202010103030101020206070000
-06ff06490000061001000606010306010100060201000601010006050104060401000614
-010006110100060702020101030101010202060301001001081501000802010008170f01
-000a0100001a01010004010000340100002c010000350100006301000063010000220100
-061301000600040e06000000062301000603020201010303010102020608000006ff0647
-000006110100060201000601010006020100060101000602010006010100060501000608
-010006130100061101000608020201010301010102020603010010010818010008180f01
-00250100003c0100002c01000035010000630100006301000022010006140100040e0000
-062401000603020201010303010102020607000006ff0649000006100100060201000601
-010006020100060101000602010006010100060201000601010006020100060401000614
-0100061101000607020201010301010102020603010010010818010008180f0100080102
-000301020003010200030102000401000004010200020100000001010003010200260100
-000701000002010000020102000301020003010200030102000201040002010200020100
-0000010100260100006301000063010000220100061301000600040e0600000006230100
-0603020201010303010102020608000006ff064700000612010206030103060101000602
-010006020102060301020605010006130100061101000608020201010301010102020603
-010010010818010008180f01000a01000002010000020100000101000002010000010100
-000201000001010400040100000201010001010000010100000201000025010000070100
-000201000001010000020100000101000002010000010100000201000001010000020100
-000301000003010000020100000101010001010000250100006301000063010000220100
-06140100040e0000062401000603020201010303010102020607000006ff06490000064c
-0100061101000607020201010301010102020603010010010818010008180f01000a0100
-000201000002010000010100000501000002010000030100000601000002010000020100
-000101000002010000250100000701000002010000050100000101000009010000010100
-000701000007010000010100000201000025010000630100006301000022010006130100
-0600040e06000000062301000603020201010303010102020608000006ff06470000064c
-0100061101000608020201010301010102020603010010010817010008190f01000a0100
-000201000002010000020102000201040003010000060100000201000002010000010104
-002501000008010000000100000301030002010200030103000201020004010000040103
-00010100000201000025010000630100006301000022010006140100040e000006240100
-0603020201010303010102020607000006ff06490000064c010006110100060702020101
-0301010102020603010010010817010008190f01000a0100000201000002010000050100
-000101000007010000060100000201000002010000010100002901000008010000000100
-000201000002010000050100000101000002010000050100000301000003010000020100
-000101000002010000250100006301000063010000220100061301000600040e06000000
-062301000603020201010303010102020608000006ff06470000064c0100061101000608
-020201010301010102020603010010010817010008190f01000a01000002010000020100
-000101000002010000010100000201000003010000060100000201000002010000010100
-000201000025010000090100000301000002010000010100000201000001010000020100
-000101000002010000030100000301000002010000010100000201000025010000630100
-006301000022010006140100040e00000624010006030202010103030101020206070000
-06ff06490000064c01000611010006070202010103010101020206030100100108320f01
-000a01000003010200030102000301020004010000060100000201000002010000020102
-002601000009010000040103000201020003010300020102000501010002010300010100
-0002010000250100006301000063010000220100061301000600040e0600000006230100
-0603020201010303010102020608000006ff06470000064c010006110100060802020101
-03010101020206030100100108320f01000a010000570100006301000063010000630100
-0022010006140100040e0000062401000603020201010303010102020607000006ff0649
-0000064c01000611010006070202010103010101020206030100100108320f0100070100
-000101000057010000630100006301000063010000220100061301000600040e06000000
-062301000603020201010303010102020608000006ff06470000064c0100061101000608
-0202010103010101020206030100100108320f0100080101005801000063010000630100
-006301000022010006140100040e00000624010006030202010103030101020206070000
-062200000663010006c00000064c01000611010006070202010103010101020206030100
-100108320f010063010000630100006301000063010000220100061301000600040e0600
-00000623010006030202010103030101020206080000062000000600000006230100063c
-010006000100063e0102064b0100062f0000064c01000611010006080202010103010101
-020206030100100108320f01006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070000062000000600000006000000
-06220100063b01000600010006000100063f0100067d0000060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-061101000607020201010301010102020603010010010f34006301000063010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06080000061e00000602000006000000060b010206030102060901040602010206020100
-0600010106020101060001000624010006000a01010006000100060b0102060301020609
-010006000101060301020603010106000100060101000602010006040100060301020602
-010006000101060a01020602010006020100060101000600010106020100060001010603
-010206030102060301020603010206030102060201000600010106210000060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100061101000608020201010301010102020603010010000f3501ff01b70614
-0100040e00000624010006030202010103030101020206070000061e0000060400000600
-000006090100060201000601010006020100060a01000603010006020100060101010601
-01000601010006000100060001000622010006000a030100060001000609010006020100
-060101000602010006080101060101000601010006020100060101000601010106010100
-060201000604010006020100060201000601010106010100060801000602010006010100
-060201000601010106010100060101010601010006010100060201000601010006020100
-060101000602010006040100060201000602010006010101060101000682010006070202
-0101030101010202060301000e3600630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206080000061c00000606
-000006000000060c010006010100060e0100060301000602010006010100060501000600
-0100060001000621010006000a05010006000100060c010006010100060c010006050100
-0602010006010100060201000601010006020100060401000606010006010100060c0100
-060201000602010006000100060201000602010006010100060501000602010006010100
-060501000608010006020100060201000601010006020100068101000608020201010301
-01010202060301000e350b00006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070000061c01000608010006000100
-0608010306020102060b0100060301040601010006050100060001000600010006200000
-06000a070000060000000608010306020102060901000605010406010100060201000601
-010006020100060401000603010306010100060c01040603010006030100060201000601
-010006050104060201020603010206050100060201000602010006010100060201000682
-0100060702020101030101010202060301000e0109320b01006301000063010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06080000061c01000606010006000100060801000602010006050100060a010006030100
-060501000605010006000100060001000621000006000a05000006000000060801000602
-010006050100060801000605010006050100060201000601010006020100060401000602
-01000602010006010100060c010006060100060001000602010006020100060101000605
-010006090100060501000604010006020100060201000601010006020100068101000608
-02020101030101010202060301000e0109320b0100630100006301000063010000630100
-0022010006140100040e00000624010006030202010103030101020206070000061e0100
-060401000600010006090100060201000601010006020100060a01000603010006020100
-060101000605010006000100060001000622000006000a03000006000000060901000602
-010006010100060201000608010006050100060201000601010006010101060101000601
-010106040100060201000602010006010100060c01000602010006010100060201000601
-010106010100060101000605010006020100060101000602010006010100060201000604
-010006020100060201000601010006020100068201000607020201010301010102020603
-01000e010916010209180b01006301000063010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206080000061e010006020100
-06000100060b010306020102060c01010602010206020100060501000600010006000100
-0623000006000a01000006000000060b0103060201020609010006060102060301010600
-01000602010106000100060401000603010306010100060d010206020100060201000601
-010006000101060201000606010206030102060301020605010006030102060201000602
-010006810100060802020101030101010202060301000e01091501000902010009170b01
-000701000016010000420100000701000006010200100100000c01000030010000630100
-006301000022010006140100040e00000624010006030202010103030101020206070000
-062001000600010006000100065f00000600000006000000063201000632010006b70100
-060702020101030101010202060301000e01091501000902010009170b0100070100005a
-0100000701000008010000100100000c0100003001000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206080000062001000600
-01000661000006000000062f0100060201000632010006b6010006080202010103010101
-0202060301000e01091501000902010009170b0100070100000101000003010200020100
-00000101000301020002010000000101003b010000070100000001010005010000030102
-000301020002010000010100000301020002010000000101000301020002010000000101
-00030101000001000017010000630100006301000022010006140100040e000006240100
-060302020101030301010202060700000622010006630000063101020633010006b70100
-060702020101030101010202060301000e010916010209180b0100070100000001000003
-0100000201000001010100010100000401000002010100010100003a0100000701010001
-010000040100000201000002010000010100000201000001010000000100000301000002
-010000010101000101000001010000020100000101010001010000010100000101010017
-0100006301000063010000220100061301000600040e0600000006230100060302020101
-0303010102020608000006ff06a80100060802020101030101010202060301000e010915
-01000902010009170b01000701010008010000010100000801000002010000020100003a
-010000070100000201000004010000060100000101000005010100040100000201000001
-010000020100000101000002010000010100000501000002010000170100006301000063
-01000022010006140100040e0000062401000603020201010303010102020607000006ff
-06aa0100060702020101030101010202060301000e01091501000902010009170b010007
-01010005010300010100000801000002010000020100003a010000070100000201000004
-010000030103000101000005010100040104000101000002010000010104000101000005
-01000002010000170100006301000063010000220100061301000600040e060000000623
-01000603020201010303010102020608000006ff06a80100060802020101030101010202
-060301000e01091501000902010009170b01000701000000010000030100000201000001
-0100000801000002010000020100003a0100000701000002010000040100000201000002
-010000010100000501000000010000030100000501000002010000010100000501000005
-0100000201000017010000630100006301000022010006140100040e0000062401000603
-020201010303010102020607000006ff06aa010006070202010103010101020206030100
-0e010916010209180b010007010000010100000201000002010000010100000801000002
-010000020100003a01000007010100010100000401000002010000020100000101000002
-010000010100000101000002010000020100000101010001010000010100000201000001
-0100000501000001010100170100006301000063010000220100061301000600040e0600
-0000062301000603020201010303010102020608000006ff06a801000608020201010301
-01010202060301000e0109320b0100070100000201000002010300010100000801000002
-010000020100003a01000007010000000101000501000003010300020102000201000002
-010000020102000201000000010100030102000201000006010100000100001701000063
-0100006301000022010006140100040e0000062401000603020201010303010102020607
-000006ff06aa0100060702020101030101010202060301000e0109320b0100630100004a
-010000170100006301000063010000220100061301000600040e06000000062301000603
-020201010303010102020608000006ff06a8010006080202010103010101020206030100
-0e0109320b01006301000046010000020100001701000063010000630100002201000614
-0100040e0000062401000603020201010303010102020607000006ff06aa010006070202
-0101030101010202060301000e0109320b01006301000047010200180100006301000063
-010000220100061301000600040e06000000062301000603020201010303010102020608
-000006ff06a80100060802020101030101010202060301000e0109320b01006301000063
-010000630100006301000022010006140100040e00000624010006030202010103030101
-02020607000006ff06aa0100060702020101030101010202060301000e0109320b010063
-010000630100006301000063010000220100061301000600040e06000000062301000603
-020201010303010102020608000006ff06a8010006080202010103010101020206030100
-0e010b34006301000063010000630100006301000022010006140100040e000006240100
-060302020101030301010202060700000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-0600010006000100060702020101030101010202060301000e000b3501ff01b706130100
-0600040e0600000006230100060302020101030301010202060801000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060802020101030101010202060301000c360063
-01000063010000630100006301000022010006140100040e000006240100060302020101
-03030101020206ff06bc02020101030101010202060301000c3501000063010000630100
-006301000063010000220100061301000600040e06000000062301000603020201010303
-0101020206ff06bc02020101030101010202060301000c01013400630100006301000063
-0100006301000022010006140100040e00000624010006030202010103030101020206ff
-06bc02020101030101010202060301000c01013400630100006301000063010000630100
-00220100061301000600040e060000000623010006030202010103030101020206ff06bc
-02020101030101010202060301000c0101160002011a0063010000630100006301000063
-01000022010006140100040e00000624010006030202010103030101020206ff06bc0202
-0101030101010202060301000c010115000001020000011900070100000e010000140100
-00340100002b010200340100006301000063010000220100061301000600040e06000000
-0623010006030202010103030101020206ff06bc02020101030101010202060301000c01
-0115000001020000011900070100000e0100004a0100002d010000340100006301000063
-01000022010006140100040e00000624010006030202010103030101020206ff06bc0202
-0101030101010202060301000c0101150000010200000119000701000001010000030102
-000201040002010200020100000001010003010200020100000001010003010200260100
-000701000002010000010100000001010002010000000101000301020003010200050100
-00030102002d0100006301000063010000220100061301000600040e0600000006230100
-06030202010103030101020206ff06bc02020101030101010202060301000c0101150000
-010200000119000701000000010000030100000201000003010000030100000201000001
-010100010100000401000002010100010100000101000002010000250100000701000002
-010000010101000101000001010100010100000101000002010000010100000201000004
-01000002010000020100002c010000630100006301000022010006140100040e00000624
-010006030202010103030101020206ff06bc02020101030101010202060301000c010116
-000301190007010100080100000301000007010000010100000801000002010000020100
-000501000025010000070100000201000001010000020100000101000002010000010100
-000901000004010000060100002c0100006301000063010000220100061301000600040e
-060000000623010006030202010103030101020206ff06bc020201010301010102020603
-01000c010119000001190007010100050103000301000004010300010100000801000002
-010000020100000201030025010000070100000201000001010000020100000101000002
-010000020102000301030004010000030103002c01000063010000630100002201000614
-0100040e00000624010006030202010103030101020206ff06a101000600010006000100
-060001000600010006000100060001000600010006000100060902020101030101010202
-060301000c0101180000011a000701000000010000030100000201000003010000030100
-000201000001010000080100000201000002010000010100000201000025010000070100
-000201000001010000020100000101000002010000050100000101000002010000040100
-0002010000020100002c0100006301000063010000220100061301000600040e06000000
-0623010006030202010103030101020206ff06a001000600010006000100060001000600
-010006000100060001000600010006000100060000000608020201010301010102020603
-01000c0101150002011b0007010000010100000201000002010000030100000301000002
-010000010100000801000002010000020100000101000002010000250100000701000001
-010100010101000101000001010100010100000101000002010000010100000201000004
-01000002010000020100002c010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070dff0d9606020100060601000606000006090202
-0101030101010202060301000c0101340007010000020100000201030004010100020103
-000101000008010000020100000201000002010300250100000801010000010000010100
-00000101000201000000010100030102000301030004010000030103002c010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06070dff0d95000006010100060600000608000006080202010103010101020206030100
-0c01013400630100000e010000050100004c010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070d0100ff00940602010006060100
-06060000060902020101030101010202060301000c01013400630100000e010000050100
-004c0100006301000063010000220100061301000600040e060000000623010006030202
-010103030101020206070d0100580101006a010100cc0601010006060000060001000606
-0000060802020101030101010202060301000c01013400630100000e010000050100004c
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d0100570100006e010000cb0602010006040000060201000604000006090202
-0101030101010202060301000c0101340063010000630100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d01000f0103
-00180102002701000020010200050100002e01000013010000cb06010100060400000602
-010006060000060802020101030101010202060301000c01013400630100006301000063
-0100006301000022010006140100040e0000062401000603020201010303010102020607
-0d01000f01000002010000160100000201000026010000220100003501000013010000cb
-06020100060400000602010006040000060902020101030101010202060301000c010134
-0063010000630100006301000063010000220100061301000600040e0600000006230100
-06030202010103030101020206070d01000f010000020100000201020002010000020100
-000c01000003010100200100000401020002010000000101000201000000010100030102
-000501000003010200090100000201000002010200030102000301020003010200020104
-0002010200020100000001010004010000cb060101000604000006040100060400000608
-02020101030101010202060301000c0001ff01ed06140100040e00000624010006030202
-010103030101020206070d01000f01000002010000010100000201000001010000020100
-000c01000003010100200100000301000002010000010101000101000001010100010100
-000101000002010000040100000501000009010000020100000101000002010000010100
-000201000001010000020100000101000002010000030100000301000002010000010101
-000101000003010000cb0602010006020000060601000602000006090202010103010101
-0202060301000e360063010000630100006301000063010000220100061301000600040e
-060000000623010006030202010103030101020206070d01000f01030002010000020100
-000101000000010000000100000b01000025010100080100000101000002010000010100
-000201000001010000020100000401000005010000090100000201000005010000010100
-0009010000010100000701000007010000010100000201000004010100c9060101000602
-00000606010006040000060802020101030101010202060301000e350b00006301000063
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d01000f0100000101000002010000020100000101000000010000000100000a
-010000280100000401030001010000020100000101000002010000010104000401000005
-0100000a0100000001000003010300020102000301030002010200040100000401030001
-0100000201000003010000cb060201000602000006060100060200000609020201010301
-01010202060301000e0109320b0100630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206070d01000f01000002
-010000010100000201000001010000000100000001000009010000290100000301000002
-010000010100000201000001010000020100000101000008010000050100000a01000000
-010000020100000201000005010000010100000201000005010000030100000301000002
-010000010100000201000003010000cb0601010006020000060801000602000006080202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-010006140100040e00000624010006030202010103030101020206070d01000f01000002
-010000010100000201000001010000000100000001000008010000070101002001000003
-010000020100000101000002010000010100000201000001010000020100000401000005
-010000040101000401000003010000020100000101000002010000010100000201000001
-01000002010000030100000301000002010000010100000201000003010000cb06020100
-06000000060a010006000000060902020101030101010202060301000e01091301000904
-010209150b010063010000630100006301000063010000220100061301000600040e0600
-00000623010006030202010103030101020206070d01000f010000020100000201020003
-010000000100000901040003010100200100000401030001010000020100000101000002
-010000020102000501000005010000040101000401000004010300020102000301030002
-0102000501010002010300010100000201000003010000cb060101000600000006000100
-060001000600010006000100060001000600010006020000060802020101030101010202
-060301000e0109110102090301000902010009140b010063010000320102002d01000063
-0100006301000022010006140100040e0000062401000603020201010303010102020607
-0d010057010000300100003c010000cb0602010006000100060001000600010006000100
-06000100060001000600010006000000060902020101030101010202060301000e010913
-0100090301000902010009140b010063010000340100002d010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206070d010058
-0101002c0101003b010100cc060101000610000006080202010103010101020206030100
-0e0109130100090301000902010009140b01000701010000010000030102000301010000
-010000010100000001010002010000020100000201020034010000070100000001010003
-010200020100000001010002010000000101000201010000010000030102000501000002
-0101000001000026010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206070d0100ff0094060201000600000006000000060000000600
-000006000000060000000600000006000000060902020101030101010202060301000e01
-09130100090301000902010009140b010007010000000100000001000001010000020100
-000101000001010100010101000101000001010000020100000101000002010000330100
-000701010001010000010100000201000001010100010100000101010001010000010100
-000001000000010000010100000201000004010000020100000001000000010000250100
-006301000063010000220100061301000600000006000000060000000600000006000000
-060000000600000006000000060000000623010006030202010103030101020206070d01
-00ff00940601010006000000060000000600000006000000060000000600000006000000
-0600010006000000060802020101030101010202060301000e0109130100090301000902
-010009140b01000701000000010000000100000501000001010000020100000101000002
-010000010100000201000001010000370100000701000002010000010100000201000001
-010000050100000501000000010000000100000501000004010000020100000001000000
-010000250100006301000063010000220100061401000600000006000000060000000600
-000006000000060000000600000006000000062401000603020201010303010102020607
-0d0100ff00940602010006000000060a0100060000000609020201010301010102020603
-01000e0109130100090301000902010009140b0100070100000001000000010000020103
-000101000002010000010100000201000001010000020100000201020034010000070100
-000201000001010000020100000101000005010000050100000001000000010000020103
-000401000002010000000100000001000025010000630100006301000022010006130100
-06000000060c0100060000000623010006030202010103030101020206070d0100ff0094
-0601010006000000060c010006000000060802020101030101010202060301000e010913
-0100090301000902010009140b0100070100000001000000010000010100000201000001
-010000020100000101000002010000010100000201000005010000330100000701000002
-010000010100000201000001010000050100000501000000010000000100000101000002
-010000040100000201000000010000000100002501000063010000630100002201000614
-010006000000060a0100060000000624010006030202010103030101020206070d010058
-01010063010100d30602010006000000060a010006000000060902020101030101010202
-060301000e01091101040902010209150b01000701000000010000000100000101000002
-010000010100000101010001010000020100000101000001010100010100000201000033
-010000070100000201000001010000020100000101000005010000050100000001000000
-010000010100000201000004010000020100000001000000010000250100006301000063
-0100002201000613010006000000060c0100060000000623010006030202010103030101
-020206070d01005701000067010000d20601010006000000060c01000600000006080202
-0101030101010202060301000e0109320b01000701000000010000000100000201030002
-010100000100000101000002010000020101000001000002010200340100000701000002
-010000020102000201000005010000050100000001000000010000020103000401000002
-01000000010000000100002501000063010000630100002201000614010006000000060a
-0100060000000624010006030202010103030101020206070d01000f0103001801020027
-0100000d010000130100002e01000013010000d20602010006000000060a010006000000
-060902020101030101010202060301000e0109320b010019010000480100006301000063
-010000630100002201000613010006000000060c01000600000006230100060302020101
-03030101020206070d01000f010000020100001601000002010000260100005201000013
-010000d20601010006000000060c01000600000006080202010103010101020206030100
-0e0109320b01001501000002010000480100006301000063010000630100002201000614
-010006000000060a0100060000000624010006030202010103030101020206070d01000f
-010000020100000201020002010000020100000c01000003010100200100000401020003
-010200030102000301020003010200090100000201000002010200030102000301020003
-0102000201040002010200020100000001010004010000d20602010006000000060a0100
-06000000060902020101030101010202060301000e0109320b0100160102004901000063
-01000063010000630100002201000613010006000000060c010006000000062301000603
-0202010103030101020206070d01000f0100000201000001010000020100000101000002
-0100000c0100000301010020010000030100000201000004010000020100000201000001
-010000020100000401000009010000020100000101000002010000010100000201000001
-010000020100000101000002010000030100000301000002010000010101000101000003
-010000d20601010006000000060c01000600000006080202010103010101020206030100
-0e0109320b0100630100006301000063010000630100002201000614010006000000060a
-0100060000000624010006030202010103030101020206070d01000f0103000201000002
-0100000101000000010000000100000a0101002501010004010000080100000201000005
-010000080100000901000002010000050100000101000009010000010100000701000007
-010000010100000201000004010100d00602010006000000060a01000600000006090202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-01000613010006000000060c010006000000062301000603020201010303010102020607
-0d01000f0100000101000002010000020100000101000000010000000100000c01000026
-01000003010000080100000201000005010000080100000a010000000100000301030002
-01020003010300020102000401000004010300010100000201000003010000d206010100
-06000000060c010006000000060802020101030101010202060301000e010b3400630100
-006301000063010000630100002201000614010006000000060a01000600000006240100
-06030202010103030101020206070d01000f010000020100000101000002010000010100
-0000010000000100000c0100002601000003010000080100000201000005010000080100
-000a01000000010000020100000201000005010000010100000201000005010000030100
-000301000002010000010100000201000003010000d20602010006000000060a01000600
-0000060902020101030101010202060301000e000b3501ff01b7060c0104060101000600
-0000060c0100060000000623010006030202010103030101020206070d01000f01000002
-010000010100000201000001010000000100000001000008010000020100000301010020
-010000030100000201000004010000020100000201000001010000020100000401000004
-010100040100000301000002010000010100000201000001010000020100000101000002
-010000030100000301000002010000010100000201000003010000d20601010006000000
-060c010006000000060802020101030101010202060301000e3600630100006301000063
-01000063010000220100060c0100060201000602010006000000060a0100060000000624
-010006030202010103030101020206070d01000f01000002010000020102000301000000
-0100000a0102000401010020010000040102000501000003010200030102000501000004
-010100040100000401030002010200030103000201020005010100020103000101000002
-01000003010000d20602010006000000060a010006000000060902020101030101010202
-060301000e350b0000630100006301000063010000630100002201000610010006010100
-060000000600010006000100060001000600010006000100060001000600010006000000
-0623010006030202010103030101020206070d010057010000290100003c010000d20601
-010006000000060c010006000000060802020101030101010202060301000e0109320b01
-0063010000630100006301000063010000220100060f0100060301000600000006000000
-060000000600000006000000060000000600000006000000062401000603020201010303
-0101020206070d010058010100250101003b010100d30602010006000000060a01000600
-0000060902020101030101010202060301000e0109320b01006301000063010000630100
-0063010000220100060f01000602010006000000060c0100060000000623010006030202
-010103030101020206070d0100ff00940601010006000000060c01000600000006080202
-0101030101010202060301000e01091301000905010009160b0100630100006301000063
-01000063010000220100060f01000603010006000000060a010006000000062401000603
-0202010103030101020206070d0100ff00940602010006000000060a0100060000000609
-02020101030101010202060301000e01091101020903010209160b010016010200050100
-00420100002b010200340100006301000063010000220100060e01000603010006000000
-060c0100060000000623010006030202010103030101020206070d0100ff009406010100
-06000000060c010006000000060802020101030101010202060301000e01091301000905
-010009160b010018010000490100002d010000340100006301000063010000220100060e
-01000604010006000000060a010006000000062401000603020201010303010102020607
-0d0100ff00940602010006000000060a0100060000000609020201010301010102020603
-01000e01091301000905010009160b010007010100000100000301020005010000030102
-0002010000000101003b0100000701000002010000010100000001010002010000000101
-00030102000301020005010000030102002d0100006301000063010000220100060e0100
-0603010006000000060c0100060000000623010006030202010103030101020206070d01
-005801010055010100e10601010006000000060c01000600000006080202010103010101
-0202060301000e01091301000905010009160b0100070100000001000000010000010100
-0002010000040100000501000002010100010100003a0100000701000002010000010101
-000101000001010100010100000101000002010000010100000201000004010000020100
-00020100002c01000063010000630100002201000614010006000000060a010006000000
-0624010006030202010103030101020206070d01005701000059010000e0060201000600
-0000060a010006000000060902020101030101010202060301000e010913010009050100
-09160b010007010000000100000001000005010000040100000501000002010000020100
-003a01000007010000020100000101000002010000010100000201000001010000090100
-0004010000060100002c01000063010000630100002201000613010006000000060c0100
-060000000623010006030202010103030101020206070d01000f0103001b010000260100
-004401000013010000e00601010006000000060c01000600000006080202010103010101
-0202060301000e01091301000905010009160b0100070100000001000000010000020103
-00040100000501000002010000020100003a010000070100000201000001010000020100
-000101000002010000020102000301030004010000030103002c01000063010000630100
-002201000614010006000000060a01000600000006240100060302020101030301010202
-06070d01000f0100000201000019010100260100004401000013010000e0060201000600
-0000060a010006000000060902020101030101010202060301000e010913010009050100
-09160b010007010000000100000001000001010000020100000401000005010000020100
-00020100003a010000070100000201000001010000020100000101000002010000050100
-0001010000020100000401000002010000020100002c0100006301000063010000220100
-0613010006000000060c0100060000000623010006030202010103030101020206070d01
-000f010000020100000201020002010000020100000a0100000001000003010100200100
-000401020002010000020100000201020009010000020100000201020003010200030102
-00030102000201040002010200020100000001010004010000e00601010006000000060c
-010006000000060802020101030101010202060301000e01091101040901010409140b01
-000701000000010000000100000101000002010000040100000501000002010000020100
-003a01000007010000010101000101010001010000010101000101000001010000020100
-0001010000020100000401000002010000020100002c0100006301000063010000220100
-0614010006000000060a0100060000000624010006030202010103030101020206070d01
-000f01000002010000010100000201000001010000020100000901000001010000030101
-002001000003010000020100000101000002010000010100000201000008010000020100
-000101000002010000010100000201000001010000020100000101000002010000030100
-000301000002010000010101000101000003010000e00602010006000000060a01000600
-0000060902020101030101010202060301000e0109320b01000701000000010000000100
-0002010300040100000501000002010000020100003a0100000801010000010000010100
-00000101000201000000010100030102000301030004010000030103002c010000630100
-00630100002201000613010006000000060c010006000000062301000603020201010303
-0101020206070d01000f0103000201000002010000010100000001000000010000080100
-000201000024010100040100000201000001010000020100000501000008010000020100
-000501000001010000090100000101000007010000070100000101000002010000040101
-00de0601010006000000060c010006000000060802020101030101010202060301000e01
-09320b0100630100000e010000050100004c010000630100006301000022010006140100
-06000000060a0100060000000624010006030202010103030101020206070d01000f0100
-000101000002010000020100000101000000010000000100000801000002010000260100
-000301040002010000000100000301030009010000000100000301030002010200030103
-00020102000401000004010300010100000201000003010000e00602010006000000060a
-010006000000060902020101030101010202060301000e0109320b0100630100000e0100
-00050100004c010000630100006301000022010006130100060000000600010006000100
-060001000600010006000100060001000600010006000000062301000603020201010303
-0101020206070d01000f0100000201000001010000020100000101000000010000000100
-000801050025010000030100000601000000010000020100000201000009010000000100
-000201000002010000050100000101000002010000050100000301000003010000020100
-00010100000201000003010000e00601010006000000060c010006000000060802020101
-030101010202060301000e0109320b0100630100000e010000050100004c010000630100
-006301000022010006140100060001000600010006000100060001000600010006000100
-06000100060000000624010006030202010103030101020206070d01000f010000020100
-0001010000020100000101000000010000000100000c0100000301010020010000030100
-000201000003010000030100000201000003010100040100000301000002010000010100
-000201000001010000020100000101000002010000030100000301000002010000010100
-000201000003010000e00602010006000000060a01000600000006090202010103010101
-0202060301000e0109320b01006301000063010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206070d01000f010000020100
-000201020003010000000100000d01000003010100200100000401020004010000040103
-000301010004010000040103000201020003010300020102000501010002010300010100
-000201000003010000e00601010006000000060c01000600000006080202010103010101
-0202060301000e0109320b01006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070d0100570100001b0100003c0100
-00e00602010006000000060a010006000000060902020101030101010202060301000e01
-0b340063010000630100006301000063010000220100061301000600040e060000000623
-010006030202010103030101020206070d010058010100170101003b010100e106010100
-06000000060c010006000000060802020101030101010202060301000e000b3501ff01b7
-06140100040e00000624010006030202010103030101020206070d0100ff009406020100
-06000000060a010006000000060902020101030101010202060301000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600006301000063
-0100006301000063010000220100061301000600040e0600000006230100060302020101
-03030101020206070d0100ff00940601010006000000060c010006000000060802020101
-030101010202060301000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000100006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070d0100ff00940602010006000000
-060a01000600000006090202010103010101020206030100060000000632010006000063
-010000630100006301000063010000220100061301000600040e06000000062301000603
-0202010103030101020206070d0100000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000020601010006000000
-060c01000600000006080202010103010101020206030100000006340100006301000063
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d01045801010478010104bc00010602010006000000060a0100060000000609
-020201010301010102020603010006000000061301000604010206150100060000630100
-00630100006301000063010000220100061301000600040e060000000623010006030202
-010103030101020206070d01000004560100047c010004ba010000010601010006000000
-060c01000600000006080202010103010101020206030100000006120102060301000602
-010006150100001f01000042010000120100001701020034010000630100006301000022
-010006140100040e00000624010006030202010103030101020206070d01040f01030417
-01040426010004060100041a010104040100043c01000413010004bb0001060201000600
-0000060a0100060000000609020201010301010102020603010006000000061301000603
-010006020100061401000600006301000012010000190100003401000063010000630100
-00220100061301000600040e060000000623010006030202010103030101020206070d01
-0000040e01000402010004160100040201000426010004210100044401000413010004ba
-010000010601010006000000060c01000600000006080202010103010101020206030100
-000006140100060301000602010006150100000701010000010000030102000201000000
-01010003010200030102003b010000080102000301010000010000020102000201000000
-010100020100000001010005010000030102000201000000010100260100006301000063
-01000022010006140100040e00000624010006030202010103030101020206070d01040f
-010004020100040201020402010004020100040c01000403010104200100040401020403
-010204030102040301020404010004040102040201000400010104030102040901000402
-010004020102040301020403010204030102040201040402010204020100040001010404
-010004bb00010602010006000000060a0100060000000609020201010301010102020603
-010006000000061301000606010006150100060000070100000001000000010000010100
-000201000001010100010100000401000002010000020100003a01000007010000020100
-000101000001010100010100000201000001010100010100000101010001010000040100
-000201000002010000010101000101000025010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206070d010000040e01000402
-010004010100040201000401010004020100040b01000404010104200100040601000402
-010004020100040101000402010004010100040201000401010404040100040201010401
-010004010100040201000408010004020100040101000402010004010100040201000401
-010004020100040101000402010004030100040301000402010004010101040101000403
-010004ba010000010601010006000000060c010006000000060802020101030101010202
-060301000000061401000605010006170100000701000000010000000100000501000001
-01000008010000060100003a010000070100000201000001010000020100000101000002
-010000010100000201000001010000020100000401000006010000010100000201000025
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d01040f01030402010004020100040101000400010004000100040b01000425
-010104070100040201000402010004010100040501000402010004030100040601000402
-010004020100040101000402010004080100040201000405010004010100040901000401
-0100040701000407010004010100040201000404010104b900010602010006000000060a
-010006000000060902020101030101010202060301000600000006130100060401000617
-0100060000070100000001000000010000020103000101000008010000030103003a0100
-000701000002010000010100000201000001010400010100000201000001010000020100
-000401000003010300010100000201000025010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206070d010000040e01000401
-01000402010004020100040101000400010004000100040b010004270100040601000402
-010004020100040201020402010404030100040601000402010004020100040101040409
-010004000100040301030402010204030103040201020404010004040103040101000402
-01000403010004ba010000010601010006000000060c0100060000000608020201010301
-010102020603010000000614010006030100060201000615010000070100000001000000
-0100000101000002010000010100000801000002010000020100003a0100000701000002
-010000010100000201000001010000050100000201000001010000020100000401000002
-01000002010000010100000201000025010000630100006301000022010006140100040e
-00000624010006030202010103030101020206070d01040f010004020100040101000402
-0100040101000400010004000100040a0100042801000406010004020100040201000405
-0100040101000407010004060100040201000402010004010100040d0100040001000402
-010004020100040501000401010004020100040501000403010004030100040201000401
-0100040201000403010004bb00010602010006000000060a010006000000060902020101
-030101010202060301000600000006110104060101040614010006000007010000000100
-00000100000101000002010000010100000801000002010000020100003a010000070100
-000201000001010000010101000101000002010000010100000201000001010100010100
-000401000002010000020100000101000002010000250100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d010000040e
-0100040201000401010004020100040101000400010004000100040a0100040501010420
-010004060100040201000402010004010100040201000401010004020100040301000406
-010004020100040201000401010004020100040301010404010004030100040201000401
-010004020100040101000402010004010100040201000403010004030100040201000401
-0100040201000403010004ba010000010601010006000000060c01000600000006080202
-010103010101020206030100000006340100000701000000010000000100000201030001
-01000008010000030103003a010000080102000301010000010000020102000201000002
-010000010100000001010005010000030103000101000002010000250100006301000063
-01000022010006140100040e00000624010006030202010103030101020206070d01040f
-010004020100040201020403010004000100040b01000405010104200100040601000403
-010204030102040301020404010004060100040201000402010004020102040401010404
-010004040103040201020403010304020102040501010402010304010100040201000403
-010004bb00010602010006000000060a0100060000000609020201010301010102020603
-0100060000000632010006000063010000230100003e0100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100000456
-01000406010004360100043c010004ba010000010601010006000000060c010006000000
-060802020101030101010202060301000000063401000063010000230100003e01000063
-0100006301000022010006140100040e0000062401000603020201010303010102020607
-0d0104580101040101000401010004340101043b010104bc00010602010006000000060a
-010006000000060902020101030101010202060301000600000006320100060000630100
-00230100003e0100006301000063010000220100061301000600040e0600000006230100
-06030202010103030101020206070d010000045c010104ff043101000001060101000600
-0000060c0100060000000608020201010301010102020603010000000634010000630100
-0063010000630100006301000022010006140100040e0000062401000603020201010303
-0101020206070d0104ff049200010602010006000000060a010006000000060902020101
-030101010202060301000600000006320100060000630100006301000063010000630100
-00220100061301000600040e060000000623010006030202010103030101020206070d01
-000004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010000010601010006000000060c01000600000006080202
-010103010101020206030100000006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010000630100006301000063010000630100002201000614
-0100040e00000624010006030202010103030101020206070d0100ff0094060201000600
-0000060a0100060000000609020201010301010102020603010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0100060001000600010006000100060001000600010006000100060001ff01b706130100
-0600040e060000000623010006030202010103030101020206070d010058010100710101
-00c50601010006000000060c010006000000060802020101030101010202060301000e36
-006301000063010000630100006301000022010006140100040e00000624010006030202
-010103030101020206070d01005701000075010000c40602010006000000060a01000600
-0000060902020101030101010202060301000e350b000063010000630100006301000063
-010000220100061301000600040e06000000062301000603020201010303010102020607
-0d01000f0103001901000004010200200100000d01000009010000170100002d01000013
-010000c40601010006000000060c01000600000006080202010103010101020206030100
-0e0109320b01006301000063010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d01000f01000002010000170101000301000002
-0100001f01000018010000170100002d01000013010000c40602010006000000060a0100
-06000000060902020101030101010202060301000e0109320b0100630100006301000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-020206070d01000f01000002010000020102000201000002010000080100000001000003
-010000020100000301010019010000030100000001010003010200030102000201000000
-010100030102000201000000010100030101000001000008010000020100000201020003
-01020003010200030102000201040002010200020100000001010004010000c406010100
-06000000060c010006000000060802020101030101010202060301000e01091301000904
-010209150b01006301000063010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d01000f01000002010000010100000201000001
-010000020100000a01000003010000020100000301010019010000030101000101000004
-010000020100000201000001010100010100000101000002010000010101000101000001
-010000010101000801000002010000010100000201000001010000020100000101000002
-0100000101000002010000030100000301000002010000010101000101000003010000c4
-0602010006000000060a010006000000060902020101030101010202060301000e010911
-0102090301000902010009140b0100170100004a01000007010000300102002601000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-020206070d01000f01030002010000020100000101000000010000000100000a01000004
-0102001e0101000401000008010000020100000501000002010000050100000101000005
-010000020100000801000002010000050100000101000009010000010100000701000007
-010000010100000201000004010100c20601010006000000060c01000600000006080202
-0101030101010202060301000e01091301000907010009140b0100170100004a01000007
-0100003201000026010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206070d01000f0100000101000002010000020100000101000000
-010000000100000a01000003010000020100001f01000003010000080100000201000005
-010000020100000201030001010000050100000201000009010000000100000301030002
-01020003010300020102000401000004010300010100000201000003010000c406020100
-06000000060a010006000000060902020101030101010202060301000e01091301000907
-010009140b01000701010000010000030102000201040002010200420100000701000000
-010100020100000001010003010200020101000001000002010100000100000301020002
-010000000101000501000003010200020100000001010018010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206070d01000f
-0100000201000001010000020100000101000000010000000100000a0100000301000002
-0100001f0100000301000008010000020100000501000002010000010100000201000001
-010000050100000201000009010000000100000201000002010000050100000101000002
-01000005010000030100000301000002010000010100000201000003010000c406010100
-06000000060c010006000000060802020101030101010202060301000e01091301000905
-010109150b01000701000000010000000100000101000002010000030100000301000002
-010000410100000701010001010000010101000101000001010000020100000101000000
-010000000100000101000000010000000100000101000002010000010101000101000004
-010000020100000201000001010100010100001701000063010000630100002201000614
-0100040e00000624010006030202010103030101020206070d01000f0100000201000001
-010000020100000101000000010000000100000a01000003010000020100000301010019
-010000030100000801000002010000020100000101000002010000010100000201000001
-010000050100000101010003010100040100000301000002010000010100000201000001
-010000020100000101000002010000030100000301000002010000010100000201000003
-010000c40602010006000000060a01000600000006090202010103010101020206030100
-0e01091301000907010009140b0100070100000001000000010000050100000301000003
-010000450100000701000002010000010100000501000002010000010100000001000000
-010000010100000001000000010000050100000101000002010000040100000601000001
-01000002010000170100006301000063010000220100061301000600040e060000000623
-010006030202010103030101020206070d01000f01000002010000020102000301000000
-010000090104000201020004010100190100000301000008010000030102000201000002
-010000020103000101000006010100000100000301010004010000040103000201020003
-010300020102000501010002010300010100000201000003010000c40601010006000000
-060c010006000000060802020101030101010202060301000e0109130100090701000914
-0b0100070100000001000000010000020103000301000004010200420100000701000002
-010000010100000501000002010000010100000001000000010000010100000001000000
-010000020103000101000002010000040100000301030001010000020100001701000063
-0100006301000022010006140100040e0000062401000603020201010303010102020607
-0d010057010000370100003c010000c40602010006000000060a01000600000006090202
-0101030101010202060301000e0109130100090301000902010009140b01000701000000
-010000000100000101000002010000030100000701000041010000070100000201000001
-010000050100000201000001010000000100000001000001010000000100000001000001
-010000020100000101000002010000040100000201000002010000010100000201000017
-0100006301000063010000220100061301000600040e0600000006230100060302020101
-03030101020206070d010058010100330101003b010100c50601010006000000060c0100
-06000000060802020101030101010202060301000e01091101040902010209150b010007
-010000000100000001000001010000020100000301000003010000020100004101000007
-010100010100000101000005010000020100000101000000010000000100000101000000
-010000000100000101000002010000010101000101000004010000020100000201000001
-0100000201000017010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206070d0100ff00940602010006000000060a0100060000000609
-02020101030101010202060301000e0109320b0100070100000001000000010000020103
-000401010002010200420100000701000000010100020100000601020002010000000100
-000001000001010000000100000001000002010300010100000001010005010000030103
-000101000002010000170100006301000063010000220100061301000600040e06000000
-0623010006030202010103030101020206070d0100ff00940601010006000000060c0100
-06000000060802020101030101010202060301000e0109320b0100630100003101000030
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d0100ff00940602010006000000060a01000600000006090202010103010101
-0202060301000e0109320b01006301000031010000300100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-0601010006000000060c010006000000060802020101030101010202060301000e010932
-0b0100630100003101000030010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d01005801010071010100c50602010006000000
-060a010006000000060902020101030101010202060301000e0109320b01006301000063
-0100006301000063010000220100061301000600040e0600000006230100060302020101
-03030101020206070d01005701000075010000c40601010006000000060c010006000000
-060802020101030101010202060301000e0109320b010063010000630100006301000063
-01000022010006140100040e00000624010006030202010103030101020206070d01000f
-0103001801020004010100200100006001000013010000c40602010006000000060a0100
-06000000060902020101030101010202060301000e010b34006301000063010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06070d01000f01000002010000160100000201000002010000010100001f010000600100
-0013010000c40601010006000000060c0100060000000608020201010301010102020603
-01000e000b3501ff01b706140100040e0000062401000603020201010303010102020607
-0d01000f010000020100000201020002010000020100000c010000020100000101000003
-010100190100000401020002010000020100000201020003010200020100000001010002
-010000000101000301020009010000020100000201020003010200030102000301020002
-01040002010200020100000001010004010000c40602010006000000060a010006000000
-060902020101030101010202060301000e36006301000063010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206070d01000f
-01000002010000010100000201000001010000020100000c010000020100000101000003
-010100190100000301000002010000010100000201000001010000020100000101000002
-010000010101000101000001010100010100000101000002010000080100000201000001
-010000020100000101000002010000010100000201000001010000020100000301000003
-01000002010000010101000101000003010000c40601010006000000060c010006000000
-060802020101030101010202060301000e350b0000630100006301000063010000630100
-0022010006140100040e00000624010006030202010103030101020206070d01000f0103
-0002010000020100000101000000010000000100000b01000003010000010100001d0101
-000401000005010000020100000101000009010000010100000201000001010000020100
-000101000002010000080100000201000005010000010100000901000001010000070100
-0007010000010100000201000004010100c20602010006000000060a0100060000000609
-02020101030101010202060301000e0109320b0100630100006301000063010000630100
-00220100061301000600040e060000000623010006030202010103030101020206070d01
-000f0100000101000002010000020100000101000000010000000100000a010000040100
-00010100001f010000040102000201000002010000020102000301030001010000020100
-000101000002010000010104000901000000010000030103000201020003010300020102
-000401000004010300010100000201000003010000c40601010006000000060c01000600
-0000060802020101030101010202060301000e0109320b01006301000063010000630100
-006301000022010006140100040e00000624010006030202010103030101020206070d01
-000f01000002010000010100000201000001010000000100000001000009010000050100
-00010100001f010000070100000101000002010000050100000101000002010000010100
-00020100000101000002010000010100000d010000000100000201000002010000050100
-000101000002010000050100000301000003010000020100000101000002010000030100
-00c40602010006000000060a010006000000060902020101030101010202060301000e01
-091301000906010009150b01006301000063010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206070d01000f010000020100
-000101000002010000010100000001000000010000080100000601000001010000030101
-001901000003010000020100000101000001010100010100000201000001010000020100
-000101000002010000010100000201000001010000020100000301010004010000030100
-000201000001010000020100000101000002010000010100000201000003010000030100
-0002010000010100000201000003010000c40601010006000000060c0100060000000608
-02020101030101010202060301000e01091101020905010109150b010011010000500100
-001e0100001801000029010000630100006301000022010006140100040e000006240100
-06030202010103030101020206070d01000f010000020100000201020003010000000100
-000901040003010100040101001901000004010200030101000001000002010200030103
-000101000002010000010100000201000002010200040101000401000004010300020102
-0003010300020102000501010002010300010100000201000003010000c4060201000600
-0000060a010006000000060902020101030101010202060301000e010913010009040100
-0900010009150b0100630100001e01000018010000290100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100570100
-00370100003c010000c40601010006000000060c01000600000006080202010103010101
-0202060301000e0109130100090401000900010009150b01000701000000010100030102
-000201000000010100030102004201000008010100000100000101000002010000020102
-000201040002010200020100000201000002010200020100000001010003010200020100
-0000010100030101000001000010010000630100006301000022010006140100040e0000
-0624010006030202010103030101020206070d010058010100330101003b010100c50602
-010006000000060a010006000000060902020101030101010202060301000e0109130100
-090301000901010009150b01000701010001010000040100000201010001010000010100
-000201000041010000070100000101010001010000020100000101000002010000030100
-000301000002010000010100000201000001010000020100000101010001010000010100
-000201000001010100010100000101000001010100100100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-0601010006000000060c010006000000060802020101030101010202060301000e010913
-0100090201000902010009150b0100070100000201000004010000020100000201000005
-010000410100000701000002010000010100000201000001010000070100000701000001
-010000020100000101000005010000020100000101000002010000010100000501000002
-01000010010000630100006301000022010006140100040e000006240100060302020101
-03030101020206070d0100ff00940602010006000000060a010006000000060902020101
-030101010202060301000e01091301000902010509140b01000701000002010000040100
-000201000002010000020103004101000007010000020100000101000002010000020102
-000401000004010300020100000001000003010200020100000201000001010400010100
-000501000002010000100100006301000063010000220100061301000600040e06000000
-0623010006030202010103030101020206070d0100ff00940601010006000000060c0100
-06000000060802020101030101010202060301000e01091301000906010009150b010007
-010000020100000401000002010000020100000101000002010000410100000701000002
-010000010100000201000005010000030100000301000002010000020100000001000006
-010000010100000201000001010000050100000501000002010000100100006301000063
-01000022010006140100040e00000624010006030202010103030101020206070d0100ff
-00940602010006000000060a010006000000060902020101030101010202060301000e01
-091101040903010209140b01000701000002010000040100000201000002010000010100
-000201000041010000070100000101010001010000010101000101000002010000030100
-000301000002010000030100000301000002010000010101000101000001010000020100
-00010100000501000001010100100100006301000063010000220100061301000600040e
-060000000623010006030202010103030101020206070d0100ff00940601010006000000
-060c010006000000060802020101030101010202060301000e0109320b01000701000002
-010000040100000201000002010000020103004101000008010100000100000201010000
-010000020102000501010002010300030100000401020002010000000101000301020002
-010000060101000001000010010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d0100ff00940602010006000000060a01000600
-0000060902020101030101010202060301000e0109320b0100630100000b010000440100
-00100100006301000063010000220100061301000600040e060000000623010006030202
-010103030101020206070d0100ff00940601010006000000060c01000600000006080202
-0101030101010202060301000e0109320b01006301000007010000020100004001000002
-01000010010000630100006301000022010006140100040e000006240100060302020101
-03030101020206070d0100ff00940602010006000000060a010006000000060902020101
-030101010202060301000e0109320b010063010000080102004201020011010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06070d0100ff00940601010006000000060c010006000000060802020101030101010202
-060301000e0109320b01006301000063010000630100006301000022010006140100040e
-00000624010006030202010103030101020206070d0100ff00940602010006000000060a
-010006000000060902020101030101010202060301000e0109320b010063010000630100
-006301000063010000220100061301000600040e06000000062301000603020201010303
-0101020206070d0100ff00940601010006000000060c0100060000000608020201010301
-01010202060301000e010b34006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206070d0100ff00940602010006000000
-060a010006000000060902020101030101010202060301000e000b3501ff01b706130100
-0600040e060000000623010006030202010103030101020206070d0100ff009406010100
-06000000060c010006000000060802020101030101010202060301000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600006301000063
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206070d0100ff00940602010006000000060a01000600000006090202010103010101
-020206030100000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060001000063010000630100006301000063010000220100061301000600040e
-060000000623010006030202010103030101020206070d0100ff00940601010006000000
-060c01000600000006080202010103010101020206030100060000000632010006000063
-01000063010000630100006301000022010006140100040e000006240100060302020101
-03030101020206070d0100ff00940602010006000000060a010006000000060902020101
-030101010202060301000000063401000063010000630100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-0601010006000000060c0100060000000608020201010301010102020603010006000000
-061301000603010406140100060000630100006301000063010000630100002201000614
-0100040e00000624010006030202010103030101020206070d0100ff0094060201000600
-0000060a0100060000000609020201010301010102020603010000000612010206030100
-06190100000f010200030102004901000007010000230100000b010200030102001f0100
-006301000063010000220100061301000600040e06000000062301000603020201010303
-0101020206070d0100ff00940601010006000000060c0100060000000608020201010301
-010102020603010006000000061301000603010006180100060000110100000501000049
-01000007010000230100000d010000050100001f01000063010000630100002201000614
-0100040e00000624010006030202010103030101020206070d0100ff0094060201000600
-0000060a0100060000000609020201010301010102020603010000000614010006030100
-061901000008010200050100000501000003010200420100000701000000010100030102
-000201000000010100020100000001010003010200020104000101000002010000040100
-00050100001f0100006301000063010000220100061301000600040e0600000006230100
-06030202010103030101020206070d0100ff009406010100060000000600010006000100
-060001000600010006000100060001000600010006000000060802020101030101010202
-060301000600000006130100060301030615010006000007010000020100000401000005
-010000020100000201000041010000070101000101000001010000020100000101010001
-010000010101000101000001010000020100000301000003010000020100000401000005
-0100001f010000630100006301000022010006140100040e000006240100060302020101
-03030101020206070d0100ff009406020100060001000600010006000100060001000600
-010006000100060001000600000006090202010103010101020206030100000006140100
-060701000615010000070100000201000004010000050100000201000002010000410100
-000701000002010000010100000201000001010000050100000201000001010000070100
-00030100000201000004010000050100001f010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206070d0100ff009406010100
-061000000608020201010301010102020603010006000000061301000607010006140100
-060000070100000201000004010000050100000201040041010000070100000201000001
-010000020100000101000005010000020100000201020004010000030100000201000004
-010000050100001f010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206070d0100ff0094060201000600000006000000060000000600
-000006000000060000000600000006000000060902020101030101010202060301000000
-061401000602010006030100061501000007010000020100000401000005010000020100
-004501000007010000020100000101000002010000010100000501000002010000050100
-0003010000030100000201000004010000050100001f0100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-060101000602000006000000060000000600000006000000060000000600010006000000
-060802020101030101010202060301000600000006110104060101030615010006000007
-010000020100000401000005010000020100000201000041010000070100000201000001
-010000020100000101000005010000020100000101000002010000030100000301000001
-01010004010000050100001f010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d0100ff00940602010006000000060a01000600
-000006090202010103010101020206030100000006340100000801020005010000050100
-000301020042010000070100000201000002010200020100000501000002010000020102
-0005010100020101000001000004010000050100001f0100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-060101000602000006080100060200000608020201010301010102020603010006000000
-063201000600006301000063010000630100006301000022010006140100040e00000624
-010006030202010103030101020206070d0100ff00940602010006020000060601000602
-000006090202010103010101020206030100000006340100006301000063010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06070d0100ff009406010100060400000606010006020000060802020101030101010202
-060301000600000006320100060000630100006301000063010000630100002201000614
-0100040e00000624010006030202010103030101020206070d0100ff0094060201000602
-000006060100060200000609020201010301010102020603010000000634010000630100
-00630100006301000063010000220100061301000600040e060000000623010006030202
-010103030101020206070d0100ff00940601010006040000060401000604000006080202
-010103010101020206030100060000000632010006000063010000630100006301000063
-01000022010006140100040e00000624010006030202010103030101020206070d0100ff
-009406020100060400000602010006040000060902020101030101010202060301000000
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-0063010000630100006301000063010000220100061301000600040e0600000006230100
-06030202010103030101020206070d0100ff009406010100060600000602010006040000
-060802020101030101010202060301000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001ff01b706140100040e0000062401000603
-0202010103030101020206070d0100ff0094060201000604000006020100060400000609
-02020101030101010202060301000e360063010000630100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206070d0100ff0094
-06010100060600000600010006060000060802020101030101010202060301000e350b00
-006301000063010000630100006301000022010006140100040e00000624010006030202
-010103030101020206070d0100ff00940602010006060100060600000609020201010301
-01010202060301000e0109320b0100630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206070d0100ff00940601
-01000608010006060000060802020101030101010202060301000e0109320b0100630100
-0063010000630100006301000022010006140100040e0000062401000603020201010303
-0101020206070d0000ff0095060201000606010006060000060902020101030101010202
-060301000e01091301000905010209140b01006301000063010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206ff06a00100
-060000000600000006000000060000000600000006000000060000000600000006000000
-060802020101030101010202060301000e01091101020904010009170b0100170100000d
-010000020100003701000008010200050100000301020005010000090100000d01020026
-010000630100006301000022010006140100040e00000624010006030202010103030101
-020206ff06a1000006000000060000000600000006000000060000000600000006000000
-06000000060902020101030101010202060301000e01091301000903010009180b010017
-01000011010000370100000a0100000c010000100100000f010000260100006301000063
-010000220100061301000600040e06000000062301000603020201010303010102020606
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000618
-02020101030101010202060301000e01091301000903010009180b010007010000000101
-0003010200020104000101000000010100030102000201000001010000340100000a0100
-000301020005010000030102000301020002010000000101000301020005010000020101
-000001000003010200020100000001010011010000630100006301000022010006140100
-040e00000624010006030202010103030101020206050100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000000061702020101030101010202
-060301000e01091301000903010309150b01000701010001010000010100000201000003
-0100000301010001010000040100000201000000010000350100000a0100000501000005
-010000050100000201000002010000010101000101000001010000020100000401000002
-010000000100000001000001010000020100000101010001010000100100006301000063
-010000220100061301000600040e06000000062301000603020201010303010102020606
-010006100000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006020000060c0000061802020101030101010202060301000e010913010009030100
-0902010009140b0100070100000201000005010000030100000301000008010000020101
-00360100000a010000050100000501000005010000020100000201000001010000020100
-000101000002010000040100000201000000010000000100000101000002010000010100
-000201000010010000630100006301000022010006140100040e00000624010006030202
-010103030101020206050100060c00000600010006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-0600000006000000060000000600000006000000060001000600000006000000060c0000
-061702020101030101010202060301000e0109130100090301000902010009140b010007
-010000020100000201030003010000030100000801000002010100360100000a01000005
-010000050100000501000002010400010100000201000001010000020100000401000002
-010000000100000001000001010400010100000201000010010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206060100060a
-0000060001000602000006ff067601000602000006000000060000000608000006180202
-0101030101010202060301000e0109130100090301000902010009140b01000701000002
-01000001010000020100000301000003010000080100000201000000010000350100000a
-010000050100000501000005010000020100000501000002010000010100000201000004
-010000020100000001000000010000010100000501000002010000100100006301000063
-01000022010006140100040e000006240100060302020101030301010202060501000608
-000006000000060201000600000006ff0678010006000000060200000600000006080000
-061702020101030101010202060301000e01091101040902010209150b01000701010001
-01000001010000020100000301000003010000080100000201000001010000340100000a
-010000050100000501000005010000020100000201000001010000020100000101000002
-010000040100000201000000010000000100000101000002010000010100000201000010
-0100006301000063010000220100061301000600040e0600000006230100060302020101
-030301010202060601000606000006000000060201000602000006ff0676010006020000
-060400000600000006040000061802020101030101010202060301000e0109320b010007
-01000000010100030103000401010001010000080100000201000002010000330100000a
-010000050100000501000005010000030102000201000002010000020102000501000002
-010000000100000001000002010200020100000201000010010000630100006301000022
-010006140100040e00000624010006030202010103030101020206050100060400000600
-0000060601000600000006ff067801000600000006060000060000000604000006170202
-0101030101010202060301000e0109320b0100070100005a0100001f0100004201000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-0202060601000602000006000000060601000602000006ff067601000602000006080000
-0600000006000000061802020101030101010202060301000e0109320b0100070100005a
-0100001c0100000101000042010000630100006301000022010006140100040e00000624
-0100060302020101030301010202060501000600010006000100060a01000600000006ff
-0678010006000000060a0100060001000600000006170202010103010101020206030100
-0e0109320b0100070100005a0100001d0101004301000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206060100060201000600
-0100060601000602000006ff067601000602000006080100060001000600000006180202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-010006140100040e00000624010006030202010103030101020206050100060401000600
-0100060601000600000006ff067801000600000006060100060001000604000006170202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-0100061301000600040e0600000006230100060302020101030301010202060601000606
-010006000100060201000602000006ff0676010006020000060401000600010006040000
-061802020101030101010202060301000e010b3400630100006301000063010000630100
-0022010006140100040e0000062401000603020201010303010102020605010006080100
-06000100060201000600000006ff06780100060000000602010006000100060800000617
-02020101030101010202060301000e000b3501ff01b7061301000600040e060000000623
-010006030202010103030101020206060100060a0100060001000602000006ff06760100
-060200000600010006000100060800000618020201010301010102020603010010360063
-01000063010000630100006301000022010006140100040e000006240100060302020101
-03030101020206050100060c010006000100060000000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600000006000100060c00000617
-020201010301010102020603010010350f00006301000063010000630100006301000022
-0100061301000600040e0600000006230100060302020101030301010202060601000610
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000602
-0100060c000006180202010103010101020206030100100108320f010063010000630100
-00630100006301000022010006140100040e000006240100060302020101030301010202
-060501000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-0600000006170202010103010101020206030100100108320f0100630100006301000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-020206060000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-0000061802020101030101010202060301001001081301000803010408140f0100630100
-0063010000630100006301000022010006140100040e0000062401000603020201010303
-0101020206ff06bc02020101030101010202060301001001081101020803010008020100
-08140f01006301000010010000200102002d010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206ff06bc0202010103010101
-0202060301001001081301000806010008150f01006301000010010000220100002d0100
-00630100006301000022010006140100040e000006240100060302020101030301010202
-06ff06bc02020101030101010202060301001001081301000806010008150f0100070100
-000001010003010200020100000001010049010000080102000201040001010000020100
-000101000000010100030102000201000000010100050100000301020002010000000101
-001f0100006301000063010000220100061301000600040e060000000623010006030202
-010103030101020206ff06bc020201010301010102020603010010010813010008060100
-08150f010007010100010100000101000002010000010101000101000048010000070100
-000201000003010000030100000201000001010100010100000101000002010000010101
-000101000004010000020100000201000001010100010100001e01000063010000630100
-0022010006140100040e00000624010006030202010103030101020206ff06bc02020101
-030101010202060301001001081301000806010008150f01000701000002010000010100
-0002010000010100004c0100000701000007010000030100000201000001010000050100
-00020100000101000002010000040100000601000001010000020100001e010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06ff06bc02020101030101010202060301001001081301000805010008160f0100070100
-000201000001010400010100004c01000008010200040100000301000002010000010100
-00050104000101000002010000040100000301030001010000020100001e010000630100
-006301000022010006140100040e00000624010006030202010103030101020206ff06bc
-02020101030101010202060301001001081301000805010008160f010007010000020100
-0001010000050100004c0100000b01000003010000030100000201000001010000050100
-00050100000201000004010000020100000201000001010000020100001e010000630100
-0063010000220100061301000600040e0600000006230100060302020101030301010202
-06ff06bc02020101030101010202060301001001081101040803010008160f0100070101
-00010100000101000002010000010100004c010000070100000201000003010000030100
-000101010001010000050100000201000001010100010100000401000002010000020100
-0001010000020100001e010000630100006301000022010006140100040e000006240100
-06030202010103030101020206ff06bc0202010103010101020206030100100108320f01
-00070100000001010003010200020100004c010000080102000501010002010100000100
-0001010000060102000201000000010100050100000301030001010000020100001e0100
-006301000063010000220100061301000600040e06000000062301000603020201010303
-0101020206ff06bc0202010103010101020206030100100108320f0100070100005a0100
-002a01000037010000630100006301000022010006140100040e00000624010006030202
-010103030101020206ff06bc0202010103010101020206030100100108320f0100070100
-005a0100002a010000370100006301000063010000220100061301000600040e06000000
-0623010006030202010103030101020206ff06bc02020101030101010202060301001001
-08320f0100070100005a0100002a01000037010000630100006301000022010006140100
-040e00000624010006030202010103030101020206ff06bc020201010301010102020603
-0100100108320f010063010000630100006301000063010000220100061301000600040e
-060000000623010006030202010103030101020206ff06bc020201010301010102020603
-0100100108320f01006301000063010000630100006301000022010006140100040e0000
-0624010006030202010103030101020206ff06bc02020101030101010202060301001001
-0f340063010000630100006301000063010000220100061301000600040e060000000623
-010006030202010103030101020206ff06bc020201010301010102020603010010000f35
-01ff01b706140100040e00000624010006030202010103030101020206ff06bc02020101
-030101010202060301000e36006301000063010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206ff06bc0202010103010101
-0202060301000e350b00006301000063010000630100006301000022010006140100040e
-00000624010006030202010103030101020206ff06bc0202010103010101020206030100
-0e0109320b010063010000630100006301000063010000220100061301000600040e0600
-00000623010006030202010103030101020206410100060a010006ff066d020201010301
-01010202060301000e0109320b0100630100006301000063010000630100002201000614
-0100040e0000062401000603020201010303010102020607010206100100060801000612
-010006050100060c0100060d0101061a010006ff06400202010103010101020206030100
-0e01091301000904010209150b0100630100006301000063010000630100002201000613
-01000600040e06000000062301000603020201010303010102020606010006020100060f
-0100061c010006050100060c0100060c0100061c010006ff064002020101030101010202
-060301000e0109110102090301000902010009140b01001101000009010000170100002c
-0100002c01000035010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206060100060d0102060201000600010106030102060301020603
-010206020104060201000605010206050100060b01000604010206020100060201000601
-010006000101060301010600010006ff064002020101030101010202060301000e010913
-0100090301000902010009140b01001c010000170100002c0100002c0100003501000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-020206060100060c01000602010006010101060101000604010006020100060201000601
-010006020100060301000604010006040100060201000604010006090104060101000602
-010006010100060201000601010106010100060101000601010106ff0640020201010301
-01010202060301000e0109130100090301000902010009140b0100070100000001010003
-01020003010200020100000001010003010200020100000001010003010100000100002c
-010000070100000201000002010200030102000301020003010200020104000201020002
-0100000001010026010000630100006301000022010006140100040e0000062401000603
-020201010303010102020606010306090100060201000601010006020100060401000602
-0100060201000601010006070100060401000604010006080100060b0100060301000602
-010006010100060201000601010006020100060101000602010006ff0640020201010301
-01010202060301000e01091301000904010209150b010007010100010100000401000002
-010000020100000101010001010000010100000201000001010100010100000101000001
-0101002c0100000701000002010000010100000201000001010000020100000101000002
-010000010100000201000003010000030100000201000001010100010100002501000063
-01000063010000220100061301000600040e060000000623010006030202010103030101
-020206060100060201000608010006020100060101000602010006040100060201040601
-010006070100060401000605010206050100060b01000603010006020100060101000602
-01000601010006020100060101000602010006ff06400202010103010101020206030100
-0e0109130100090301000902010009140b01000701000008010000020100000501000002
-010000050100000101000005010000020100002c01000007010000020100000501000001
-010000090100000101000007010000070100000101000002010000250100006301000063
-01000022010006140100040e000006240100060302020101030301010202060601000602
-010006080100060201000601010006020100060401000602010006050100060701000604
-01000608010006040100060b010006030100060201000601010006020100060101000602
-0100060101000602010006ff064002020101030101010202060301000e01091301000903
-01000902010009140b010007010000080100000201000005010000020100000201030001
-01000005010000020100002c010000080100000001000003010300020102000301030002
-010200040100000401030001010000020100002501000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206060100060201000608
-010006020100060101010601010006040100060201000602010006010100060201000603
-010006050100060301000602010006030100060c01000603010006020100060101000601
-01010601010006020100060101000601010106ff06400202010103010101020206030100
-0e0109130100090301000902010009140b01000701000008010000020100000501000002
-01000001010000020100000101000005010000020100002c010000080100000001000002
-010000020100000501000001010000020100000501000003010000030100000201000001
-0100000201000025010000630100006301000022010006140100040e0000062401000603
-0202010103030101020206070102060a0102060201000600010106050100060301020603
-010206050101060301000604010206040100060c01000604010206030101060001000601
-010006020100060201010600010006ff064002020101030101010202060301000e010911
-01040902010209150b010007010000080100000201000002010000010100000201000001
-010000020100000101000005010000010101002c01000009010000030100000201000001
-010000020100000101000002010000010100000201000003010000030100000201000001
-01000002010000250100006301000063010000220100061301000600040e060000000623
-010006030202010103030101020206250100061a0100060a010006ff066d020201010301
-01010202060301000e0109320b0100070100000801000003010200020100000201000002
-0103000101000006010100000100002c0100000901000004010300020102000301030002
-010200050101000201030001010000020100002501000063010000630100002201000614
-0100040e000006240100060302020101030301010202062201000601010006ff06950202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-0100061301000600040e06000000062301000603020201010303010102020623010106ff
-069602020101030101010202060301000e0109320b010063010000630100006301000063
-01000022010006140100040e00000624010006030202010103030101020206ff06bc0202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-0100061301000600040e060000000623010006030202010103030101020206ff06bc0202
-0101030101010202060301000e0109320b01006301000063010000630100006301000022
-010006140100040e00000624010006030202010103030101020206ff06bc020201010301
-01010202060301000e0109320b0100630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103030101020206ff06bc020201010301
-01010202060301000e010b34006301000063010000630100006301000022010006140100
-040e00000624010006030202010103030101020206ff06bc020201010301010102020603
-01000e000b3501ff01b7061301000600040e060000000623010006030202010103030101
-020206ff06bc020201010301010102020603010010360063010000630100006301000063
-01000022010006140100040e00000624010006030202010103030101020206ff06bc0202
-01010301010102020603010010350f000063010000630100006301000063010000220100
-061301000600040e060000000623010006030202010103030101020206ff06bc02020101
-03010101020206030100100108320f010063010000630100006301000063010000220100
-06140100040e00000624010006030202010103030101020206ff06bc0202010103010101
-020206030100100108320f01006301000063010000630100006301000022010006130100
-0600040e060000000623010006030202010103030101020206ff06bc0202010103010101
-0202060301001001081301000804010208150f0100630100006301000063010000630100
-0022010006140100040e0000062401000603020201010303000406ff06bc000403010101
-020206030100100108110102080301000802010008140f01001001000006010000490100
-000e0100001c0100000b010200030102001f010000630100006301000022010006130100
-0600040e0600000006230100060302020101030300000202050006ff06bc000002020500
-03010101020206030100100108130100080301000802010008140f010010010000510100
-000e0100001c0100000d010000050100001f010000630100006301000022010006140100
-040e000006240100060302020101030300000202050006ff06bc00000202050003010101
-020206030100100108130100080301000802010008140f01000801020002010400020102
-000201000000010100030102003b01000008010200020100000101000003010200020100
-00000101000301020002010400010100000201000004010000050100001f010000630100
-0063010000220100061301000600040e0600000006230100060302020101030300000202
-050006ff06bc000002020500030101010202060301001001081301000803010008020100
-08140f010007010000020100000301000006010000020101000101000001010000020100
-003a01000007010000020100000101000000010000030100000201000001010100010100
-00010100000201000003010000030100000201000004010000050100001f010000630100
-006301000022010006140100040e000006240100060302020101030300000202050006ff
-06bc000002020500030101010202060301001001081301000804010308140f0100070100
-0007010000060100000201000002010000050100003a0100000701000005010100080100
-0001010000020100000101000007010000030100000201000004010000050100001f0100
-006301000063010000220100061301000600040e06000000062301000603020201010303
-00000202050006ff06bc0000020205000301010102020603010010010813010008070100
-08140f01000801020004010000060100000201000002010000020103003a010000080102
-000201010005010300010100000201000002010200040100000301000002010000040100
-00050100001f010000630100006301000022010006140100040e00000624010006030202
-01010303000002020500000502ff02b00006020205000301010102020603010010010813
-01000806010008150f01000b010000030100000601000002010000020100000101000002
-0100003a0100000b01000001010000000100000301000002010000010100000201000005
-01000003010000030100000201000004010000050100001f010000630100006301000022
-0100061301000600040e0600000006230100060302020101030300000208050002ff02b0
-000002080500030101010202060301001001081101040801010208160f01000701000002
-0100000301000006010000020100000201000001010000020100003a0100000701000002
-010000010100000101000002010000020100000101000002010000010100000201000003
-010000030100000101010004010000050100001f01000063010000630100002201000614
-0100040e000006240100060302020101030300000208050002ff02b00000020805000301
-0101020206030100100108320f0100080102000501010004010000020100000201000002
-0103003a0100000801020002010000020100000201030001010000020100000201020005
-010100020101000001000004010000050100001f01000063010000630100002201000613
-01000600040e0600000006230100060302020101030300000208050001ff01b000000208
-050003010101020206030100100108320f01006301000063010000630100006301000022
-010006140100040e00000624010006030202010103030000050901ff01b0000005090301
-0101020206030100100108320f0100630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103ff03cc010102020603010010010832
-0f01006301000063010000630100006301000022010006140100040e0000062401000603
-0202010103ff03cc0101020206030100100108320f010063010000630100006301000063
-010000220100061301000600040e060000000623010006030202010103ff03cc01010202
-06030100100108320f01006301000063010000630100006301000022010006140100040e
-00000624010006030202010103ff03cc010102020603010010010f340063010000630100
-006301000063010000220100061301000600040e060000000623010006030202010103ff
-03cc010102020603010010000f3501ff01b706140100040e000006240100060302020101
-03ff03cc01010202060301000e3600630100006301000063010000630100002201000613
-01000600040e060000000623010006030202010103ff03cc01010202060301000e350b00
-006301000063010000630100006301000022010006140100040e00000624010006030202
-010103ff03cc01010202060301000e0109320b0100630100006301000063010000630100
-00220100061301000600040e060000000623010006030202010103ff03cc010102020603
-01000e0109320b01006301000063010000630100006301000022010006140100040e0000
-0624010006030202010103ff03cc01010202060301000e01091201020903010209150b01
-0063010000630100006301000063010000220100061301000600040e0600000006230100
-06030202010103ff03cc01010202060301000e0109110100090201000901010009020100
-09140b0100630100002c01000035010000630100006301000022010006140100040e0000
-0624010006030202010103ff03cc01010202060301000e01091101000902010009010100
-0902010009140b0100630100002c01000035010000630100006301000022010006130100
-0600040e060000000623010006030202010103ff03cc01010202060301000e0109110100
-09020100090101000902010009140b010008010200020100000201000002010200030102
-0002010000000101000201000000010100030102002d0100000701000002010000020102
-000301020003010200030102000201040002010200020100000001010026010000630100
-006301000022010006140100040e00000624010006030202010103ff03cc010102020603
-01000e0109140100090201000902010009140b0100070100000201000001010000020100
-000101000002010000010100000201000001010100010100000101010001010000010100
-00020100002c010000070100000201000001010000020100000101000002010000010100
-000201000001010000020100000301000003010000020100000101010001010000250100
-006301000063010000220100061301000600040e060000000623010006030202010103ff
-03cc01010202060301000e0109130100090301000902010009140b010007010000050100
-000201000001010000090100000101000002010000010100000201000001010000020100
-002c01000007010000020100000501000001010000090100000101000007010000070100
-00010100000201000025010000630100006301000022010006140100040e000006240100
-06030202010103ff03cc01010202060301000e0109120100090401000902010009140b01
-000801020002010000020100000201020003010300010100000201000001010000020100
-00010104002c010000080100000001000003010300020102000301030002010200040100
-00040103000101000002010000250100006301000063010000220100061301000600040e
-060000000623010006030202010103ff03cc01010202060301000e010911010009020100
-090101000902010009140b01000b01000001010000020100000501000001010000020100
-000101000002010000010100000201000001010000300100000801000000010000020100
-000201000005010000010100000201000005010000030100000301000002010000010100
-000201000025010000630100006301000022010006140100040e00000624010006030202
-010103ff03cc01010202060301000e01091101040902010209150b010007010000020100
-000101000001010100010100000201000001010000020100000101000002010000010100
-000201000001010000020100002c01000009010000030100000201000001010000020100
-000101000002010000010100000201000003010000030100000201000001010000020100
-00250100006301000063010000220100061301000600040e060000000623010006030202
-010103ff03cc01010202060301000e0109320b0100080102000301010000010000020102
-000301030001010000020100000101000002010000020102002d01000009010000040103
-000201020003010300020102000501010002010300010100000201000025010000630100
-006301000022010006140100040e00000624010006030202010103ff03cc010102020603
-01000e0109320b010063010000630100006301000063010000220100061301000600040e
-060000000623010006030202010103ff03cc01010202060301000e0109320b0100630100
-0063010000630100006301000022010006140100040e00000624010006030202010103ff
-03cc01010202060301000e0109320b010063010000630100006301000063010000220100
-061301000600040e060000000623010006030202010103ff03cc01010202060301000e01
-09320b01006301000063010000630100006301000022010006140100040e000006240100
-06030202010103ff03cc01010202060301000e0109320b01006301000063010000630100
-0063010000220100061301000600040e060000000623010006030202010103ff03cc0101
-0202060301000e010b34006301000063010000630100006301000022010006140100040e
-00000624010006030202010103ff03cc01010202060301000e000b3501ff01b706130100
-0600040e060000000623010006030202010103ff03cc0101020206030100060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000630100
-006301000063010000630100002201000614010006000000060000000600000006000000
-060000000600000006000000060000000624010006030202010103ff03cc010102020603
-01ff01ef0613010006000000060000000600000006000000060000000600000006000000
-06000000060000000623010006030202010103ff03cc010102020603010006ff06ff0639
-010006030202010103ff03cc010102020603010006ff06ff0639010006030202010103ff
-03cc010102020603010006ff06ff0639010006030202010103ff03cc0101020206030100
-06ff06ff0639010006030202010103ff03cc010102020603010006ff06ff063901000603
-0202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc0101
-02020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff
-0639010006030202010103ff03cc01010202060301000649010006ff06ee010006030202
-010103ff03cc01010202060301000648010106ff06ee010006030202010103ff03cc0101
-020206030100064701000600010006ff06ee010006030202010103ff03cc010102020603
-01000649010006ff06ee010006030202010103ff03cc01010202060301000649010006ff
-06ee010006030202010103ff03cc01010202060301000649010006ff06ee010006030202
-010103ff03cc01010202060301000649010006ff06ee010006030202010103ff03cc0101
-0202060301000649010006ff06ee010006030202010103ff03cc01010202060301000647
-010406ff06ec010006030202010103ff03cc010102020603010006ff06ff063901000603
-0202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc0101
-02020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff
-0639010006030202010103ff03cc010102020603010006ff06ff06390100060302020101
-03ff03cc0101020206030100063801000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100064b010006030202010103ff
-03cc01010202060301000637010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0100060001000600010006000100060001000600010006000000064a0100060302020101
-03ff03cc0101020206030100063801000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-0600000004ff04940000064b010006030202010103ff03cc010102020603010006370100
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060004ff049406000000064a
-010006030202010103ff03cc01010202060301000638010006000000060c0000060c0100
-04ff04940000064b010006030202010103ff03cc01010202060301000637010006000000
-060c0100060c0100060004ff049406000000064a010006030202010103ff03cc01010202
-060301000638010006000000060c0000060c010004ff04940000064b0100060302020101
-03ff03cc01010202060301000637010006000000060c0100060c0100060004ff04940600
-0000064a010006030202010103ff03cc01010202060301000638010006000000060c0000
-060c010004ff04940000064b010006030202010103ff03cc010102020603010006370100
-06000000060c0100060c0100060004ff049406000000064a010006030202010103ff03cc
-01010202060301000638010006000000060c0000060c010004ff04940000064b01000603
-0202010103ff03cc01010202060301000637010006000000060c0100060c0100060004ff
-049406000000064a010006030202010103ff03cc01010202060301000638010006000000
-060c0000060c010004ff04940000064b010006030202010103ff03cc0101020206030100
-0637010006000000060c0100060c0100060004ff049406000000064a0100060302020101
-03ff03cc01010202060301000638010006000000060c0000060c010004ff04940000064b
-010006030202010103ff03cc010102020603010006370100060000000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060004ff049406000000064a010006030202010103ff03cc
-010102020603010006380100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-04ff04940000064b010006030202010103ff03cc01010202060301000637010006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-0600000006000000064a010006030202010103ff03cc0101020206030100063800000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000064b010006030202010103ff03cc010102020603010006ff06ff06390100
-06030202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc
-010102020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff
-06ff0639010006030202010103ff03cc010102020603010006ff06ff0639010006030202
-010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc01010202
-0603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff0639
-010006030202010103ff03cc010102020603010006ff06ff0639010006030202010103ff
-03cc010102020603010006ff06ff0639010006030202010103ff03cc0101020206030100
-06ff06ff0639010006030202010103ff03cc010102020603010006ff06ff063901000603
-0202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc0101
-02020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff
-0639010006030202010103ff03cc010102020603010006ff06ff06390100060302020101
-03ff03cc010102020603010006ff06ff0639010006030202010103ff03cc010102020603
-010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff06390100
-06030202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc
-010102020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff
-06ff0639010006030202010103ff03cc010102020603010006ff06ff0639010006030202
-010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc01010202
-0603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff0639
-010006030202010103ff03cc010102020603010006ff06ff0639010006030202010103ff
-03cc010102020603010006ff06ff0639010006030202010103ff03cc0101020206030100
-06ff06ff0639010006030202010103ff03cc010102020603010006ff06ff063901000603
-0202010103ff03cc010102020603010006ff06ff0639010006030202010103ff03cc0101
-02020603010006ff06ff0639010006030202010103ff03cc010102020603010006ff06ff
-0639010006030202010103ff03cc00040603010006ff06ff063901000603000403ff03cc
-000002020500060301ff01ff013b060300000202050003ff03cc00000202050006ff06ff
-064300000202050003ff03cc00000202050006ff06ff064300000202050003ff03cc0000
-0202050006ff06ff064300000202050003ff03cc00000202050006ff06ff064300000202
-050003ff03cc000002020500000502ff02ff023700060202050003ff03cc000002080500
-02ff02ff023700000208050003ff03cc00000208050002ff02ff023700000208050003ff
-03cc00000208050001ff01ff013700000208050003ff03cc0000050901ff01ff01370000
-050903ff03ff03ff03ff03ff03ff03ff03ff0337
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 34 400 249
-%%EOF
diff --git a/lib/tv/doc/src/tv_search_window.gif b/lib/tv/doc/src/tv_search_window.gif
deleted file mode 100644
index d6e72dda2f..0000000000
--- a/lib/tv/doc/src/tv_search_window.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_search_window.ps b/lib/tv/doc/src/tv_search_window.ps
deleted file mode 100644
index a6dd2ef9fc..0000000000
--- a/lib/tv/doc/src/tv_search_window.ps
+++ /dev/null
@@ -1,975 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_search_window.eps)
-%%CreationDate: (Mon Mar 19 17:15:21 2001)
-%%BoundingBox: 0 0 228 183
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 228 183
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-228.000000 183.000000
-12
-455 365
-1
-0
-0
-8
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-aa2455
-999999
-000a01ff01b0000b0208040001ff01b000000208040000000208040002ff02b000000208
-0400000002080400020000ff00ad040002000000020804000000020204060200000004ff
-04ad020000000405020204000000020204000209000d02ff02a400000202040000000202
-040002080000020d0400029001030211010302330101021501010206010102a100000202
-040000000202040002080000020d04000290010102020107020001010203010102010101
-020e010302200101020c0103020401010206010102110100028e00000202040000000202
-040002080000020d04000290010102050101020301010203010102010101020d01010201
-0101021f0101020b0101020101010203010102190101028e000002020400000002020400
-0208000002020406020304000290010102050101020301010203010102010101020d0101
-020601030203010302020101020001010201010302020101020001010207010102030101
-020201010200010102030101020201030203010302000104028c00000202040000000403
-020800000202040003040000020304000290010102050101020401010202010002020101
-020d01020204010102010101020101010201010102010101020001010200010102010101
-020101020200010102060101020301010202010202000101020201010201010102010101
-020101010201010102000101028e000004030101020b0000020304000302000002040400
-0290010102050101020401010201010102020101020e0103020201010201010102050101
-020101020202010102050101020101010206010102030101020201010201010102020101
-0201010102010101020101010204010102910103020b0000020304000302000002040400
-029001010205010102050101020001000203010102100102020101050202010402010101
-020301010205010102010101020601010203010102020101020101010202010102010105
-020101010204010102910103020b00000204040003000000020504000290010102050101
-020501030203010102110101020101010205010102010101020101010203010102050101
-020101010206010102030101020201010201010102020101020101010205010102040101
-02910103020b000002040400030000000205040002900101020501010206010102040101
-020d01010201010102010101020201000201010102010101020101010203010102020100
-020101010201010102070101020101010203010102010101020201010201010102020100
-02010101020201000200010102910103020b000002050000020604000290010102050101
-0206010102040101020e0103020301030203010202000101020001010204010302020101
-02010101020801030204010402030101020201030203010302020102028f0103020b0000
-020d040002900103021101030254010102a40103020b0000020d040002fd010202a50103
-020b0000020d040002ff02a60103020c040d02ff02a7010302ff02c2010302ff02c20103
-020200ff00bb0400020201030202000004ff04bb0202010302ff02c20103020205ff05bc
-02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc020201030202
-05ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc0202
-0103020205ff05bc02020103020205ff05bc020201030202050800000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000508020201030202050700000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500010005070202010302020508000005ff05a8
-010005080202010302020507000005ff05aa010005070202010302020508000005ff05a8
-010005080202010302020507000005ff05aa010005070202010302020508000005ff05a8
-010005080202010302020507000005ff05aa010005070202010302020508000005ff05a8
-010005080202010302020507000005ff05aa010005070202010302020508000005ff05a8
-010005080202010302020507000005ff05aa010005070202010302020508000005ff05a8
-010005080202010302020507000005ff0549000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005110100
-05070202010302020508000005ff05470000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000051101000508
-0202010302020507000005ff05490000054c010005110100050702020103020205080000
-05ff05470000054c010005110100050802020103020205070000050d0102051e0100050f
-010105ff05060000054c010005110100050702020103020205080000050b010005020100
-051d0100050e010005ff05070000054c010005110100050802020103020205070000050c
-010005060102050301020502010005000101050301020502010005000101050b01000504
-010205020100050001010504010105f20000054c01000511010005070202010302020508
-0000050c0100050401000502010005010100050201000501010105010100050101000502
-0100050101010501010005080104050101000502010005010101050101000503010105f1
-0000054c010005110100050802020103020205070000050e010105020100050201000505
-010005010100050501000505010005020100050a010005030100050201000501010005fc
-0000054c010005110100050702020103020205080000050f010005010104050201030501
-0100050501000505010005020100050a010005030100050201000501010005fb00000512
-0102051e01000516010005110100050802020103020205070000050c0100050201000501
-0100050501000502010005010100050501000505010005020100050a0100050301000502
-01000501010005fc00000510010005020100051d01000517010005110100050702020103
-020205080000050b01000502010005010100050201000501010005020100050101000505
-0100050201000501010005020100050a01000503010005020100050101000507010105f1
-000005110100050601020503010205020100050001010503010205020100050001010513
-010005110100050802020103020205070000050d01020503010205030103050101000506
-01020502010005020100050a010005040102050201000507010105f20000051101000504
-010005020100050101000502010005010101050101000501010005020100050101010501
-0100051301000511010005070202010302020508000005ff054700000513010105020100
-050201000505010005010100050501000505010005020100051201000511010005080202
-010302020507000005ff0549000005140100050101040502010305010100050501000505
-010005020100051301000511010005070202010302020508000005ff0547000005110100
-050201000501010005050100050201000501010005050100050501000502010005120100
-0511010005080202010302020507000005ff054900000510010005020100050101000502
-010005010100050201000501010005050100050201000501010005020100051301000511
-010005070202010302020508000005ff0547000005120102050301020503010305010100
-050601020502010005020100051201000511010005080202010302020507000005ff0549
-0000054c01000511010005070202010302020508000005ff05470000054c010005110100
-050802020103020205070000050901ff012c05120000054c010005110100050702020103
-020205080000050801ff012c05110000054c010005110100050802020103020205070000
-0509010107ff0728010105120000054c0100051101000507020201030202050800000508
-010107ff07270000010105110000054c0100051101000508020201030202050700000509
-0101070100ff0026010105120000054c0100051101000507020201030202050800000508
-0101070100ff0026010105110000054c0100051101000508020201030202050700000509
-0101070100ff0026010105120000054c0100051101000507020201030202050800000508
-010107010000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000000300000003000000030000000300
-000003000000030000000300000003000000030000a0010105110000054c010005110100
-05080202010302020507000005090101070103840101009f010105120000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100051101000507020201030202050800000508010107010000030401000377
-010003040101009f01010511000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005110100050802020103
-0202050700000509010107010304010003030102031e0100034001000310010003030101
-009f01010573010005070202010302020508000005080101070100000302010003030100
-03020100031d01000353010003020101009f010105720100050802020103020205070000
-050901010701030201000304010003060102030301020302010003000101030301020302
-010003000101030a01020302010003020100030101000300010103020100030001010303
-01020303010203030102030301020303010203020100030001010304010003010101009f
-010105730100050702020103020205080000050801010701000003000100030601000304
-010003020100030101000302010003010101030101000301010003020100030101010301
-010003080100030201000301010003020100030101010301010003010101030101000301
-010003020100030101000302010003010100030201000304010003020100030201000301
-0101030101000304010003000101009f0101057201000508020201030202050700000509
-010107010300010003080101030201000302010003050100030101000305010003050100
-030201000308010003020100030201000300010003020100030201000301010003050100
-030201000301010003050100030801000302010003020100030101000302010003050102
-009f01010573010005070202010302020508000005080101070100000300010003090100
-030101040302010303010100030501000305010003020100030801040303010003030100
-030201000301010003050104030201020303010203050100030201000302010003010100
-030201000304010003000101009f01010572010005080202010302020507000005090101
-070103020100030401000302010003010100030501000302010003010100030501000305
-010003020100030801000306010003000100030201000302010003010100030501000309
-01000305010003040100030201000302010003010100030201000303010003010101009f
-010105730100050702020103020205080000050801010701000003020100030301000302
-010003010100030201000301010003020100030101000305010003020100030101000302
-010003080100030201000301010003020100030101010301010003010100030501000302
-010003010100030201000301010003020100030401000302010003020100030101000302
-01000302010003020101009f010105720100050802020103020205070000050901010701
-030401000303010203030102030301030301010003060102030201000302010003090102
-030201000302010003010100030001010302010003060102030301020303010203050100
-0303010203020100030201000301010003030101009f0101057301000507020201030202
-05080000050801010701000003040100034001000335010003040101009f010105720100
-05080202010302020507000005090101070103470100033b0101009f0101051200000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000511010005070202010302020508000005080101070100000346
-0100033b0101009f01010511000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005110100050802020103
-020205070000050901010701030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300010003000100
-030001000300010003000100030001000300010003000100030001000300009f01010512
-0000054c01000511010005070202010302020508000005080101070100ff002601010511
-0000054c01000511010005080202010302020507000005090101070100ff002601010512
-0000054c01000511010005070202010302020508000005080101070100ff002601010511
-0000054c01000511010005080202010302020507000005090101070100ff002601010512
-0000054c01000511010005070202010302020508000005080101070000ff002701010511
-0000054c010005110100050802020103020205070000050901ff012c05120000054c0100
-05110100050702020103020205080000050801ff012c0511000005120102051f01020513
-01000511010005080202010302020507000005ff05490000051001000502010005200100
-051401000511010005070202010302020508000005ff0547000005110100050201000502
-010205020100050001010503010205030102050501000513010005110100050802020103
-02020507000005ff05490000051001000505010005020100050101010501010005010100
-050201000501010005020100050401000514010005110100050702020103020205080000
-05ff05470000051101000509010005010100050201000501010005050100050201000504
-0100051301000511010005080202010302020507000005ff054900000510010005060103
-050101000502010005010100050501040504010005140100051101000507020201030202
-0508000005ff054700000511010005020100050101000502010005010100050201000501
-01000505010005080100051301000511010005080202010302020507000005ff05490000
-051001000502010005010100050201000501010005020100050101000502010005010100
-0502010005040100051401000511010005070202010302020508000005ff054700000512
-010205030103050101000502010005020102050301020505010005130100051101000508
-0202010302020507000005ff05490000054c010005110100050702020103020205080000
-05ff05470000054c01000511010005080202010302020507000005ff05490000054c0100
-0511010005070202010302020508000005ff05470000054c010005110100050802020103
-02020507000005ff05490000054c01000511010005070202010302020508000005ff0547
-0000054c01000511010005080202010302020507000005ff05490000054c010005110100
-05070202010302020508000005ff05470000054c01000511010005080202010302020507
-0000052201000563000005c00000054c0100051101000507020201030202050800000520
-01000500010005230100053c000005000000053e0102054b0100052f0000054c01000511
-010005080202010302020507000005200100050001000500010005220100053b00000500
-000005000000053f0100057d000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005110100050702020103
-020205080000051e010005000601010005000100050b0102050301020509010405020102
-05020100050001010502010105000100052400000502000005000000050b010205030102
-050901000500010105030102050301010500010005010100050201000504010005030102
-0502010005000101050a0102050201000502010005010100050001010502010005000101
-050301020503010205030102050301020503010205020100050001010521000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005110100050802020103020205070000051e01000500060301000500
-010005090100050201000501010005020100050a01000503010005020100050101010501
-010005010100050001000500010005220000050400000500000005090100050201000501
-010005020100050801010501010005010100050201000501010005010101050101000502
-010005040100050201000502010005010101050101000508010005020100050101000502
-010005010101050101000501010105010100050101000502010005010100050201000501
-010005020100050401000502010005020100050101010501010005820100050702020103
-020205080000051c010005000605010005000100050c010005010100050e010005030100
-0502010005010100050501000500010005000100052100000506000005000000050c0100
-05010100050c010005050100050201000501010005020100050101000502010005040100
-0506010005010100050c0100050201000502010005000100050201000502010005010100
-050501000502010005010100050501000508010005020100050201000501010005020100
-05810100050802020103020205070000051c000005000607000005000000050801030502
-0102050b0100050301040501010005050100050001000500010005200100050801000500
-010005080103050201020509010005050104050101000502010005010100050201000504
-01000503010305010100050c010405030100050301000502010005010100050501040502
-010205030102050501000502010005020100050101000502010005820100050702020103
-020205080000051c000005000605000005000000050801000502010005050100050a0100
-050301000505010005050100050001000500010005210100050601000500010005080100
-050201000505010005080100050501000505010005020100050101000502010005040100
-050201000502010005010100050c01000506010005000100050201000502010005010100
-050501000509010005050100050401000502010005020100050101000502010005810100
-050802020103020205070000051e00000500060300000500000005090100050201000501
-010005020100050a01000503010005020100050101000505010005000100050001000522
-010005040100050001000509010005020100050101000502010005080100050501000502
-01000501010005010101050101000501010105040100050201000502010005010100050c
-010005020100050101000502010005010101050101000501010005050100050201000501
-010005020100050101000502010005040100050201000502010005010100050201000582
-0100050702020103020205080000051e000005000601000005000000050b010305020102
-050c01010502010205020100050501000500010005000100052301000502010005000100
-050b01030502010205090100050601020503010105000100050201010500010005040100
-0503010305010100050d0102050201000502010005010100050001010502010005060102
-050301020503010205050100050301020502010005020100058101000508020201030202
-05070000052000000500000005000000055f010005000100050001000532010005320100
-05b7010005070202010302020508000005200000050000000561010005000100052f0100
-050201000532010005b60100050802020103020205070000052200000563010005310102
-0533010005b7010005070202010302020508000005ff05a8010005080202010302020507
-000005ff05aa010005070202010302020508000005ff05a8010005080202010302020507
-000005ff05aa010005070202010302020508000005ff05a8010005080202010302020507
-000005ff05aa010005070202010302020508000005ff05a8010005080202010302020507
-000005ff05aa010005070202010302020508000005ff05a8010005080202010302020507
-000005ff05aa010005070202010302020508000005ff05a8010005080202010302020507
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050702020103
-020205080100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050802020103
-020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc
-02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc020201030202
-05ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05a10100
-050001000500010005000100050001000500010005000100050001000500010005090202
-0103020205ff05a001000500010005000100050001000500010005000100050001000500
-010005000100050000000508020201030202050707ff0796050201000506010005060000
-0509020201030202050707ff079500000501010005060000050800000508020201030202
-0507070100ff009405020100050601000506000005090202010302020507070100ff0094
-0501010005060000050001000506000005080202010302020507070100ff009405020100
-05040000050201000504000005090202010302020507070100ff00940501010005040000
-050201000506000005080202010302020507070100ff0094050201000504000005020100
-0504000005090202010302020507070100ff009405010100050400000504010005040000
-05080202010302020507070100ff00940502010005020000050601000502000005090202
-010302020507070100ff0094050101000502000005060100050400000508020201030202
-0507070100ff009405020100050200000506010005020000050902020103020205070701
-00ff00940501010005020000050801000502000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-050000000500010005000100050001000500010005000100050001000502000005080202
-010302020507070100ff0094050201000500010005000100050001000500010005000100
-05000100050001000500000005090202010302020507070100ff00940501010005100000
-05080202010302020507070100ff00940502010005000000050000000500000005000000
-0500000005000000050000000500000005090202010302020507070100ff009405010100
-050000000500000005000000050000000500000005000000050000000500010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-0501010005000000050c01000500000005080202010302020507070100ff009405020100
-05000000050a01000500000005090202010302020507070100ff00940501010005000000
-050c01000500000005080202010302020507070100ff00940502010005000000050a0100
-0500000005090202010302020507070100ff00940501010005000000050c010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-0501010005000000050c01000500000005080202010302020507070100ff009405020100
-05000000050a01000500000005090202010302020507070100ff00940501010005000000
-050c01000500000005080202010302020507070100ff00940502010005000000050a0100
-0500000005090202010302020507070100ff00940501010005000000050c010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-0501010005000000050c01000500000005080202010302020507070100ff009405020100
-05000000050a01000500000005090202010302020507070100ff00940501010005000000
-050c01000500000005080202010302020507070100ff00940502010005000000050a0100
-0500000005090202010302020507070100ff00940501010005000000050c010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-0501010005000000050c01000500000005080202010302020507070100ff009405020100
-05000000050a01000500000005090202010302020507070100ff00940501010005000000
-050c01000500000005080202010302020507070100ff00940502010005000000050a0100
-0500000005090202010302020507070100ff00940501010005000000050c010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-0501010005000000050c01000500000005080202010302020507070100ff009405020100
-05000000050a01000500000005090202010302020507070100ff00940501010005000000
-050c01000500000005080202010302020507070100ff00940502010005000000050a0100
-0500000005090202010302020507070100ff00940501010005000000050c010005000000
-05080202010302020507070100ff00940502010005000000050a01000500000005090202
-010302020507070100ff00940501010005000000050c0100050000000508020201030202
-0507070100ff00940502010005000000050a010005000000050902020103020205070701
-00ff00940501010005000000050c01000500000005080202010302020507070100ff0094
-0502010005000000050a01000500000005090202010302020507070100ff009405010100
-05000000050c01000500000005080202010302020507070100ff00940502010005000000
-050a01000500000005090202010302020507070100ff00940501010005000000050c0100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005000000050c01000500000005080202
-010302020507070100ff00940502010005000000050a0100050000000509020201030202
-0507070100ff00940501010005000000050c010005000000050802020103020205070701
-00ff00940502010005000000050a01000500000005090202010302020507070100ff0094
-050101000500000005000100050001000500010005000100050001000500010005000100
-0500000005080202010302020507070100ff009405020100050001000500010005000100
-050001000500010005000100050001000500000005090202010302020507070100ff0094
-050101000510000005080202010302020507070100ff0094050201000500000005000000
-050000000500000005000000050000000500000005000000050902020103020205070701
-00ff00940501010005020000050000000500000005000000050000000500000005000100
-0500000005080202010302020507070100ff00940502010005000000050a010005000000
-05090202010302020507070100ff00940501010005020000050801000502000005080202
-010302020507070100ff0094050201000502000005060100050200000509020201030202
-0507070100ff009405010100050400000506010005020000050802020103020205070701
-00ff00940502010005020000050601000502000005090202010302020507070100ff0094
-0501010005040000050401000504000005080202010302020507070100ff009405020100
-05040000050201000504000005090202010302020507070100ff00940501010005060000
-050201000504000005080202010302020507070100ff0094050201000504000005020100
-0504000005090202010302020507070100ff009405010100050600000500010005060000
-05080202010302020507070100ff00940502010005060100050600000509020201030202
-0507070100ff009405010100050801000506000005080202010302020507070000ff0095
-050201000506010005060000050902020103020205ff05a0010005000000050000000500
-0000050000000500000005000000050000000500000005000000050802020103020205ff
-05a100000500000005000000050000000500000005000000050000000500000005000000
-050902020103020205060100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005180202010302020505010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500000005170202010302020506010005100000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005020000
-050c0000051802020103020205050100050c000005000100050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050001000500000005000000
-050c0000051702020103020205060100050a0000050001000502000005ff057601000502
-000005000000050000000508000005180202010302020505010005080000050000000502
-01000500000005ff05780100050000000502000005000000050800000517020201030202
-050601000506000005000000050201000502000005ff0576010005020000050400000500
-0000050400000518020201030202050501000504000005000000050601000500000005ff
-057801000500000005060000050000000504000005170202010302020506010005020000
-05000000050601000502000005ff05760100050200000508000005000000050000000518
-020201030202050501000500010005000100050a01000500000005ff0578010005000000
-050a01000500010005000000051702020103020205060100050201000500010005060100
-0502000005ff057601000502000005080100050001000500000005180202010302020505
-01000504010005000100050601000500000005ff05780100050000000506010005000100
-050400000517020201030202050601000506010005000100050201000502000005ff0576
-010005020000050401000500010005040000051802020103020205050100050801000500
-0100050201000500000005ff057801000500000005020100050001000508000005170202
-0103020205060100050a0100050001000502000005ff0576010005020000050001000500
-010005080000051802020103020205050100050c01000500010005000000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050000000500
-0100050c0000051702020103020205060100051001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050001000500010005020100050c000005180202010302020505
-010005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005170202010302020506000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-00000500000005000000051802020103020205ff05bc02020103020205ff05bc02020103
-020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc
-02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc020201030202
-05ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc0202
-0103020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff
-05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103
-020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc
-02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc020201030202
-05ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc0202
-0103020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff
-05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103
-020205ff05bc02020103020205ff05bc02020103020205ff05bc02020103020205ff05bc
-02020101000405ff05bc00050202040005ff05bc00000202040000000202040005ff05bc
-00000202040000000202040005ff05bc00000202040000000202040005ff05bc00000202
-040000000202040005ff05bc000002020400000002020400000502ff02b0000602020400
-00000208040002ff02b000000208040000000208040002ff02b000000208040000000208
-040001ff01b00000020804000000040901ff01b000000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 228 183
-%%EOF
diff --git a/lib/tv/doc/src/tv_start.gif b/lib/tv/doc/src/tv_start.gif
deleted file mode 100644
index 7a8a0cf6ce..0000000000
--- a/lib/tv/doc/src/tv_start.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start.ps b/lib/tv/doc/src/tv_start.ps
deleted file mode 100644
index 7dae8e4a5a..0000000000
--- a/lib/tv/doc/src/tv_start.ps
+++ /dev/null
@@ -1,828 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_start.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:02:24 2001)
-%%BoundingBox: 0 42 377 247
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 42 377 247
-userdict begin
-%%BeginData:
-DisplayImage
-0 42
-377.000000 205.000000
-12
-755 410
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-828282
-aab6aa
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff01ff01dc000b0208040001ff01ff01dc00000208040000000208040002ff02ff
-02dc000002080400000002080400020000ff00ff00d90400020000000208040000000202
-04060200000004ff04ff04d9020000000405020204000000020204000209000d02ff02ff
-02d000000202040000000202040002080000020d040002f6010302110103023801010206
-0101024001010230010102ff020400000202040000000202040002080000020d040002f6
-010102020107020001010203010102010101020e0105020001070201010302070100020b
-01010206010102400101020c0104021e010102ff02040000020204000000020204000208
-0000020d040002f6010102050101020301010203010102010101020e0101020701010203
-01010201010102050101020b010102060101024e010102020101021d010102ff02040000
-0202040000000202040002080000020204060203040002f6010102050101020301010203
-010102010101020e01010207010102030101020801040201010302030101020001010203
-010102020103020301040206010302030101020001010207010102000101020101010203
-010302030101020201010200010102020101020101030202010102000101020101010203
-010302020101020001010201010102020103020201010202010102f30000020204000000
-04030208000002020400030400000203040002f601010205010102040101020201000202
-0101020e0101020701010203010202080101020201010201010102020102020001010202
-010102010101020101010201010102090101020101010202010202000101020601020200
-010202000101020101010201010102020101020201020200010102010101020001010200
-010102020102020001020200010102010101020101010201010102000101020101010201
-010102010101020101010202010102f3000004030101020b000002030400030200000204
-040002f6010102050101020401010201010102020101020e010402040101020401030206
-010102060101020201010201010102020101020101010201010102010102020801010201
-010102020101020101010206010102010101020101010205010102020101020201010201
-010102010101020001010200010102020101020101010201010102050101020101020203
-01010201010102010101020101010202010002f70103020b000002030400030200000204
-040002f6010102050101020501010200010002030101020e010102070101020601020205
-010102030104020201010201010102020101020101050202010302060101020101010202
-010102010101020601010201010102010101020201040202010102020101020101010201
-010102000101020001010202010102010101020101010202010402010101020401010201
-0105020201010200010102f70103020b000002040400030000000205040002f601010205
-01010205010302030101020e010102070101020701010205010102020101020101010202
-010102010101020201010201010102080102020501010201010102020101020101010206
-010102010101020101010201010102010101020201010202010102010101020101010201
-010102000101020101010201010102010101020101010201010102010101020401010201
-0101020601010200010002f80103020b000002040400030000000205040002f601010205
-01010206010102040101020e010102070101020301010201010102050101020201010201
-010102020101020101010202010102010101020201000205010102050101020101010202
-010102010101020601010201010102010101020101010201010102020101020201010201
-010102020101020701010201010102010101020101010201010102010101020401010201
-0101020201000203010202f80103020b0000020500000206040002f60101020501010206
-010102040101020e01050203010102040103020701020201010202000101020101040203
-010102020103020201040207010302030101020101010206010102010101020101010202
-010202000101020101010202010102010101020301050202010102010101020101010202
-0102020001010200010102040101020201030204010102f90103020b0000020d040002f6
-01030211010302c4010102fa0103020b0000020d040002ff02d5010102fa0103020b0000
-020d040002ff02ff02d20103020c040d02ff02ff02d3010302ff02ff02ee010302ff02ff
-02ee0103020200ff00ff00e70400020201030202000004ff04ff04e70202010302ff02ff
-02ee0103020200ff00ff00e802020103020200ff00ff00e70700020201030202000105ff
-05ff05e40701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e407010202
-010302020001050b06040504060005030602051f0600050206000504060005270602050b
-06000506060005ff05ff053506000502060005090602051307010202010302020001050b
-0600050f0600051f060005020600052c060005020600050a060005ff05ff053d06000502
-0600050b0600051307010202010302020001050b06000506060205050600050306020518
-060005020600050206020503060205020600050206000517060005020600050106000500
-060105020604050206020503060205020600050006010503060205ff05ff052006000502
-060005020602050506000502060005000601050c07010202010302020001050b06000508
-060005050600050206000502060005180600050006000505060005020600050206000501
-060005020600051706000502060005010601050106000503060005060600050206000502
-06000501060105010600050106000502060005ff05ff051f060005020600050106000502
-0600050406000502060105010600050b07010202010302020001050b0603050506000505
-060005020600050206000518060005000600050506000502060005020600050106000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000501060005ff05ff052306040501060005020600050406000502
-060005020600050b07010202010302020001050b06000508060005050600050206040518
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05ff052006000502060005010604050406000502060005020600050b0701020201030202
-0001050b0600050806000505060005020600051d06000506060005020600050506000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000505060005ff05ff051f06000502060005010600050806000502
-060005020600050b07010202010302020001050b06000508060005050600050206000502
-060005190600050606000502060005020600050106000500060005000600051706000502
-060005010601050106000503060005060600050206000502060005010600050206000501
-06000502060005ff05ff051f060005020600050106000502060005040600050206010501
-0600050b07010202010302020001050b0600050806000505060005030602051a06000506
-060005030602050306000500060005190602050206000500060105050601050406000503
-060205020600050206000502060205ff05ff052006000502060005020602050506000502
-060005000601050c070102020103020200010576060005ff05ff055b0600050f07010202
-010302020001050a0606052a0606052a06060500060005ff05ff05450606050e0600050f
-07010202010302020001050a0606052a0606052a06060500060005ff05ff05450606050e
-0600050f0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000107ff07ff07e602020103
-0202000007ff07ff07e702020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e8020201030202051c010205040103
-05c1010205040103051a0102057f01010505010205f001020504010305190101052f0202
-01030202050e01060508010005060101050f010205010102059b01060508010005060101
-0510010505040101054d010205240104050d0101051e0102052401020501010205930106
-0508010005060101051101030535020201030202050e0100050101010500010005070101
-050601000511010105010100059d01000501010105000100050701010506010005130101
-05060100054d0101050001010524010105000101050c0100051e01010500010105240101
-050101000595010005010101050001000507010105060100051101010501010105340202
-010302020510010105030103050201030503010105030103050801020500010105010103
-05000101050001000500010005020103058b010105030103050201030503010105030103
-050a010105030104054c0101050101050500010305000102050201030501010105000102
-05070101050101010500010305030104051d010105010105050001030500010205020103
-050101010500010205070102050001010501010305000101050001000500010005020103
-058301010503010305020103050301010503010305090101050101000500010305020105
-050101030521020201030202051001010506010105000101050101010502010105020101
-0501010105070100050001000500010005050101050001050500010105010101058a0101
-050601010500010105010101050201010502010105010101050901010502010105010101
-054c01000502010105000101050201000500010205000101050001010501010105010102
-050001000507010105010101050201010502010105010101051d01000502010105000101
-050201000500010205000101050001010501010105010102050001000507010005000100
-050001000505010105000105050001010501010105820101050601010500010105010101
-050201010502010105010101050801020504010105020101050001010501010105010101
-052002020103020205100100050401040500010105010101050201010501010605070100
-0500010205020104050001010500010005000107058a0100050401040500010105010101
-0502010105010106050901010501010105020101054b0101050201000501010105000100
-05000100050001010501010805010101050a0103050401010501010105020101051c0101
-05020100050101010500010005000100050001010501010805010101050a010005000102
-050201040500010105000100050001070582010005040104050001010501010105020101
-05010106050901020503010105040101050101060520020201030202050f010105020101
-0501010105000101050201010501010105020101050b0101050001010501010105010101
-05010100050001000500010005000101058e010105020101050101010500010105020101
-0501010105020101050d01010502010105010101054c0101050101010501010205000100
-05010100050201000500010105050101050a0101050601010502010105010101051d0101
-05010101050101020500010005010100050201000500010105050101050a010105000101
-050101010501010105010100050001000500010005000101058601010502010105010101
-05000101050201010501010105020101050b010105010101050201010503010105030101
-0525020201030202050f0101050201010501010105000101050101010502010105020101
-050101010507010005010101050101010501010105000101050001000500010005000101
-05010101058a010105020101050101010500010105010101050201010502010105010101
-050901010502010105010101054c01010500010105020103050101010501010105000101
-0501010105010101050a0101050601010502010105010101051d01010500010105020103
-0501010105010101050001010501010105010101050a0100050101010501010105010101
-050001010500010005000100050001010501010105820101050201010501010105000101
-050101010502010105020101050101010507010105010101050201010502010205000101
-05000101050101010521020201030202050e01030502010a050101050501010305070102
-0500010105020107050001000500010105000103058a01030502010a0501010505010103
-0508010505010105054c0102050301010500010005000103050001020500010305010104
-050701030503010505010105051d01020503010105000100050001030500010205000103
-05010104050701020500010105020107050001000500010105000103058201030502010a
-050101050501010305090103050101050500010505010103052202020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e8020201030202050201ff01ff01e205020202010302020503080000cb080001000081
-01010059010100c30101005801000711000005020202010302020503080000cb08000100
-000b0101004e0101002201010059010100c3010100580100070103060700030600010502
-0202010302020503080000cb08000100000a0100001c0100002a01000008010000210101
-000c0100002a0100001f010100c301010058010007010305000007000306000105020202
-0103020205030800001f0800000a080000060802009408000100000a0100000401020003
-0102000c010000040101000a010200030102000b0101000201000007010000210101000b
-010000040101000a010200030102000b010100020100001e010100c30101000a0101004b
-0100070103050000070103050001050202020103020205030800001f0800000a08000008
-0800009408000100000a010000030100000201000001010000020100000a010000040100
-000101000008010000020100000101000002010000090100000101000002010000060100
-00210101000a010000040100000101000008010000020100000101000002010000090100
-0001010000020100001d010100c301010009010000010100004a01000701030400010701
-030500010502020201030202050308000008080100000800000208000002080000080804
-0002080200020800000008010005080000030802008d08000100000a0100000701000005
-0100000901000005010000010100000c0100000501000009010000010100000301000005
-010000210101000901000005010000010100000c01000005010000090100000101000003
-0100001c010100c301010009010000010100004a01000701030400010500070103040001
-0502020201030202050308000008080000000800000008000001080000020800000a0800
-00030800000208000001080100010800000408000002080000020800008c08000100000a
-01000007010000050100000801000006010000010100000c010000050100000901000001
-0100000401000004010000210101000801000006010000010100000c0100000501000009
-01000001010000040100001b010100c301010009010000010100004a0100070103030001
-050107010304000105020202010302020503080000080800000008000000080000020800
-00010800000a0800000708000001080000020800000408000002080000020800008c0800
-0100000801010007010000050100000801000007010000010100000a010100040101000a
-0100000101000005010000040101001f0101000701000007010000010100000a01010004
-0101000a01000001010000050100001a010100c301010009010000010100004a01000701
-030300010502070103030001050202020103020205030800000808000000080000000800
-0002080000010800000a08000004080300010800000208000004080000020804008c0800
-0100000a01000005010000050100000a01000006010000010100000c0100000501000009
-010000010100000401000004010000210101000801000006010000010100000c01000005
-0100000901000001010000040100001b010100c301010009010000010100004a01000701
-030200010503070103030001050202020103020205030800000808000000080000000800
-0003080000000800000a0800000308000002080000010800000208000004080000020800
-009008000100000a01000004010000050100000c01000005010000010100000c01000005
-01000009010000010100000301000005010000210101000901000005010000010100000c
-010000050100000901000001010000030100001c010100c301010009010000010100004a
-010007010302000105040701030200010502020201030202050308000008080000000800
-0000080000030801000b0800000308000002080000010801000108000004080000020800
-00020800008c08000100000a010000030100000501000007010100040100000401000001
-010000030101000201000002010000010100000201000003010100030100000101000002
-01000006010000210101000a010000040100000101000003010100020100000201000001
-01000002010000030101000301000001010000020100001d010100c30101000901000001
-0100004a0100070103010001050507010302000105020202010302020503080000080800
-000008000000080000040800000c08010002080300010800000008010005080000030802
-008d08000100000a01000003010400010104000301010005010000040101000401010003
-0102000301020004010100040101000201000007010000210101000b0100000401010004
-01010003010200030102000401010004010100020100001e010100c30101000a0101004b
-010007010301000105060701030100010502020201030202050308000012080000010805
-00af08000100000a01000014010000060100002a01000008010000210101000c0100002a
-0100001f010100c301010058010007010300000105070701030100010502020201030202
-05030800000f08000000080000b808000100000b010100100101003b0101002201010059
-010100c30101005801000701030000010508070103000001050202020103020205030800
-0010080000b908000100008101010059010100c301010058010007010001070b03000001
-05020202010302020503080000cb08000100008101010059010100c30101005801000701
-0000070d000105020202010302020503080000cb08000100008101010059010100c30101
-005801000701030e000105020202010302020503080000cb080001000081010100590101
-00c30101005801000701001005020202010302020503080000cb08000100008101010059
-010100c30101005801000701000d070000010502020201030202050308cd01ff01ff0100
-07010001050a070100010502020201030202050301ff01ff01ce07010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a070100010502020201030202050301ff01ff01ce07010001050a0701000105020202
-01030202050301ff01ff01ce07010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-050301ff01ff01ce07010001050a070100010502020201030202050301ff01ff01ce0701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a070100010502020201030202050301ff01ff01ce07010001050a
-070100010502020201030202050301ff01ff01ce07010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-0502020201030202050301ff01ff01ce07010001050a0701000105020202010302020503
-01ff01ff01ce07010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a070100010502020201030202050301ff01ff
-01ce07010001050a070100010502020201030202050301ff01ff01ce07010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a070100010502020201030202050301ff01ff01ce07010001050a070100010502
-020201030202050301ff01ff01ce07010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-0202050301ff01ff01ce07010001050a070100010502020201030202050301ff01ff01ce
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a070100010502020201030202050301ff01ff01ce07010001
-050a070100010502020201030202050301ff01ff01ce07010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-00010502020201030202050301ff01ff01ce07010001050a070100010502020201030202
-050301ff01ff01ce07010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a070100010502020201030202050301ff
-01ff01ce07010001050a070100010502020201030202050301ff01ff01ce07010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001070c
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0000070d00010502020201030202050301ff01ff01ce0701030e00010502020201030202
-050301ff01ff01ce0701030e000105020202010302020503010000cb0101008101010059
-010100c30101005801000701030e000105020202010302020503010000cb010100810101
-0059010100c30101005801000701030e000105020202010302020503010000cb01010081
-01010059010100c30101005801000701030e000105020202010302020503010000cb0101
-008101010059010100c30101005801000701030e000105020202010302020503010000cb
-0101008101010059010100c30101005801000701030e0001050202020103020205030100
-00cb0101008101010059010100c30101005801000701030e000105020202010302020503
-010000cb0101008101010059010100c30101005801000701030e00010502020201030202
-0503010000cb0101008101010059010100c30101005801000701030e0001050202020103
-02020503010000cb0101008101010059010100c30101005801000701030e000105020202
-010302020503010000cb0101008101010059010100c30101005801000701030e00010502
-0202010302020503010000cb0101008101010059010100c30101005801000701030e0001
-05020202010302020503010000cb0101008101010059010100c30101005801000701030e
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-030e000105020202010302020503010000cb0101008101010059010100c3010100580100
-0701030e000105020202010302020503010000cb0101008101010059010100c301010058
-01000701030e000105020202010302020503010000cb0101008101010059010100c30101
-005801000701030e000105020202010302020503010000cb0101008101010059010100c3
-0101005801000701030e000105020202010302020503010000cb01010081010100590101
-00c30101005801000701030e000105020202010302020503010000cb0101008101010059
-010100c30101005801000701030e00010502020201030202050301ff01ff01ce0701030e
-00010502020201030202050301ff01ff01ce0701001005020202010302020503010000cb
-0101008101010059010100c301010058010007010300000c070000010502020201030202
-0503010000cb0101008101010059010100c3010100580100070103000001050807010300
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-03010001050707010300000105020202010302020503010000cb01010081010100590101
-00c3010100580100070103010001050607010301000105020202010302020503010000cb
-0101008101010059010100c3010100580100070103020001050507010301000105020202
-010302020503010000cb0101008101010059010100c30101005801000701030200010504
-07010302000105020202010302020503010000cb0101008101010059010100c301010058
-0100070103030001050307010302000105020202010302020503010000cb010100810101
-0059010100c3010100580100070103030001050207010303000105020202010302020503
-010000cb0101008101010059010100c30101005801000701030400010501070103030001
-05020202010302020503010000cb0101008101010059010100c301010058010007010304
-0001050007010304000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010305000007020304000105020202010302020503010000cb01010081
-01010059010100c301010058010007010305000007010305000105020202010302020503
-010000cb0101008101010059010100c30101005801000701030607010305000105020202
-010302020503010000cb0101008101010059010100c30101005801000701030607000306
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-001005020202010302020503010000cb0101008101010059010100c30101005801000700
-00110502020201030202050207ff07ff07d30511020201030202050207ff07ff07d20000
-051102020103020205020701030d0000030000ff00ff00af03000001030c000105110202
-0103020205020701030b00010700030000ff00ff00ae070003000003030a000105110202
-01030202050207010309000207010300000105ff05ff05ab070103000005030800010511
-0202010302020502070103070003050007010300000105ff05ff05ab0701030000010501
-00030306000105110202010302020502070103050003050207010300000105ff05ff05ab
-070103000001050300030304000105110202010302020502070103030003050407010300
-000105ff05ff05ab07010300000105050003030200010511020201030202050207010301
-0003050607010300000105ff05ff05ab0701030000010507000303000001051102020103
-020205020705050807010300000105ff05ff05ab07010300000105080703000105110202
-010302020502070103010703050607010300000105ff05ff05ab07010300000105070703
-0300000105110202010302020502070103030703050407010300000105ff05ff05ab0701
-030000010505070303020001051102020103020205020701030507030502070103000001
-05ff05ff05ab070103000001050307030304000105110202010302020502070103070703
-050007010300000105ff05ff05ab07010300000105010703030600010511020201030202
-05020701030907040300000105ff05ff05ab070103000001070303080001051102020103
-020205020701030b07020300000107ff07ff07ad030000010701030a0001051102020101
-000405020701030d07000300000007ff07ff07ae030000000700030c0001051100050202
-04000502070100ff00ff00d105110000020204000000020204000502070000ff00ff00d2
-051100000202040000000202040005ff05ff05e800000202040000000202040005ff05ff
-05e800000202040000000202040005ff05ff05e8000002020400000002020400000502ff
-02ff02dc00060202040000000208040002ff02ff02dc00000208040000000208040002ff
-02ff02dc00000208040000000208040001ff01ff01dc0000020804000000040901ff01ff
-01dc00000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 42 377 247
-%%EOF
diff --git a/lib/tv/doc/src/tv_start_mnesia.gif b/lib/tv/doc/src/tv_start_mnesia.gif
deleted file mode 100644
index 0ad04331cd..0000000000
--- a/lib/tv/doc/src/tv_start_mnesia.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start_mnesia.ps b/lib/tv/doc/src/tv_start_mnesia.ps
deleted file mode 100644
index a90185089d..0000000000
--- a/lib/tv/doc/src/tv_start_mnesia.ps
+++ /dev/null
@@ -1,835 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_start_mnesia.eps)
-%%CreationDate: (Mon Mar 19 17:15:23 2001)
-%%BoundingBox: 0 0 377 205
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 377 205
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-377.000000 205.000000
-12
-755 410
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-828282
-a3a3a3
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff01ff01dc000b0208040001ff01ff01dc00000208040000000208040002ff02ff
-02dc000002080400000002080400020000ff00ff00d90400020000000208040000000202
-04060200000004ff04ff04d9020000000405020204000000020204000209000d02ff02ff
-02d000000202040000000202040002080000020d040002ea01030211010302330101021b
-010102060101024001010230010102f700000202040000000202040002080000020d0400
-02ea010102020107020001010203010102010101020e010202020102021b0101020e0100
-020b01010206010102400101020c0104021e010102f70000020204000000020204000208
-0000020d040002ea010102050101020301010203010102010101020e010202020102022b
-0101020b010102060101024e010102020101021d010102f7000002020400000002020400
-02080000020204060203040002ea010102050101020301010203010102010101020e0102
-020201020202010102000101020301030203010402020101020201030205010402010103
-020301010200010102030101020201030203010402060103020301010200010102070101
-020001010201010102030103020301010202010102000101020201010201010302020101
-020001010201010102030103020201010200010102010101020201030202010102020101
-02e6000002020400000004030208000002020400030400000203040002ea010102050101
-020401010202010002020101020e01000200010102000100020001010202010202000101
-020101010201010102010101020601010201010102010101020501010202010102010101
-020201020200010102020101020101010201010102010101020901010201010102020102
-020001010206010202000102020001010201010102010101020201010202010202000101
-020101010200010102000101020201020200010202000101020101010201010102010101
-02000101020101010201010102010101020101010202010102e6000004030101020b0000
-02030400030200000204040002ea010102050101020401010201010102020101020e0100
-020001010200010002000101020201010201010102010101020101010201010202050101
-020501010205010102060101020201010201010102020101020101010201010102010102
-020801010201010102020101020101010206010102010101020101010205010102020101
-020201010201010102010101020001010200010102020101020101010201010102050101
-02010102020301010201010102010101020101010202010002ea0103020b000002030400
-030200000204040002ea010102050101020501010200010002030101020e010002000101
-020001000200010102020101020101010201010502020103020301010202010402050101
-020301040202010102010101020201010201010502020103020601010201010102020101
-020101010206010102010101020101010202010402020101020201010201010102010101
-020001010200010102020101020101010201010102020104020101010204010102010105
-020201010200010102ea0103020b000002040400030000000205040002ea010102050101
-0205010302030101020e0100020101010201010102020101020101010201010102080102
-020201010201010102010101020501010202010102010101020201010201010102020101
-020101010208010202050101020101010202010102010101020601010201010102010101
-020101010201010102020101020201010201010102010101020101010200010102010101
-020101010201010102010101020101010201010102040101020101010206010102000100
-02eb0103020b000002040400030000000205040002ea0101020501010206010102040101
-020e01000201010102010101020201010201010102010101020201000205010102020101
-020101010201010102050101020201010201010102020101020101010202010102010101
-020201000205010102050101020101010202010102010101020601010201010102010101
-020101010201010102020101020201010201010102020101020701010201010102010101
-0201010102010101020101010204010102010101020201000203010202eb0103020b0000
-020500000206040002ea0101020501010206010102040101020e01000205010102020101
-020101010202010302020104020301010202010202000101020501020201010202000101
-020101040203010102020103020201040207010302030101020101010206010102010101
-020101010202010202000101020101010202010102010101020301050202010102010101
-0201010102020102020001010200010102040101020201030204010102ec0103020b0000
-020d040002ea01030211010302dd010102ed0103020b0000020d040002ff02e2010102ed
-0103020b0000020d040002ff02ff02d20103020c040d02ff02ff02d3010302ff02ff02ee
-010302ff02ff02ee0103020200ff00ff00e70400020201030202000004ff04ff04e70202
-010302ff02ff02ee0103020200ff00ff00e802020103020200ff00ff00e7070002020103
-0202000105ff05ff05e40701020201030202000105ff05ff05e407010202010302020001
-05ff05ff05e40701020201030202000105ff05ff05e40701020201030202000105ff05ff
-05e407010202010302020001050b06040504060005030602051f06000502060005040600
-05270602050b06000506060005ff05ff0535060005020600050906020513070102020103
-02020001050b0600050f0600051f060005020600052c060005020600050a060005ff05ff
-053d060005020600050b0600051307010202010302020001050b06000506060205050600
-050306020518060005020600050206020503060205020600050206000517060005020600
-050106000500060105020604050206020503060205020600050006010503060205ff05ff
-052006000502060005020602050506000502060005000601050c07010202010302020001
-050b06000508060005050600050206000502060005180600050006000505060005020600
-050206000501060005020600051706000502060005010601050106000503060005060600
-05020600050206000501060105010600050106000502060005ff05ff051f060005020600
-0501060005020600050406000502060105010600050b07010202010302020001050b0603
-050506000505060005020600050206000518060005000600050506000502060005020600
-050106000500060005000600051706000502060005010600050206000503060005060600
-050206000502060005010600050206000501060005ff05ff052306040501060005020600
-050406000502060005020600050b07010202010302020001050b06000508060005050600
-050206040518060005000600050506000502060405010600050006000500060005170600
-050206000501060005020600050306000506060005020600050206000501060005020600
-0502060205ff05ff052006000502060005010604050406000502060005020600050b0701
-0202010302020001050b0600050806000505060005020600051d06000506060005020600
-050506000500060005000600051706000502060005010600050206000503060005060600
-050206000502060005010600050206000505060005ff05ff051f06000502060005010600
-050806000502060005020600050b07010202010302020001050b06000508060005050600
-050206000502060005190600050606000502060005020600050106000500060005000600
-051706000502060005010601050106000503060005060600050206000502060005010600
-05020600050106000502060005ff05ff051f060005020600050106000502060005040600
-0502060105010600050b07010202010302020001050b0600050806000505060005030602
-051a06000506060005030602050306000500060005190602050206000500060105050601
-050406000503060205020600050206000502060205ff05ff052006000502060005020602
-050506000502060005000601050c070102020103020200010576060005ff05ff055b0600
-050f07010202010302020001050a0606052a0606052a06060500060005ff05ff05450606
-050e0600050f07010202010302020001050a0606052a0606052a06060500060005ff05ff
-05450606050e0600050f0701020201030202000105ff05ff05e407010202010302020001
-05ff05ff05e40701020201030202000105ff05ff05e40701020201030202000107ff07ff
-07e6020201030202000007ff07ff07e702020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e8020201030202051c
-01020504010305c1080205040803051a0802057f01010505010205f00102050401030519
-0101052f020201030202050e01060508010005060101050f010205010102059b08060508
-0800050608010510080505040801054d010205240104050d0101051e0102052401020501
-0102059301060508010005060101051101030535020201030202050e0100050101010500
-010005070101050601000511010105010100059d08000501080105000800050708010506
-08000513080105060800054d0101050001010524010105000101050c0100051e01010500
-010105240101050101000595010005010101050001000507010105060100051101010501
-010105340202010302020510010105030103050201030503010105030103050801020500
-01010501010305000101050001000500010005020103058b080105030803050208030503
-080105030803050a080105030804054c0101050101050500010305000102050201030501
-01010500010205070101050101010500010305030104051d010105010105050001030500
-010205020103050101010500010205070102050001010501010305000101050001000500
-010005020103058301010503010305020103050301010503010305090101050101000500
-010305020105050101030521020201030202051001010506010105000101050101010502
-010105020101050101010507010005000100050001000505010105000105050001010501
-0101058a0801050608010500080105010801050208010502080105010801050908010502
-080105010801054c01000502010105000101050201000500010205000101050001010501
-010105010102050001000507010105010101050201010502010105010101051d01000502
-010105000101050201000500010205000101050001010501010105010102050001000507
-010005000100050001000505010105000105050001010501010105820101050601010500
-010105010101050201010502010105010101050801020504010105020101050001010501
-010105010101052002020103020205100100050401040500010105010101050201010501
-0106050701000500010205020104050001010500010005000107058a0800050408040500
-0801050108010502080105010806050908010501080105020801054b0101050201000501
-01010500010005000100050001010501010805010101050a010305040101050101010502
-0101051c010105020100050101010500010005000100050001010501010805010101050a
-010005000102050201040500010105000100050001070582010005040104050001010501
-01010502010105010106050901020503010105040101050101060520020201030202050f
-0101050201010501010105000101050201010501010105020101050b0101050001010501
-01010501010105010100050001000500010005000101058e080105020801050108010500
-0801050208010501080105020801050d08010502080105010801054c0101050101010501
-01020500010005010100050201000500010105050101050a010105060101050201010501
-0101051d010105010101050101020500010005010100050201000500010105050101050a
-010105000101050101010501010105010100050001000500010005000101058601010502
-01010501010105000101050201010501010105020101050b010105010101050201010503
-0101050301010525020201030202050f0101050201010501010105000101050101010502
-010105020101050101010507010005010101050101010501010105000101050001000500
-01000500010105010101058a080105020801050108010500080105010801050208010502
-080105010801050908010502080105010801054c01010500010105020103050101010501
-0101050001010501010105010101050a0101050601010502010105010101051d01010500
-0101050201030501010105010101050001010501010105010101050a0100050101010501
-010105010101050001010500010005000100050001010501010105820101050201010501
-010105000101050101010502010105020101050101010507010105010101050201010502
-01020500010105000101050101010521020201030202050e01030502010a050101050501
-0103050701020500010105020107050001000500010105000103058a08030502080a0501
-0805050108030508080505010805054c0102050301010500010005000103050001020500
-010305010104050701030503010505010105051d01020503010105000100050001030500
-010205000103050101040507010205000101050201070500010005000101050001030582
-01030502010a050101050501010305090103050101050500010505010103052202020103
-020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103
-020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103
-020205ff05ff05e8020201030202050201ff01ff01e205020202010302020503010000cb
-0101008101010059010100c30101005801000711000005020202010302020503010000cb
-0101008101010059010100c3010100580100070103060700030600010502020201030202
-0503010000cb010100810101000c0100002a0100001f010100c301010058010007010305
-0000070003060001050202020103020205030100000a010000130100000c0100000a0100
-000601020086010100810101000b0100000401010009010400010104000a010100020100
-001e0101002701000028010000040100006a0101000a0101004b01000701030500000701
-03050001050202020103020205030100000a010000130100000c0100000a010000080100
-0086010100810101000a01000004010000010100000801000002010000010100000d0100
-0001010000020100001d010100570100006a01010009010000010100004a010007010304
-000107010305000105020202010302020503010000080104000201020003010200020104
-000801040002010200020100000001010005010000030102007f01010081010100090100
-0005010000010100000c010000010100000d01000001010000030100001c010100080101
-000001000002010000000101000301020003010200030102000301020009010100000100
-0003010200020100000001010003010200020104000201020002010000000101005b0101
-0009010000010100004a0100070103040001050007010304000105020202010302020503
-0100000a01000003010000020100000101000002010000030100000c0100000301000002
-01000001010100010100000401000002010000020100007e010100810101000801000006
-010000010100000b010000020103000a01000001010000040100001b0101000801000000
-010000000100000101010001010000010100000201000001010000020100000401000002
-010000020100000801000000010000000100000101000002010000010101000101000004
-01000004010000030100000201000001010100010100005a01010009010000010100004a
-01000701030300010501070103040001050202020103020205030100000a010000030100
-000201000001010000070100000c01000007010000010100000201000004010000020100
-00020100007e010100810101000701000007010000010100000b01000006010000090100
-0001010000050100001a0101000801000000010000000100000101000002010000010100
-000201000001010000080100000601000008010000000100000001000001010000020100
-00010100000201000004010000040100000301000002010000010100005e010100090100
-00010100004a01000701030300010502070103030001050202020103020205030100000a
-0100000301040002010200040100000c0100000401030001010000020100000401000002
-0104007e010100810101000801000006010000010100000b010000060100000901000001
-010000040100001b01010008010000000100000001000001010000020100000101040002
-010200050100000301030008010000000100000001000001010000020100000101000002
-01000004010000040100000301000002010000010100005e01010009010000010100004a
-01000701030200010503070103030001050202020103020205030100000a010000030100
-0009010000030100000c0100000301000002010000010100000201000004010000020100
-0082010100810101000901000005010000010100000a0100000301000002010000090100
-0001010000030100001c0101000801000000010000000100000101000002010000010100
-000901000004010000020100000201000008010000000100000001000001010000020100
-00010100000201000004010000040100000301000002010000010100005e010100090100
-00010100004a01000701030200010504070103020001050202020103020205030100000a
-01000003010000020100000101000002010000030100000c010000030100000201000001
-010100010100000401000002010000020100007e010100810101000a0100000401000001
-01000003010100040100000301000002010000030101000301000001010000020100001d
-010100080100000001000000010000010100000201000001010000020100000101000002
-010000040100000201000002010000080100000001000000010000010100000201000001
-0100000201000004010000040100000301000002010000010100005e0101000901000001
-0100004a01000701030100010505070103020001050202020103020205030100000b0101
-000201020003010200050101000b01010002010300010100000001010005010000030102
-007f010100810101000b0100000401010004010100040100000401020004010100040101
-00020100001e010100080100000001000000010000010100000201000002010200030102
-000501000003010300080100000001000000010000020102000201000002010000040100
-000501010002010200020100005e0101000a0101004b0100070103010001050607010301
-00010502020201030202050301000023010500a1010100810101000c0100002a0100001f
-010100310105008b01010058010007010300000105070701030100010502020201030202
-0503010000cb0101008101010059010100c3010100580100070103000001050807010300
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001070b0300000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010000070d000105020202010302020503010000cb01010081010100590101
-00c30101005801000701030e000105020202010302020503010000cb0101008101010059
-010100c30101005801000701001005020202010302020503010000cb0101008101010059
-010100c30101005801000701000d070000010502020201030202050301ff01ff01ce0701
-0001050a070100010502020201030202050301ff01ff01ce07010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-070100010502020201030202050301ff01ff01ce07010001050a07010001050202020103
-0202050301ff01ff01ce07010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-01ff01ff01ce07010001050a070100010502020201030202050301ff01ff01ce07010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a070100010502020201030202050301ff01ff01ce07010001050a0701
-00010502020201030202050301ff01ff01ce07010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-020201030202050301ff01ff01ce07010001050a070100010502020201030202050301ff
-01ff01ce07010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a070100010502020201030202050301ff01ff01ce
-07010001050a070100010502020201030202050301ff01ff01ce07010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a070100010502020201030202050301ff01ff01ce07010001050a0701000105020202
-01030202050301ff01ff01ce07010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-050301ff01ff01ce07010001050a070100010502020201030202050301ff01ff01ce0701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a070100010502020201030202050301ff01ff01ce07010001050a
-070100010502020201030202050301ff01ff01ce07010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-0502020201030202050301ff01ff01ce07010001050a0701000105020202010302020503
-01ff01ff01ce07010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a070100010502020201030202050301ff01ff
-01ce07010001050a070100010502020201030202050301ff01ff01ce07010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001070c0001
-05020202010302020503010000cb0101008101010059010100c301010058010007010000
-070d00010502020201030202050301ff01ff01ce0701030e000105020202010302020503
-01ff01ff01ce0701030e000105020202010302020503010000cb01010081010100590101
-00c30101005801000701030e000105020202010302020503010000cb0101008101010059
-010100c30101005801000701030e000105020202010302020503010000cb010100810101
-0059010100c30101005801000701030e000105020202010302020503010000cb01010081
-01010059010100c30101005801000701030e000105020202010302020503010000cb0101
-008101010059010100c30101005801000701030e000105020202010302020503010000cb
-0101008101010059010100c30101005801000701030e0001050202020103020205030100
-00cb0101008101010059010100c30101005801000701030e000105020202010302020503
-010000cb0101008101010059010100c30101005801000701030e00010502020201030202
-0503010000cb0101008101010059010100c30101005801000701030e0001050202020103
-02020503010000cb0101008101010059010100c30101005801000701030e000105020202
-010302020503010000cb0101008101010059010100c30101005801000701030e00010502
-0202010302020503010000cb0101008101010059010100c30101005801000701030e0001
-05020202010302020503010000cb0101008101010059010100c30101005801000701030e
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-030e000105020202010302020503010000cb0101008101010059010100c3010100580100
-0701030e000105020202010302020503010000cb0101008101010059010100c301010058
-01000701030e000105020202010302020503010000cb0101008101010059010100c30101
-005801000701030e000105020202010302020503010000cb0101008101010059010100c3
-0101005801000701030e000105020202010302020503010000cb01010081010100590101
-00c30101005801000701030e00010502020201030202050301ff01ff01ce0701030e0001
-0502020201030202050301ff01ff01ce0701001005020202010302020503010000cb0101
-008101010059010100c301010058010007010300000c0700000105020202010302020503
-010000cb0101008101010059010100c30101005801000701030000010508070103000001
-05020202010302020503010000cb0101008101010059010100c301010058010007010301
-0001050707010300000105020202010302020503010000cb0101008101010059010100c3
-010100580100070103010001050607010301000105020202010302020503010000cb0101
-008101010059010100c30101005801000701030200010505070103010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010302000105040701
-0302000105020202010302020503010000cb0101008101010059010100c3010100580100
-070103030001050307010302000105020202010302020503010000cb0101008101010059
-010100c30101005801000701030300010502070103030001050202020103020205030100
-00cb0101008101010059010100c301010058010007010304000105010701030300010502
-0202010302020503010000cb0101008101010059010100c3010100580100070103040001
-050007010304000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010305000007020304000105020202010302020503010000cb010100810101
-0059010100c3010100580100070103050000070103050001050202020103020205030100
-00cb0101008101010059010100c301010058010007010306070103050001050202020103
-02020503010000cb0101008101010059010100c301010058010007010306070003060001
-05020202010302020503010000cb0101008101010059010100c301010058010007010010
-05020202010302020503010000cb0101008101010059010100c301010058010007000011
-0502020201030202050207ff07ff07d30511020201030202050207ff07ff07d200000511
-02020103020205020701030d0000030000ff00ff00af03000001030c0001051102020103
-020205020701030b00010700030000ff00ff00ae070003000003030a0001051102020103
-0202050207010309000207010300000105ff05ff05ab0701030000050308000105110202
-010302020502070103070003050007010300000105ff05ff05ab07010300000105010003
-0306000105110202010302020502070103050003050207010300000105ff05ff05ab0701
-030000010503000303040001051102020103020205020701030300030504070103000001
-05ff05ff05ab070103000001050500030302000105110202010302020502070103010003
-050607010300000105ff05ff05ab07010300000105070003030000010511020201030202
-05020705050807010300000105ff05ff05ab070103000001050807030001051102020103
-02020502070103010703050607010300000105ff05ff05ab070103000001050707030300
-000105110202010302020502070103030703050407010300000105ff05ff05ab07010300
-0001050507030302000105110202010302020502070103050703050207010300000105ff
-05ff05ab0701030000010503070303040001051102020103020205020701030707030500
-07010300000105ff05ff05ab070103000001050107030306000105110202010302020502
-0701030907040300000105ff05ff05ab0701030000010703030800010511020201030202
-05020701030b07020300000107ff07ff07ad030000010701030a00010511020201010004
-05020701030d07000300000007ff07ff07ae030000000700030c00010511000502020400
-0502070100ff00ff00d105110000020204000000020204000502070000ff00ff00d20511
-00000202040000000202040005ff05ff05e800000202040000000202040005ff05ff05e8
-00000202040000000202040005ff05ff05e8000002020400000002020400000502ff02ff
-02dc00060202040000000208040002ff02ff02dc00000208040000000208040002ff02ff
-02dc00000208040000000208040001ff01ff01dc0000020804000000040901ff01ff01dc
-00000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 377 205
-%%EOF
diff --git a/lib/tv/doc/src/tv_start_other_node.gif b/lib/tv/doc/src/tv_start_other_node.gif
deleted file mode 100644
index 897686e5ef..0000000000
--- a/lib/tv/doc/src/tv_start_other_node.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start_other_node.ps b/lib/tv/doc/src/tv_start_other_node.ps
deleted file mode 100644
index 34477bed6c..0000000000
--- a/lib/tv/doc/src/tv_start_other_node.ps
+++ /dev/null
@@ -1,2316 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (./tv_start_other_node.tmp.eps)
-%%CreationDate: (Tue Jun 12 16:05:42 2001)
-%%BoundingBox: 0 21 400 186
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 21 400 186
-userdict begin
-%%BeginData:
-DisplayImage
-0 21
-400.000000 165.000000
-12
-1001 414
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-4ac1df
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-aab6aa
-e7e7e7
-000000
-000000
-000000
-000000
-000000
-000000
-03ff03ff03ff03ff03ff03ff03ff03ff03c5000a01ff01ff01dc000a03f5000002080500
-01ff01ff01dc00000208050003f500000208050002ff02ff02dc00000208050003f50000
-0208050002ff02ff02dc00000208050003f500000202050602ff02ff02dc000005050202
-050003f50000020205000209000d02ff02ff02d000000202050003f50000020205000208
-0000020d050002e101030211010302380101020601010238010102310101022f010102ee
-00000202050003f500000202050002080000020d050002e1010102020107020001010203
-010102010101020e0105020001070201010302070100020b010102060101023301000203
-010102310101020b0104021e010102ee00000202050003f500000202050002080000020d
-050002e1010102050101020301010203010102010101020e010102070101020301010201
-010102050101020b010102060101023201010203010102310101020a010102020101021d
-010102ee00000202050003f500000202050002080000020205060203050002e101010205
-0101020301010203010102010101020e0101020701010203010102080104020101030203
-010102000101020301010202010302030104020601030203010102000101020701030201
-01040201010102000101020301030202010102000101020a010102000101020301030203
-010402020103020201010201010302020101020001010201010102030103020201010200
-01010201010102020103020201010202010102dd00000202050003f50000050302080000
-02020500040400000203050002e1010102050101020401010202010002020101020e0101
-020701010203010202080101020201010201010102020102020001010202010102010101
-020101010201010102090101020101010202010202000101020501010201010102010101
-020301020200010102010101020101010201010102000101020a01020200010102010101
-020101010201010102010101020101010201010102010101020001010200010102020102
-020001020200010102010101020101010201010102000101020101010201010102010101
-020101010202010102dd0000050303f50101020b000002030500040200000204050002e1
-010102050101020401010201010102020101020e01040204010102040103020601010206
-010102020101020101010202010102010101020101010201010202080101020101010202
-010102010101020501010201010102010101020301010201010102010101020101010201
-0102020c0101020101010201010102010101020101010201010102010101020101010201
-010102000101020001010202010102010101020101010205010102010102020301010201
-010102010101020101010202010002e1010103f50101020b000002030500040200000204
-050002e1010102050101020501010200010002030101020e010102070101020601020205
-010102030104020201010201010102020101020101050202010302060101020101010202
-01010201010102050101020101010201010102030101020101010201010502010101020d
-010102010101020101010201010102010101020101010201010502010101020001010200
-010102020101020101010201010102020104020101010204010102010105020201010200
-010102e1010103f50101020b000002040500040000000205050002e10101020501010205
-010302030101020e01010207010102070101020501010202010102010101020201010201
-010102020101020101010208010202050101020101010202010102010101020501010201
-01010201010102030101020101010201010102050101020d010102010101020101010201
-010102010101020101010201010102050101020101010200010102010101020101010201
-01010201010102010101020101010204010102010101020601010200010002e2010103f5
-0101020b000002040500040000000205050002e10101020501010206010102040101020e
-010102070101020301010201010102050101020201010201010102020101020101010202
-010102010101020201000205010102050101020101010202010102010101020501010201
-0101020101010203010102010101020101010202010002010101020d0101020101010201
-010102010101020101010200010202010101020201000202010102070101020101010201
-01010201010102010101020101010204010102010101020201000203010202e2010103f5
-0101020b0000020500000206050002e10101020501010206010102040101020e01050203
-010102040103020701020201010202000101020101040203010102020103020201040207
-01030203010102010101020601030203010202010101020101010202010302020101020d
-010102010101020201030203010102000101020201030204010502020101020101010201
-010102020102020001010200010102040101020201030204010102e3010103f50101020b
-0000020d050002e1010302110103029201060255010102e4010103f50101020b0000020d
-050002ff02eb010102e4010103f50101020b0000020d050002ff02ff02d2010103f50101
-020c050d02ff02ff02d3010103f5010102ff02ff02ee010103f5010102ff02ff02ee0101
-03f5010102ff02ff02ee010103f5010102ff02ff02ee010103f5010102ff02ff02ee0101
-03f501010202060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-00000600000006000000060000000600000006000202010103f501010202000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060001000202010103f5010102020600000006ff06ff06e40100060002020101
-03f501010202000006ff06ff06e601000202010103f5010102020600000006ff06ff06e4
-010006000202010103f501010202000006ff06ff06e601000202010103f5010102020600
-000006ff06ff06e4010006000202010103f5010102020000060c07040604070006030702
-061f0700060207000604070006270702060b07000606070006ff06ff0635070006020700
-06090702061401000202010103f50101020206000000060b0700060f0700061f07000602
-0700062c070006020700060a070006ff06ff063d070006020700060b0700061301000600
-0202010103f5010102020000060c07000606070206050700060307020618070006020700
-060207020603070206020700060207000617070006020700060107000600070106020704
-060207020603070206020700060007010603070206ff06ff062007000602070006020702
-060507000602070006000701060d01000202010103f50101020206000000060b07000608
-070006050700060207000602070006180700060007000605070006020700060207000601
-070006020700061707000602070006010701060107000603070006060700060207000602
-07000601070106010700060107000602070006ff06ff061f070006020700060107000602
-0700060407000602070106010700060b010006000202010103f5010102020000060c0703
-060507000605070006020700060207000618070006000700060507000602070006020700
-060107000600070006000700061707000602070006010700060207000603070006060700
-060207000602070006010700060207000601070006ff06ff062307040601070006020700
-060407000602070006020700060c01000202010103f50101020206000000060b07000608
-070006050700060207040618070006000700060507000602070406010700060007000600
-070006170700060207000601070006020700060307000606070006020700060207000601
-0700060207000602070206ff06ff06200700060207000601070406040700060207000602
-0700060b010006000202010103f5010102020000060c0700060807000605070006020700
-061d07000606070006020700060507000600070006000700061707000602070006010700
-060207000603070006060700060207000602070006010700060207000605070006ff06ff
-061f07000602070006010700060807000602070006020700060c01000202010103f50101
-020206000000060b07000608070006050700060207000602070006190700060607000602
-070006020700060107000600070006000700061707000602070006010701060107000603
-07000606070006020700060207000601070006020700060107000602070006ff06ff061f
-0700060207000601070006020700060407000602070106010700060b0100060002020101
-03f5010102020000060c0700060807000605070006030702061a07000606070006030702
-060307000600070006190702060207000600070106050701060407000603070206020700
-060207000602070206ff06ff062007000602070006020702060507000602070006000701
-060d01000202010103f501010202060000000676070006ff06ff065b0700060f01000600
-0202010103f5010102020000060b0706062a0706062a07060600070006ff06ff06450706
-060e0700061001000202010103f50101020206000000060a0706062a0706062a07060600
-070006ff06ff06450706060e0700060f010006000202010103f501010202000006ff06ff
-06e601000202010103f5010102020600000006ff06ff06e4010006000202010103f50101
-0202000006ff06ff06e601000202010103f5010102020600000006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0202010103f5010102020000060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-0600010006000100060001000600010006000100060001000202010103f50101020206ff
-06ff06e80202010103f50101020206ff06ff06e80202010103f50101020206ff06ff06e8
-0202010103f50101020206ff06ff06e80202010103f50101020206ff06ff06e802020101
-0303000a01d9000a03010101020206ff06ff06e802020101030300000208050001d90000
-0208050003010101020206ff06ff06e802020101030300000208050002d9000002080500
-03010101020206ff06ff06e802020101030300000208050002d900000208050003010101
-020206ff06ff06e802020101030300000202050602d90000050502020500030101010202
-06ff06ff06e80202010103030000020205000209000d02cd000002020500030101010202
-06ff06ff06e802020101030300000202050002080000020d0500021a0103021101030250
-0101021a0101022700000202050003010101020206ff06ff06e802020101030300000202
-050002080000020d0500021a01010202010702000101020301010201010102100103022b
-0100020e0101021a0101022700000202050003010101020206ff06ff06e8020201010303
-00000202050002080000020d0500021a010102050101020301010203010102010101020f
-01010201010102290101020e0101021a0101022700000202050003010101020206ff06ff
-06e8020201010303000002020500020800000202050602030500021a0101020501010203
-01010203010102010101020e010102060103020301010200010102030101020001010203
-010302030103020001040201010302030104020601010200010102030103020301040202
-010302030104021700000202050003010101020206ff06ff06e802020101030300000503
-02080000020205000404000002030500021a010102050101020401010202010002020101
-020e01010205010102010101020201020200010102020102020001010201010102010101
-020101010201010102000101020201010201010102010101020101010206010202000101
-02010101020101010201010102010101020101010201010102010101021b000005030301
-0101020206ff06ff06e80202010103030101020b0000020305000402000002040500021a
-010102050101020401010201010102020101020e01010205010102010101020201010201
-010102020101020101010201010102010101020101010204010102020101020101010201
-010102010101020601010201010102010101020101010201010102010101020101010201
-010102010102021d010103010101020206ff06ff06e80202010103030101020b00000203
-05000402000002040500021a010102050101020501010200010002030101020e01010205
-010102010101020201010201010102020101020101010201010502010101020401010202
-010502010101020101010206010102010101020101010201010102010101020101010201
-010502020103021b010103010101020206ff06ff06e80202010103030101020b00000204
-05000400000002050500021a0101020501010205010302030101020e0101020501010201
-010102020101020101010202010102010101020101010205010102040101020201010205
-010102010101020601010201010102010101020101010201010102010101020101010208
-0102021a010103010101020206ff06ff06e80202010103030101020b0000020405000400
-000002050500021a0101020501010206010102040101020f010102020100020001010201
-010102020101020101010202010102010101020101010202010002010101020201000200
-010102020101020201000201010102000102020601010201010102010101020101010201
-010102000102020101010202010002050101021a010103010101020206ff06ff06e80202
-010103030101020b00000205000002060500021a01010205010102060101020401010210
-010302020103020301010201010102020101020101010202010302030103020201020201
-010302030101020001010206010102010101020201030203010102000101020201030202
-0104021b010103010101020206ff06ff06e80202010103030101020b0000020d0500021a
-010302110103029a010103010101020206ff06ff06e80202010103030101020b0000020d
-050002cf010103010101020206ff06ff06e80202010103030101020b0000020d050002cf
-010103010101020206ff06ff06e80202010103030101020c050d02d00101030101010202
-06ff06ff06e8020201010303010102eb010103010101020206ff06ff06e8020201010303
-010102eb010103010101020206ff06ff06e8020201010303010102eb0101030101010202
-06ff06ff06e8020201010303010102eb0101030101010202061c01020604010306c10102
-06040103061a0102067f01010605010206f001020604010306190101062f020201010303
-010102eb0101030101010202060e01060608010006060101060f010206010102069b0106
-06080100060601010610010506040101064d010206240104060d0101061e010206240102
-060101020693010606080100060601010611010306350202010103030101020206000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000600000006000000060000000600000002020101030101010202060e
-0100060101010600010006070101060601000611010106010100069d0100060101010600
-010006070101060601000613010106060100064d0101060001010624010106000101060c
-0100061e0101060001010624010106010100069501000601010106000100060701010606
-010006110101060101010634020201010303010102020000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060002020101030101010202061001010603010306020103
-060301010603010306080102060001010601010306000101060001000600010006020103
-068b010106030103060201030603010106030103060a010106030104064c010106010105
-060001030600010206020103060101010600010206070101060101010600010306030104
-061d01010601010506000103060001020602010306010101060001020607010206000101
-060101030600010106000100060001000602010306830101060301030602010306030101
-060301030609010106010100060001030602010506010103062102020101030301010202
-0600000006e2010002020101030101010202061001010606010106000101060101010602
-010106020101060101010607010006000100060001000605010106000105060001010601
-0101068a0101060601010600010106010101060201010602010106010101060901010602
-010106010101064c01000602010106000101060201000600010206000101060001010601
-010106010102060001000607010106010101060201010602010106010101061d01000602
-010106000101060201000600010206000101060001010601010106010102060001000607
-010006000100060001000605010106000105060001010601010106820101060601010600
-010106010101060201010602010106010101060801020604010106020101060001010601
-010106010101062002020101030301010202000006e20100060002020101030101010202
-061001000604010406000101060101010602010106010106060701000600010206020104
-060001010600010006000107068a01000604010406000101060101010602010106010106
-060901010601010106020101064b01010602010006010101060001000600010006000101
-0601010806010101060a0103060401010601010106020101061c01010602010006010101
-0600010006000100060001010601010806010101060a0100060001020602010406000101
-060001000600010706820100060401040600010106010101060201010601010606090102
-0603010106040101060101060620020201010303010102020600000006e2010002020101
-030101010202060f0101060201010601010106000101060201010601010106020101060b
-010106000101060101010601010106010100060001000600010006000101068e01010602
-01010601010106000101060201010601010106020101060d01010602010106010101064c
-010106010101060101020600010006010100060201000600010106050101060a01010606
-01010602010106010101061d010106010101060101020600010006010100060201000600
-010106050101060a01010600010106010101060101010601010006000100060001000600
-010106860101060201010601010106000101060201010601010106020101060b01010601
-0101060201010603010106030101062502020101030301010202000006e2010006000202
-0101030101010202060f0101060201010601010106000101060101010602010106020101
-060101010607010006010101060101010601010106000101060001000600010006000101
-06010101068a010106020101060101010600010106010101060201010602010106010101
-060901010602010106010101064c01010600010106020103060101010601010106000101
-0601010106010101060a0101060601010602010106010101061d01010600010106020103
-0601010106010101060001010601010106010101060a0100060101010601010106010101
-060001010600010006000100060001010601010106820101060201010601010106000101
-060101010602010106020101060101010607010106010101060201010602010206000101
-06000101060101010621020201010303010102020600000006e201000202010103010101
-0202060e01030602010a0601010506010103060701020600010106020107060001000600
-010106000103068a01030602010a06010105060101030608010506010105064c01020603
-01010600010006000103060001020600010306010104060701030603010506010105061d
-010206030101060001000600010306000102060001030601010406070102060001010602
-0107060001000600010106000103068201030602010a0601010506010103060901030601
-010506000105060101030622020201010303010102020000060c07040604070006030702
-06c3010006000202010103010101020206ff06ff06e80202010103030101020206000000
-060b0700060f070006c401000202010103010101020206ff06ff06e80202010103030101
-02020000060c070006060702060507000603070206bc0100060002020101030101010202
-06ff06ff06e80202010103030101020206000000060b0700060807000605070006020700
-0602070006bc01000202010103010101020206ff06ff06e8020201010303010102020000
-060c07030605070006050700060207000602070006bb0100060002020101030101010202
-06ff06ff06e80202010103030101020206000000060b0700060807000605070006020704
-06bc01000202010103010101020206ff06ff06e8020201010303010102020000060c0700
-06080700060507000602070006bf010006000202010103010101020206ff06ff06e80202
-010103030101020206000000060b07000608070006050700060207000602070006bc0100
-02020101030101010202060201ff01ff01e20602020201010303010102020000060c0700
-06080700060507000603070206bc01000600020201010301010102020603010000cb0101
-008101010059010100c30101005801010600010006000100060001000600010006000100
-060001000600010006000100060000000602020201010303010102020600000006e20100
-020201010301010102020603010000cb0101008101010059010100c30101005801000600
-010004060100040600000603020201010303010102020000060b070606cf010006000202
-01010301010102020603010000cb010100810101000c0100002a0100001f010100c30101
-00580101060004050000060004060600000006020202010103030101020206000000060a
-070606d001000202010103010101020206030100001f0100000a0100009e010100810101
-000b0100000301020003010200090104000a010100020100001e0101001e010200050100
-0012010000060100002e010000120102000301020031010100080104004a010006000100
-040506000100060004050000060302020101030301010202000006e20100060002020101
-03010101020206030100001f0100000a0100009e010100810101000a0100000301000002
-0100000101000002010000080100000d01000001010000020100001d0101002001000019
-0100003601000014010000050100003101010008010000020100004a0101060004040600
-0000060001000405060000000602020201010303010102020600000006e2010002020101
-03010101020206030100000901020003010200090104000201020002010000000101009b
-010100810101000901000008010000010100000c0100000d01000001010000030100001c
-010100090102000201000000010100020100000001010005010000030102000301020003
-01020002010400020102000301020002010000000101000a010200030102000201000000
-010100020104000101000000010100030102000501000005010000030102000201000000
-010100230101000c0100004a010006000100040400000602010004040000060302020101
-030301010202000006e20100060002020101030101010202060301000008010000020100
-0001010000020100000a010000030100000201000001010100010100009a010100810101
-000801000009010000010100000c0103000a01000001010000040100001b010100080100
-000201000001010100010100000101010001010000040100000501000002010000020100
-000101000002010000030100000601000002010000020100000101010001010000080100
-000201000001010000020100000101010001010000030100000301010001010000010100
-0002010000040100000501000002010000020100000101010001010000220101000b0100
-004b01010600040300000602010006000404060000000602020201010303010102020600
-000006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010002020101030101010202
-06030100000c010000010100000e0100000701000001010000020100009a010100810101
-000701000009010000020103000d0100000901000001010000050100001a0101000c0100
-000101000002010000010100000201000004010000050100000201000009010000030100
-000601000002010000020100000101000002010000080100000501000002010000010100
-000201000003010000030100000501000002010000040100000501000002010000020100
-0001010000260101000b0100004b01000600010004030600000006020100060004030000
-060302020101030301010202000006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0100060002020101030101010202060301000009010300010100000e0100000401030001
-010000020100009a01010081010100080100000701000003010000020100000c01000009
-01000001010000040100001b010100090103000101000002010000010100000201000004
-010000050100000201000006010300030100000601000002010000020100000101000002
-010000080100000501000002010000010100000201000003010000030100000501000002
-01000004010000050100000201040001010000260101000b0100004b0101060004020600
-00000604010004030600000006020202010103030101020206e502020101030101010202
-06030100000801000002010000010100000e010000030100000201000001010000020100
-009a01010081010100090100000501000004010000020100000801000002010000090100
-0001010000030100001c0101000801000002010000010100000201000001010000020100
-000401000005010000020100000501000002010000030100000601000002010000020100
-000101000002010000080100000501000002010000010100000201000003010000030100
-00050100000201000004010000050100000201000005010000260101000a0100004c0100
-0600010004020000060601000402000006030202010103030101020206e5020201010301
-010102020603010000080100000201000001010000020100000a01000003010000020100
-0001010100010100009a010100810101000a010000030100000501000002010000030101
-000201000002010000030101000301000001010000020100001d01010008010000020100
-000101010001010000010101000101000004010000050100000201000002010000010100
-000201000003010000060100000201000002010000010100000201000008010000020100
-000101000002010000010100000201000003010000030100000501000002010000040100
-0005010000020100000201000001010000260101000a0100004c01010600040100000606
-0100060004020600000006020202010103030101020206e5020201010301010102020603
-01000009010300020102000c0101000201030001010000000101009b010100810101000b
-010000020104000201020004010100030102000401010004010100020100001e01010009
-010300010100000001010002010000000101000501000005010000030102000301030004
-010100040100000301020002010000020100000901020003010200020100000201000004
-010100010100000601020005010000050100000301020002010000260101000a0100004c
-0100060001000401060000000606010006000401000006030202010103030101020206e5
-02020101030101010202060301000015010500af010100810101000c0100002a0100001f
-0101000f010000050100003c010500680101005801010600040006000000060801000401
-0600000006020202010103030101020206e5020201010301010102020603010000cb0101
-0081010100590101000f01000005010000ab0101005801000600010004000000060a0100
-0400000006030202010103030101020206e5020201010301010102020603010000cb0101
-0081010100590101000f01000005010000ab010100580101060000000600010006000100
-060001000600010006000100060001000600040006000000060202020101030301010202
-06e5020201010301010102020603010000cb0101008101010059010100c3010100580100
-060001000600010006000100060001000600010006000100060001000600010006000000
-06030202010103030101020206e5020201010301010102020603010000cb010100810101
-0059010100c30101005801010600040e0600000006020202010103030101020206e50202
-01010301010102020603010000cb0101008101010059010100c301010058010006000100
-060000000600000006000000060000000600000006000000060000000600000006030202
-010103030101020206e5020201010301010102020603010000cb01010081010100590101
-00c301010058010106000000060000000600000006000000060000000600000006000000
-060001000600000006020202010103030101020206e502020101030101010202060301ff
-01ff01ce0600010006000000060a01000600000006030202010103030101020206e50202
-0101030101010202060308cd01ff01ff010106000000060c010006000000060202020101
-03030101020206e5020201010301010102020603080009cb080001000981010109590101
-09c30101095801000600010006000000060a010006000000060302020101030301010202
-06e5020201010301010102020603080009cb08000100090b010109550101091b01010959
-010109c301010958010106000000060c01000600000006020202010103030101020206e5
-020201010301010102020603080009cb08000100090a0100091c01000931010009080100
-091a0101090c0100093101000918010109c30101095801000600010006000000060a0100
-0600000006030202010103030101020206e50202010103010101020206030800091a0800
-09af08000100090a01000905010009050101090c01000903010209030102090a01020902
-0104090a01010902010009070100091a0101090b01000903010209030102090a01020902
-0104090a01010902010009170101091a010009a70101090901020904010109030102093d
-010106000000060c01000600000006020202010103030101020206cf0100060001000600
-010006000100060001000600010006000100060001000600010006040202010103010101
-020206030800091a080009af08000100090a0100090401010904010009010100090a0100
-090301000902010009010100090201000908010009020100090101000902010009090100
-090101000902010009060100091a0101090a010009030100090201000901010009020100
-0908010009020100090101000902010009090100090101000902010009160101091a0100
-09a70101090801000902010009020100090101000901010009020100093c010006000100
-06000000060a01000600000006030202010103030101020206ce01000600010006000100
-060001000600010006000100060001000600010006000100060000000603020201010301
-0101020206030800090908020903080209030801090008000902080209a908000100090a
-010009030100090001000904010009010100090901000908010009010100091001000905
-010009090100090101000903010009050100091a01010909010009080100090101000910
-010009050100090901000901010009030100091501010909010209030102090301010900
-010009020102090a01020903010209020100090001010902010009020100090201020902
-01000900010109700101090c01000902010009010100090101000940010106000000060c
-010006000000060202020101030301010202060500000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000602010004060100040600000604
-020201010301010102020603080009080800090208000901080009020800090108000901
-0801090108000902080009a808000100090a010009050100090401000901010009080100
-09090100090101000910010009040100090a0100090101000904010009040100091a0101
-0908010009090100090101000910010009040100090a0100090101000904010009140101
-090801000902010009010100090201000901010009010101090101000902010009080100
-090201000901010009020100090101010901010009010100090201000901010009020100
-0901010109010100096f0101090c01000902010009010100090101000940010006000100
-06000000060a010006000000060302020101030301010202060501000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000001000000010000000100
-000001000000010000000100000001000000010000000100000106010100060004050000
-060004060600000006030202010103010101020206030800090808000905080009020800
-0901080009020800090108000902080009a8080001000908010109060100090401000901
-0100090701000909010009020103090c010009050100090a010009010100090501000904
-010109180101090701000909010009020103090c010009050100090a0100090101000905
-010009130101090801000905010009020100090101000902010009010100090201000908
-010009050100090201000901010009050100090201000901010009020100090101000973
-0101090b0100090301000901010009010103093d010106000000060c0100060000000602
-0202010103030101020206050000010000c4060201000405060001000600040500000604
-020201010301010102020603080009080800090508000902080009010800090208000901
-080409a808000100090a0100090501000904010009010100090801000907010009030100
-09020100090a010009060100090a0100090101000904010009040100091a010109080100
-090701000903010009020100090a010009060100090a0100090101000904010009140101
-090801000905010009020100090101000902010009010104090901020902010409010100
-0906010009000100090201040901010009730101090a0100090401000901010009010100
-09020100093c01000600010006000000060a010006000000060302020101030301010202
-0605010000c5060101000600040406000000060001000405060000000603020201010301
-010102020603080009080800090508000902080009010800090208000901080009ac0800
-0100090a0100090501000904010009010100090901000905010009040100090201000909
-010009060100090b0100090101000903010009050100091a010109090100090501000904
-0100090201000909010009060100090b0100090101000903010009150101090801000905
-010009020100090101000902010009010100091001000901010009050100090601000900
-01000902010009050100097301010909010009050100090101000901010009020100093c
-010106000000060c01000600000006020202010103030101020206050000010000260100
-009c06020100040400000602010004040000060402020101030101010202060308000908
-08000902080009010800090208000901080009010801090108000902080009a808000100
-090a01000905010009040100090101000903010109040100090301000905010009020100
-0903010109020100090701000905010109030100090101000902010009060100091a0101
-090a01000903010009050100090201000903010109020100090701000905010109030100
-090101000902010009160101090801000902010009010100090201000901010009010101
-090101000902010009080100090201000901010009020100090101000907010009030100
-0902010009010100097301010908010009060100090101000901010009020100093c0100
-0600010006000000060a01000600000006030202010103030101020206050100001a0100
-000a01000000010000180102007f06010100060004030000060201000600040406000000
-060302020101030101010202060308000909080209030802090308010900080009020802
-09a908000100090a01000903010409030101090401010905010009020104090201020904
-0101090201040903010009050101090401010902010009070100091a0101090b01000902
-010409020102090401010902010409030100090501010904010109020100091701010909
-010209030102090301010900010009020102090a01020903010209020100090701000904
-01020902010009730101090801040903010109030102093d010106000000060c01000600
-0000060202020101030301010202060500000100002401000002010000190100007f0602
-0100040306000000060201000600040300000604020201010301010102020603080009cb
-08000100090a010009140100090601000931010009080100091a0101090c010009310100
-091801010923010509990101095801000600010006000000060a01000600000006030202
-010103030101020206050100000901010000010000030102000301020002010000000101
-000201000000010200010101000001000003010200020100000001010005010000030102
-000201000002010000700601010006000402060000000604010004030600000006030202
-01010301010102020603080009cb08000100090b01010910010109420101091b01010959
-010109c301010958010106000000060c0100060000000602020201010303010102020605
-000001000008010000000100000001000001010000020100000401000002010100010100
-000101000000010000000100000101000000010000000100000101000002010000010101
-000101000004010000020100000201000001010000020100007006020100040200000606
-0100040200000604020201010301010102020603080009cb080001000981010109590101
-09c30101095801000600010006000000060a010006000000060302020101030301010202
-060501000009010000000100000001000005010000040100000201000002010000010100
-000001000000010000010100000001000000010000050100000101000008010000020100
-000201000002010000010100007006010100060004010000060601000600040206000000
-0603020201010301010102020603080009cb08000100098101010959010109c301010958
-010106000000060c01000600000006020202010103030101020206050000010000080100
-000001000000010000020103000401000002010000020100000101000000010200010100
-000001000000010000020103000101000008010000020104000201000001010000700602
-0100040106000000060601000600040100000604020201010301010102020603080009cb
-08000100098101010959010109c30101095801000600010006000000060a010006000000
-060302020101030301010202060501000009010000000100000001000001010000020100
-000401000002010000020100000101000005010000000100000001000001010000020100
-000101000008010000020100000701000000010000700601010006000400060000000608
-01000401060000000603020201010301010102020603080009cb08000100098101010959
-010109c301010958010106000000060c0100060000000602020201010303010102020605
-000001000008010000000100000001000001010000020100000401000002010000020100
-000201000001010000010100000001000000010000010100000201000001010000080100
-00020100000201000003010100710602010004000000060a010004000000060402020101
-0301010102020603080009cb08000100098101010959010109c301010958010006000100
-06000000060a010006000000060302020101030301010202060501000009010000000100
-000001000002010300040100000201000002010000030101000201000000010000000100
-000201030001010000080100000301020005010000710601010006000000060001000600
-010006000100060001000600010006000100060004000600000006030202010103010101
-0202060308cd01ff01ff010106000000060c010006000000060202020101030301010202
-060500000100005101000071060201000600010006000100060001000600010006000100
-060001000600010006000000060402020101030101010202060308cd01ff01ff01000600
-010006000000060a01000600000006030202010103030101020206050100004f01000000
-01000072060101000600040e060000000603020201010301010102020603080009cb0800
-0100098101010959010109c301010958010106000000060c010006000000060202020101
-030301010202060500000100004f01000073060201000600000006000000060000000600
-0000060000000600000006000000060000000604020201010301010102020603080009cb
-08000100090b010109550101091b01010959010109c30101095801000600010006000000
-060a0100060000000603020201010303010102020605010000c506010100060000000600
-000006000000060000000600000006000000060000000600010006000000060302020101
-0301010102020603080009cb08000100090a0100091c01000931010009080100091a0101
-090c0100093101000918010109c301010958010106000000060c01000600000006020202
-010103030101020206050000010000c40602010006000000060a01000600000006040202
-010103010101020206030800091a080009af08000100090a01000905010009050100090d
-01000903010209030102090a010209020104090a01010902010009070100091a0101090b
-01000903010209030102090a010209020104090a01010902010009170101091a010009a7
-01010909010209030102094401000600010006000000060a010006000000060302020101
-030301010202060501000001040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000000400000004000000040000000400000004000000040000000400000004000000
-040000020601010006000000060c01000600000006030202010103010101020206030800
-091a080009af08000100090a01000904010109040101090c010009030100090201000901
-010009020100090801000902010009010100090201000909010009010100090201000906
-0100091a0101090a01000903010009020100090101000902010009080100090201000901
-01000902010009090100090101000902010009160101091a010009a70101090801000902
-010009010100090201000943010106000000060c01000600000006020202010103030101
-020206050000010004c200010602010006000000060a0100060000000604020201010301
-010102020603080009090802090308020903080109000800090208020909080009000801
-0903080209020801090008000903080209030802097f08000100090a0100090301000900
-01000903010009000100090b010009080100090101000910010009050100090901000901
-01000903010009050100091a010109090100090801000901010009100100090501000909
-01000901010009030100091501010909010209030102090301010900010009020102090a
-010209030102090201000900010109020100090201000902010209020100090001010970
-0101090c010009050100094301000600010006000000060a010006000000060302020101
-030301010202060501000001044f0100046f010000010601010006000000060c01000600
-000006030202010103010101020206030800090808000902080009010800090208000901
-080009010801090108000902080009080801090108000901080009020800090108000900
-08000900080009010800090208000901080009020800097e08000100090a010009050100
-09050100090a010009090100090101000910010009040100090a01000901010009040100
-09040100091a01010908010009090100090101000910010009040100090a010009010100
-090401000914010109080100090201000901010009020100090101000901010109010100
-090201000908010009020100090101000902010009010101090101000901010009020100
-09010100090201000901010109010100096f0101090c0100090501000943010106000000
-060c0100060000000602020201010303010102020605000001000411010004030100042c
-0100040901000400010004180102045300010602010006000000060a0100060000000604
-020201010301010102020603080009080800090508000902080009010800090208000901
-080009020800090808000902080009050800090108000900080009000800090108000902
-080009010800098208000100090801010906010009050100090901000909010009020103
-090c010009050100090a0100090101000905010009040101091801010907010009090100
-09020103090c010009050100090a01000901010009050100091301010908010009050100
-090201000901010009020100090101000902010009080100090501000902010009010100
-090501000902010009010100090201000901010009730101090a01010904010109440100
-0600010006000000060a0100060000000603020201010303010102020605010000010410
-010004030100042c01000408010004020100041901000452010000010601010006000000
-060c01000600000006030202010103010101020206030800090808000905080009020800
-090108000902080009010804090808000902080009020803090108000900080009000800
-0901080409020802097f08000100090a01000905010009050100090a0100090701000903
-010009020100090a010009060100090a0100090101000904010009040100091a01010908
-0100090701000903010009020100090a010009060100090a010009010100090401000914
-010109080100090501000902010009010100090201000901010409090102090201040901
-01000906010009000100090201040901010009730101090c010009050100094301010600
-0000060c0100060000000602020201010303010102020605000001000409010204020104
-040101000400010104030102040201000400010104090100040001010403010204030101
-040001000402010204020100040001020401010104000100040301020402010004000101
-04050100040301020402010004020100044400010602010006000000060a010006000000
-060402020101030101010202060308000908080009050800090208000901080009020800
-09010800090c080009020800090108000902080009010800090008000900080009010800
-09090800097e08000100090a01000905010009050100090b010009050100090401000902
-01000909010009060100090b0100090101000903010009050100091a0101090901000905
-010009040100090201000909010009060100090b01000901010009030100091501010908
-010009050100090201000901010009020100090101000910010009010100090501000906
-010009000100090201000905010009730101090c01000905010009430100060001000600
-0000060a0100060000000603020201010303010102020605010000010407010004020100
-040301000403010104010100040101000402010004010101040101000408010104010100
-040101000402010004010100040101010401010004020100040101000400010004000100
-040101000400010004000100040101000402010004010101040101000404010004020100
-0402010004010100040201000443010000010601010006000000060c0100060000000603
-020201010301010102020603080009080800090208000901080009020800090108000901
-080109010800090208000908080009020800090108000902080009010800090008000900
-080009010800090208000901080009020800097e08000100090a01000905010009050100
-090501010904010009030100090501000902010009030101090201000907010009050101
-09030100090101000902010009060100091a0101090a0100090301000905010009020100
-090301010902010009070100090501010903010009010100090201000916010109080100
-090201000901010009020100090101000901010109010100090201000908010009020100
-090101000902010009010100090701000903010009020100090101000973010109080100
-0902010009010100090201000943010106000000060c0100060000000602020201010303
-010102020605000001000408010004020100040301000403010004020100040101000402
-010004010100040c01000402010004010100040201000401010004020100040101000402
-010004010100040001000400010004010100040001000400010004050100040101000408
-010004020100040201000402010004010100044400010602010006000000060a01000600
-000006040202010103010101020206030800090908020903080209030801090008000902
-08020909080009020800090208030901080009000800090008000902080209030802097f
-08000100090a010009030104090101040903010109050100090201040902010209040101
-090201040903010009050101090401010902010009070100091a0101090b010009020104
-090201020904010109020104090301000905010109040101090201000917010109090102
-09030102090301010900010009020102090a010209030102090201000907010009040102
-09020100097301010909010209030102094401000600010006000000060a010006000000
-060302020101030301010202060501000001040701000402010004030100040301000402
-01000401010404010100040c010004020100040101000402010004010100040201000401
-010404010100040001020401010004000100040001000402010304010100040801000402
-010404020100040101000443010000010601010006000000060c01000600000006030202
-0101030101010202060308000923080509a108000100090a010009140100090601000931
-010009080100091a0101090c010009310100091801010923010509990101095801010600
-0000060c0100060000000602020201010303010102020605000001000408010004020100
-0403010004030100040201000401010004050100040c0100040201000401010004020100
-040101000402010004010100040501000405010004000100040001000401010004020100
-0401010004080100040201000407010004000100044400010602010006000000060a0100
-060000000604020201010301010102020603080009cb08000100090b0101091001010942
-0101091b01010959010109c30101095801000600010006000000060a0100060000000603
-020201010303010102020605010000010407010004020100040301000403010004020100
-040101000402010004010100040c01000402010004010100040201000401010004010101
-040101000402010004020100040101000401010004000100040001000401010004020100
-04010100040801000402010004020100040301010444010000010601010006000000060c
-0100060000000603020201010301010102020603080009cb080001000981010109590101
-09c301010958010106000000060c01000600000006020202010103030101020206050000
-0100040901020405010104010100040201000402010204020100040c0100040201000402
-010204030101040001000402010204040101040201000400010004000100040201030401
-0100040801000403010204050100044500010602010006000000060a0100060000000604
-020201010301010102020603080009cb08000100098101010959010109c3010109580100
-0600010006000000060a0100060000000603020201010303010102020605010000010429
-0105044a01000444010000010601010006000000060c0100060000000603020201010301
-010102020603080009cb08000100098101010959010109c301010958010106000000060c
-010006000000060202020101030301010202060500000100047801000400010004460001
-0602010006000000060a0100060000000604020201010301010102020603080009cb0800
-0100098101010959010109c30101095801000600010006000000060a0100060000000603
-02020101030301010202060501000001047801000446010000010601010006000000060c
-0100060000000603020201010301010102020603080009cb080001000981010109590101
-09c301010958010106000000060c01000600000006020202010103030101020206050000
-010004c200010602010006000000060a0100060000000604020201010301010102020603
-08cd01ff01ff01000600010006000000060a010006000000060302020101030301010202
-060501000001040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000400
-010004000100040001000400010004000100040001000400010004000100040001000001
-0601010006000000060c010006000000060302020101030101010202060308cd01ff01ff
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a0100060000000604020201010301010102020603080009cb08000100
-098101010959010109c30101095801000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-0301010102020603080009cb08000100090b0101094e0101092201010959010109c30101
-0958010106000000060c01000600000006020202010103030101020206050000010000c4
-0602010006000000060a0100060000000604020201010301010102020603080009cb0800
-0100090a010009150100093101000908010009210101090c0100093101000918010109c3
-0101095801000600010006000000060a0100060000000603020201010303010102020605
-010000c50601010006000000060c01000600000006030202010103010101020206030800
-091d08000908080009a208000100090a010009040102090c01000903010209030102090b
-010009030104090a0101090201000907010009210101090b01000903010209030102090b
-010009030104090a0101090201000917010109180100090a010009220102097701010909
-0102094b010106000000060c010006000000060202020101030301010202060500000100
-00c40602010006000000060a01000600000006040202010103010101020206030800091d
-080009ac08000100090a01000903010009020100090a0100090301000902010009010100
-090201000909010109030100090201000909010009010100090201000906010009210101
-090a01000903010009020100090101000902010009090101090301000902010009090100
-09010100090201000916010109180100090a010009240100097701010908010009020100
-094a01000600010006000000060a01000600000006030202010103030101020206050100
-00c50601010006000000060c010006000000060302020101030101010202060308000909
-080209030802090308020902080009010800090308020903080209030802099408000100
-090a01000903010009020100090901000908010009010100090c01000900010009070100
-0909010009010100090301000905010009210101090901000908010009010100090c0100
-090001000907010009090100090101000903010009150101090801000900010109030102
-090201040908010009010100090301020902010009000101090201000900010109030102
-0905010009770101090c0100094a010106000000060c0100060000000602020201010303
-0101020206050000010000c40602010006000000060a0100060000000604020201010301
-010102020603080009080800090208000901080009020800090108000902080009010800
-090008000906080009020800090208000901080009020800099308000100090a01000903
-010009020100090801000909010009010100090e010009060100090a0100090101000904
-01000904010009210101090801000909010009010100090e010009060100090a01000901
-010009040100091401010908010109010100090101000902010009030100090a01000900
-010009030100090201000901010109010100090101010901010009010100090201000904
-010009770101090c0100094a01000600010006000000060a010006000000060302020101
-0303010102020605010000c50601010006000000060c0100060000000603020201010301
-010102020603080009080800090508000902080009010800090208000901080109070800
-090208000902080009010800099708000100090801010905010209080100090901000902
-0103090b010009060100090a0100090101000905010009040101091f0101090701000909
-010009020103090b010009060100090a0100090101000905010009130101090801000902
-0100090101000902010009030100090a0101090401000902010009010100090501000902
-010009010100090201000904010009770101090b0100094b010106000000060c01000600
-000006020202010103030101020206050000010000c40602010006000000060a01000600
-000006040202010103010101020206030800090808000905080009020800090108000902
-080009010801090708000902080409020802099408000100090a01000903010009020100
-09080100090701000903010009020100090a010009060100090a01000901010009040100
-090401000921010109080100090701000903010009020100090a010009060100090a0100
-09010100090401000914010109080100090201000901010409030100090a010109040104
-090101000905010009020100090101040904010009770101090a0100094c010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c0100060000000603020201010301010102020603080009080800090508000902
-080009010800090208000901080009000800090608000902080009090800099308000100
-090a0100090301000902010009090100090501000904010009020100090a010009050100
-090b01000901010009030100090501000921010109090100090501000904010009020100
-090a010009050100090b0100090101000903010009150101090801000902010009010100
-09070100090a010009000100090301000905010009050100090201000901010009080100
-0977010109090100094d010106000000060c010006000000060202020101030301010202
-06050000010000c40602010006000000060a010006000000060402020101030101010202
-060308000908080009020800090108000902080009010800090208000901080009010800
-0905080009020800090208000901080009020800099308000100090a0100090301000902
-010009030101090401000903010009050100090201000903010109040100090501000905
-01010903010009010100090201000906010009210101090a010009030100090501000902
-010009030101090401000905010009050101090301000901010009020100091601010908
-010009020100090101000902010009030100090a01000901010009020100090201000901
-010009050100090201000901010009020100090401000977010109080100094e01000600
-010006000000060a0100060000000603020201010303010102020605010000c506010100
-06000000060c010006000000060302020101030101010202060308000909080209030802
-090308020902080009020800090408000903080209030802099408000100090a01000904
-010209040101090501000902010409020102090401010902010409030100090501010904
-0101090201000907010009210101090b0100090201040902010209040101090201040903
-010009050101090401010902010009170101090801000902010009020102090501010908
-010009020100090201020902010009050100090201000902010209050100097701010908
-0104094a010106000000060c010006000000060202020101030301010202060500000100
-00c40602010006000000060a0100060000000604020201010301010102020603080009cb
-08000100090a0100090d010009060100093101000908010009210101090c010009310100
-09180101091c010509a00101095801000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-0301010102020603080009cb08000100090b010109090101094201010922010109590101
-09c301010958010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060a01000600000006040202010103010101020206030800
-09cb08000100098101010959010109c30101095801000600010006000000060a01000600
-00000603020201010303010102020605010000c50601010006000000060c010006000000
-0603020201010301010102020603080009cb08000100098101010959010109c301010958
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a0100060000000604020201010301010102020603080009cb08000100
-098101010959010109c30101095801000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-0301010102020603080009cb08000100098101010959010109c301010958010106000000
-060c01000600000006020202010103030101020206050000010000c40602010006000000
-060a0100060000000604020201010301010102020603080009cb08000100098101010959
-010109c30101095801000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-060308cd01ff01ff010106000000060c0100060000000602020201010303010102020605
-0000010000c40602010006000000060a0100060000000604020201010301010102020603
-01ff01ff01ce0600010006000000060a0100060000000603020201010303010102020605
-010000c50601010006000000060c01000600000006030202010103010101020206030100
-00cb0101008101010059010100c301010058010106000000060c01000600000006020202
-010103030101020206050000010000c40602010006000000060a01000600000006040202
-01010301010102020603010000cb0101008101010059010100c301010058010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c0100060000000603020201010301010102020603010000cb010100810101000c
-0100003101000018010100c301010058010106000000060c010006000000060202020101
-03030101020206050000010000c40602010006000000060a010006000000060402020101
-030101010202060301000010010200090100000d0102000a010200100100007b01010081
-0101000b01000003010200030102000b010000050100000c010100020100001701010010
-010200090100000d010200930101000a0101004b01000600010006000000060a01000600
-00000603020201010303010102020605010000c50601010006000000060c010006000000
-060302020101030101010202060301000012010000090100000f0100000c010000100100
-007b010100810101000a0100000301000002010000010100000201000009010100040101
-000b01000001010000020100001601010012010000090100000f01000093010100090100
-00010100004a010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060a01000600000006040202010103010101020206030100
-0009010100000100000401000003010200020100000001010003010200050100000c0100
-000301020003010200020100000101000003010200710101008101010009010000080100
-00010100000c0100000001000003010000000100000b0100000101000003010000150101
-000901010000010000040100000301020002010000000101000301020005010000090100
-0000010100030102000201010000010000030102000a0102000301020002010000000101
-0002010000020100000201020002010000000101003f01010009010000010100004a0100
-0600010006000000060a0100060000000603020201010303010102020605010000c50601
-010006000000060c01000600000006030202010103010101020206030100000801000001
-01010004010000020100000201000001010100010100000101000002010000040100000c
-010000020100000201000001010000020100000101000000010000030100000201000070
-010100810101000801000009010000010100000e010000050100000b0100000101000004
-010000140101000801000001010100040100000201000002010000010101000101000001
-010000020100000401000009010100010100000101000002010000010100000001000000
-010000010100000201000008010000020100000101000002010000010101000101000001
-01000002010000010100000201000001010100010100003e01010009010000010100004a
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a01000600000006040202010103010101020206030100000801000002
-010000040100000201000002010000010100000201000005010000040100000c01000002
-010000020100000101000005010100040100007401010081010100070100000901000002
-0103000b010000050100000b010000010100000501000013010100080100000201000004
-010000020100000201000001010000020100000501000004010000090100000201000005
-010000010100000001000000010000010100000201000008010000050100000201000001
-01000005010000020100000101000002010000010100004201010009010000010100004a
-01000600010006000000060a0100060000000603020201010303010102020605010000c5
-0601010006000000060c0100060000000603020201010301010102020603010000080100
-0002010000040100000201000002010000010100000201000002010300040100000c0100
-000201000002010000010100000501010005010200710101008101010008010000070100
-0003010000020100000a010000050100000b010000010100000401000014010100080100
-000201000004010000020100000201000001010000020100000201030004010000090100
-000201000002010300010100000001000000010000010104000901020002010400010100
-00060100000001000002010400010100004201010009010000010100004a010106000000
-060c01000600000006020202010103030101020206050000010000c40602010006000000
-060a01000600000006040202010103010101020206030100000801000002010000040100
-00020100000201000001010000020100000101000002010000040100000c010000020100
-000201000001010000050100000001000007010000700101008101010009010000050100
-0004010000020100000a010000050100000b010000010100000301000015010100080100
-000201000004010000020100000201000001010000020100000101000002010000040100
-000901000002010000010100000201000001010000000100000001000001010000100100
-000101000005010000060100000001000002010000050100004201010009010000010100
-004a01000600010006000000060a01000600000006030202010103030101020206050100
-00c50601010006000000060c010006000000060302020101030101010202060301000008
-010000010101000401000002010000020100000101010001010000010100000201000004
-0100000c0100000201000002010000010100000201000001010000010100000201000002
-01000070010100810101000a010000030100000501000002010000030101000401000005
-010000050101000301000001010000020100001601010008010000010101000401000002
-010000020100000101010001010000010100000201000004010000090100000201000001
-010000020100000101000000010000000100000101000002010000080100000201000001
-010000020100000101000007010000030100000201000001010000420101000901000001
-0100004a010106000000060c010006000000060202020101030301010202060500000100
-00c40602010006000000060a010006000000060402020101030101010202060301000009
-010100000100000401000003010200020100000001010003010300040100000c01000003
-0102000301020002010000020100000201020071010100810101000b0100000201040002
-010200040101000201040001010400030101000401010002010000170101000901010000
-010000040100000301020002010000000101000301030004010000090100000201000002
-010300010100000001000000010000020102000a01020003010200020100000701000004
-01020002010000420101000a0101004b01000600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000000060c01000600000006030202
-010103010101020206030100000c0100002301050093010100810101000c010000310100
-00180101000c010000230105001c0105006801010058010106000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-06040202010103010101020206030100000801000002010000bd01010081010100590101
-000801000002010000b50101005801000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-030101010202060301000009010200be010100810101005901010009010200b601010058
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a0100060000000604020201010301010102020603010000cb01010081
-01010059010100c30101005801000600010006000000060a010006000000060302020101
-0303010102020605010000c50601010006000000060c0100060000000603020201010301
-010102020603010000cb0101008101010059010100c301010058010106000000060c0100
-0600000006020202010103030101020206050000010000c40602010006000000060a0100
-060000000604020201010301010102020603010000cb0101008101010059010100c30101
-005801000600010006000000060a01000600000006030202010103030101020206050100
-00c50601010006000000060c0100060000000603020201010301010102020603010000cb
-0101008101010059010100c301010058010106000000060c010006000000060202020101
-03030101020206050000010000c40602010006000000060a010006000000060402020101
-030101010202060301ff01ff01ce0600010006000000060a010006000000060302020101
-0303010102020605010000c50601010006000000060c0100060000000603020201010301
-01010202060301ff01ff01cf06000000060c010006000000060202020101030301010202
-06050000010000c40602010006000000060a010006000000060402020101030101010202
-0603010000cb0101008101010059010100c30101005801000600010006000000060a0100
-060000000603020201010303010102020605010000c50601010006000000060c01000600
-00000603020201010301010102020603010000cb0101008101010059010100c301010058
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a0100060000000604020201010301010102020603010000cb01010081
-0101000c0100003101000018010100c30101005801000600010006000000060a01000600
-00000603020201010303010102020605010000c50601010006000000060c010006000000
-060302020101030101010202060301000010010200090100000d0102009b010100810101
-000b01000003010200030102000b010000050100000c0101000201000017010100100102
-00090100000d010200930101000a0101004b010106000000060c01000600000006020202
-010103030101020206050000010000c40602010006000000060a01000600000006040202
-0101030101010202060301000012010000090100000f0100009b010100810101000a0100
-000301000002010000010100000201000009010100040101000b01000001010000020100
-001601010012010000090100000f0100009301010009010000010100004a010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c0100060000000603020201010301010102020603010000090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-01010000010000030102000301020071010100810101000901000008010000010100000c
-0100000001000003010000000100000b0100000101000003010000150101000901010000
-010000040100000301020002010000000101000301020005010000090100000001010003
-0102000201010000010000030102000a0102000301020002010000000101000201000002
-0100000201020002010000000101003f01010009010000010100004a010106000000060c
-01000600000006020202010103030101020206050000010000c40602010006000000060a
-010006000000060402020101030101010202060301000008010000010101000401000002
-010000020100000101010001010000010100000201000004010000090101000101000001
-010000020100000101000000010000000100000101000002010000010100000201000070
-010100810101000801000009010000010100000e010000050100000b0100000101000004
-010000140101000801000001010100040100000201000002010000010101000101000001
-010000020100000401000009010100010100000101000002010000010100000001000000
-010000010100000201000008010000020100000101000002010000010101000101000001
-01000002010000010100000201000001010100010100003e01010009010000010100004a
-01000600010006000000060a0100060000000603020201010303010102020605010000c5
-0601010006000000060c0100060000000603020201010301010102020603010000080100
-000201000004010000020100000201000001010000020100000501000004010000090100
-000201000005010000010100000001000000010000010100000201000001010000740101
-00810101000701000009010000020103000b010000050100000b01000001010000050100
-001301010008010000020100000401000002010000020100000101000002010000050100
-000401000009010000020100000501000001010000000100000001000001010000020100
-000801000005010000020100000101000005010000020100000101000002010000010100
-004201010009010000010100004a010106000000060c0100060000000602020201010303
-0101020206050000010000c40602010006000000060a0100060000000604020201010301
-010102020603010000080100000201000004010000020100000201000001010000020100
-000201030004010000090100000201000002010300010100000001000000010000010104
-00020102007101010081010100080100000701000003010000020100000a010000050100
-000b01000001010000040100001401010008010000020100000401000002010000020100
-000101000002010000020103000401000009010000020100000201030001010000000100
-000001000001010400090102000201040001010000060100000001000002010400010100
-004201010009010000010100004a01000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-030101010202060301000008010000020100000401000002010000020100000101000002
-010000010100000201000004010000090100000201000001010000020100000101000000
-010000000100000101000009010000700101008101010009010000050100000401000002
-0100000a010000050100000b010000010100000301000015010100080100000201000004
-010000020100000201000001010000020100000101000002010000040100000901000002
-010000010100000201000001010000000100000001000001010000100100000101000005
-010000060100000001000002010000050100004201010009010000010100004a01010600
-0000060c01000600000006020202010103030101020206050000010000c4060201000600
-0000060a0100060000000604020201010301010102020603010000080100000101010004
-010000020100000201000001010100010100000101000002010000040100000901000002
-010000010100000201000001010000000100000001000001010000020100000101000002
-01000070010100810101000a010000030100000501000002010000030101000401000005
-010000050101000301000001010000020100001601010008010000010101000401000002
-010000020100000101010001010000010100000201000004010000090100000201000001
-010000020100000101000000010000000100000101000002010000080100000201000001
-010000020100000101000007010000030100000201000001010000420101000901000001
-0100004a01000600010006000000060a0100060000000603020201010303010102020605
-010000c50601010006000000060c01000600000006030202010103010101020206030100
-000901010000010000040100000301020002010000000101000301030004010000090100
-000201000002010300010100000001000000010000020102000301020071010100810101
-000b01000002010400020102000401010002010400010104000301010004010100020100
-001701010009010100000100000401000003010200020100000001010003010300040100
-00090100000201000002010300010100000001000000010000020102000a010200030102
-0002010000070100000401020002010000420101000a0101004b010106000000060c0100
-0600000006020202010103030101020206050000010000c40602010006000000060a0100
-0600000006040202010103010101020206030100000c0100002301050093010100810101
-000c01000031010000180101000c010000230105001c0105006801010058010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c01000600000006030202010103010101020206030100000801000002010000bd
-01010081010100590101000801000002010000b501010058010106000000060c01000600
-000006020202010103030101020206050000010000c40602010006000000060a01000600
-0000060402020101030101010202060301000009010200be010100810101005901010009
-010200b60101005801000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-0603010000cb0101008101010059010100c301010058010106000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-0604020201010301010102020603010000cb0101008101010059010100c3010100580100
-0600010006000000060a0100060000000603020201010303010102020605010000c50601
-010006000000060c0100060000000603020201010301010102020603010000cb01010081
-01010059010100c301010058010106000000060c01000600000006020202010103030101
-020206050000010000c40602010006000000060a01000600000006040202010103010101
-02020603010000cb0101008101010059010100c30101005801000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-06000000060302020101030101010202060301ff01ff01cf06000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-060402020101030101010202060301ff01ff01ce0600010006000000060a010006000000
-0603020201010303010102020605010000c50601010006000000060c0100060000000603
-020201010301010102020603010000cb0101008101010059010100c30101005801010600
-0000060c01000600000006020202010103030101020206050000010000c4060201000600
-0000060a0100060000000604020201010301010102020603010000cb0101008101010059
-010100c30101005801000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-0603010000cb010100810101000c0100003101000018010100c301010058010106000000
-060c01000600000006020202010103030101020206050000010000c40602010006000000
-060a010006000000060402020101030101010202060301000010010200090100000d0102
-004301000056010100810101000b01000003010200030102000b010000050100000c0101
-00020100001701010010010200090100000d010200930101000a0101004b010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c010006000000060302020101030101010202060301000012010000090100000f
-0100004301000056010100810101000a0100000301000002010000010100000201000009
-010100040101000b01000001010000020100001601010012010000090100000f01000093
-01010009010000010100004a010106000000060c01000600000006020202010103030101
-020206050000010000c40602010006000000060a01000600000006040202010103010101
-020206030100000901010000010000040100000301020002010000000101000301020005
-010000090100000001010003010200020101000001000003010200030102000a01020002
-010000020100000101040054010100810101000901000008010000010100000c01000000
-01000003010000000100000b010000010100000301000015010100090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-01010000010000030102000a010200030102000201000000010100020100000201000002
-01020002010000000101003f01010009010000010100004a01000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-060000000603020201010301010102020603010000080100000101010004010000020100
-000201000001010100010100000101000002010000040100000901010001010000010100
-000201000001010000000100000001000001010000020100000101000002010000080100
-000201000001010000020100000301000056010100810101000801000009010000010100
-000e010000050100000b0100000101000004010000140101000801000001010100040100
-000201000002010000010101000101000001010000020100000401000009010100010100
-000101000002010000010100000001000000010000010100000201000008010000020100
-000101000002010000010101000101000001010000020100000101000002010000010101
-00010100003e01010009010000010100004a010106000000060c01000600000006020202
-010103030101020206050000010000c40602010006000000060a01000600000006040202
-010103010101020206030100000801000002010000040100000201000002010000010100
-000201000005010000040100000901000002010000050100000101000000010000000100
-000101000002010000010100000c01000002010000020100000001000004010000560101
-00810101000701000009010000020103000b010000050100000b01000001010000050100
-001301010008010000020100000401000002010000020100000101000002010000050100
-000401000009010000020100000501000001010000000100000001000001010000020100
-000801000005010000020100000101000005010000020100000101000002010000010100
-004201010009010000010100004a01000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-030101010202060301000008010000020100000401000002010000020100000101000002
-010000020103000401000009010000020100000201030001010000000100000001000001
-010400020102000901040003010000050100005601010081010100080100000701000003
-010000020100000a010000050100000b0100000101000004010000140101000801000002
-010000040100000201000002010000010100000201000002010300040100000901000002
-010000020103000101000000010000000100000101040009010200020104000101000006
-0100000001000002010400010100004201010009010000010100004a010106000000060c
-01000600000006020202010103030101020206050000010000c40602010006000000060a
-010006000000060402020101030101010202060301000008010000020100000401000002
-010000020100000101000002010000010100000201000004010000090100000201000001
-010000020100000101000000010000000100000101000009010000080100000601000000
-010000040100005601010081010100090100000501000004010000020100000a01000005
-0100000b0100000101000003010000150101000801000002010000040100000201000002
-010000010100000201000001010000020100000401000009010000020100000101000002
-010000010100000001000000010000010100001001000001010000050100000601000000
-01000002010000050100004201010009010000010100004a01000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-060000000603020201010301010102020603010000080100000101010004010000020100
-000201000001010100010100000101000002010000040100000901000002010000010100
-000201000001010000000100000001000001010000020100000101000002010000080100
-000201000001010000020100000301000056010100810101000a01000003010000050100
-000201000003010100040100000501000005010100030100000101000002010000160101
-000801000001010100040100000201000002010000010101000101000001010000020100
-000401000009010000020100000101000002010000010100000001000000010000010100
-000201000008010000020100000101000002010000010100000701000003010000020100
-00010100004201010009010000010100004a010106000000060c01000600000006020202
-010103030101020206050000010000c40602010006000000060a01000600000006040202
-010103010101020206030100000901010000010000040100000301020002010000000101
-000301030004010000090100000201000002010300010100000001000000010000020102
-00030102000a01020002010000020100000401010054010100810101000b010000020104
-000201020004010100020104000101040003010100040101000201000017010100090101
-000001000004010000030102000201000000010100030103000401000009010000020100
-0002010300010100000001000000010000020102000a0102000301020002010000070100
-000401020002010000420101000a0101004b01000600010006000000060a010006000000
-0603020201010303010102020605010000c50601010006000000060c0100060000000603
-0202010103010101020206030100000c010000230105002301050069010100810101000c
-01000031010000180101000c010000230105001c0105006801010058010106000000060c
-01000600000006020202010103030101020206050000010000c40602010006000000060a
-01000600000006040202010103010101020206030100000801000002010000bd01010081
-010100590101000801000002010000b50101005801000600010006000000060a01000600
-00000603020201010303010102020605010000c50601010006000000060c010006000000
-060302020101030101010202060301000009010200be0101008101010059010100090102
-00b601010058010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060a01000600000006040202010103010101020206030100
-00cb0101008101010059010100c30101005801000600010006000000060a010006000000
-0603020201010303010102020605010000c50601010006000000060c0100060000000603
-020201010301010102020603010000cb0101008101010059010100c30101005801010600
-0000060c01000600000006020202010103030101020206050000010000c4060201000600
-0000060a0100060000000604020201010301010102020603010000cb0101008101010059
-010100c30101005801000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-0603010000cb0101008101010059010100c301010058010106000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-060402020101030101010202060301ff01ff01ce0600010006000000060a010006000000
-0603020201010303010102020605010000c50601010006000000060c0100060000000603
-02020101030101010202060301ff01ff01cf06000000060c010006000000060202020101
-03030101020206050000010000c40602010006000000060a010006000000060402020101
-0301010102020603010000cb0101008101010059010100c3010100580100060001000600
-0000060a0100060000000603020201010303010102020605010000c50601010006000000
-060c0100060000000603020201010301010102020603010000cb01010081010100590101
-00c301010058010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060a01000600000006040202010103010101020206030100
-00cb010100810101000c0100003101000018010100c30101005801000600010006000000
-060a0100060000000603020201010303010102020605010000c50601010006000000060c
-01000600000006030202010103010101020206030100000b010000120100001f01000089
-010100810101000b01000003010200030102000b010000040102000b0101000201000017
-0101000b010000120100000e010000010100008f0101000a0101004b010106000000060c
-01000600000006020202010103030101020206050000010000c40602010006000000060a
-01000600000006040202010103010101020206030100001f0100001f0100008901010081
-0101000a0100000301000002010000010100000201000009010100030100000201000009
-0100000101000002010000160101001f0100000e010000010100008f0101000901000001
-0100004a01000600010006000000060a0100060000000603020201010303010102020605
-010000c50601010006000000060c01000600000006030202010103010101020206030100
-000901020002010000000101000301020002010400090102000301020003010200020100
-0000010100030102007f010100810101000901000008010000010100000c010000000100
-000701000009010000010100000301000015010100090102000201000000010100030102
-0002010400090101000001000001010000000101008c01010009010000010100004a0101
-06000000060c01000600000006020202010103030101020206050000010000c406020100
-06000000060a01000600000006040202010103010101020206030100000b010000020101
-00010100000101000002010000030100000a010000020100000101000002010000010100
-0002010000010101000101000001010000020100007e0101008101010008010000090100
-00010100000e01000007010000090100000101000004010000140101000b010000020101
-00010100000101000002010000030100000a0100000101010001010100010100008b0101
-0009010000010100004a01000600010006000000060a0100060000000603020201010303
-010102020605010000c50601010006000000060c01000600000006030202010103010101
-020206030100000b01000002010000020100000101000002010000030100000a01000009
-01000001010000050100000201000001010000020100007e010100810101000701000009
-010000020103000b010000060100000a0100000101000005010000130101000b01000002
-010000020100000101000002010000030100000a0100000201000001010000020100008b
-01010009010000010100004a010106000000060c01000600000006020202010103030101
-020206050000010000c40602010006000000060a01000600000006040202010103010101
-020206030100000b010000020100000201000001010400030100000a0100000601030001
-0100000501000002010000010104007e0101008101010008010000070100000301000002
-0100000a010000050100000b0100000101000004010000140101000b0100000201000002
-01000001010400030100000a0100000201000001010000020100008b0101000901000001
-0100004a01000600010006000000060a0100060000000603020201010303010102020605
-010000c50601010006000000060c01000600000006030202010103010101020206030100
-000b010000020100000201000001010000070100000a0100000501000002010000010100
-000501000002010000010100008201010081010100090100000501000004010000020100
-000a010000040100000c0100000101000003010000150101000b01000002010000020100
-0001010000070100000a0100000201000001010000020100008b01010009010000010100
-004a010106000000060c01000600000006020202010103030101020206050000010000c4
-0602010006000000060a01000600000006040202010103010101020206030100000b0100
-0002010000020100000101000002010000030100000a0100000201000001010000020100
-000101000002010000010100000201000001010000020100007e010100810101000a0100
-000301000005010000020100000301010004010000030100000701010003010000010100
-0002010000160101000b01000002010000020100000101000002010000030100000a0100
-000101010001010100010100008b01010009010000010100004a01000600010006000000
-060a0100060000000603020201010303010102020605010000c50601010006000000060c
-01000600000006030202010103010101020206030100000b010000020100000201000002
-010200050101000901020003010300020102000201000002010000020102007f01010081
-0101000b0100000201040002010200040101000201040001010400030101000401010002
-010000170101000b01000002010000020100000201020005010100090101000001000001
-010000000101008c0101000a0101004b010106000000060c010006000000060202020101
-03030101020206050000010000c40602010006000000060a010006000000060402020101
-030101010202060301000023010500a1010100810101000c010000310100001801010023
-010500990101005801000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-0603010000cb0101008101010059010100c301010058010106000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-0604020201010301010102020603010000cb0101008101010059010100c3010100580100
-0600010006000000060a0100060000000603020201010303010102020605010000c50601
-010006000000060c0100060000000603020201010301010102020603010000cb01010081
-01010059010100c301010058010106000000060c01000600000006020202010103030101
-020206050000010000c40602010006000000060a01000600000006040202010103010101
-02020603010000cb0101008101010059010100c30101005801000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-060000000603020201010301010102020603010000cb0101008101010059010100c30101
-0058010106000000060c01000600000006020202010103030101020206050000010000c4
-0602010006000000060a0100060000000604020201010301010102020603010000cb0101
-008101010059010100c30101005801000600010006000000060a01000600000006030202
-01010303010102020605010000c50601010006000000060c010006000000060302020101
-030101010202060301ff01ff01cf06000000060c01000600000006020202010103030101
-020206050000010000c40602010006000000060a01000600000006040202010103010101
-0202060301ff01ff01ce0600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-0603010000cb0101008101010059010100c301010058010106000000060c010006000000
-06020202010103030101020206050000010000c40602010006000000060a010006000000
-0604020201010301010102020603010000cb0101008101010059010100c3010100580100
-0600010006000000060a0100060000000603020201010303010102020605010000c50601
-010006000000060c0100060000000603020201010301010102020603010000cb01010081
-0101000c0100003101000018010100c301010058010106000000060c0100060000000602
-0202010103030101020206050000010000c40602010006000000060a0100060000000604
-0202010103010101020206030100000b010000120100000e010000010100009701010081
-0101000b01000003010200030102000b010000040102000b01010002010000170101000b
-010000120100000e010000010100008f0101000a01000004010200440100060001000600
-0000060a0100060000000603020201010303010102020605010000c50601010006000000
-060c01000600000006030202010103010101020206030100001f0100000e010000010100
-0097010100810101000a0100000301000002010000010100000201000009010100030100
-0002010000090100000101000002010000160101001f0100000e010000010100008f0101
-0009010100030100000201000043010106000000060c0100060000000602020201010303
-0101020206050000010000c40602010006000000060a0100060000000604020201010301
-010102020603010000090102000201000000010100030102000201040009010100000100
-00010100000001010094010100810101000901000008010000010100000c010000000100
-000701000009010000010100000301000015010100090102000201000000010100030102
-0002010400090101000001000001010000000101008c0101000801000000010000030100
-00020100004301000600010006000000060a010006000000060302020101030301010202
-0605010000c50601010006000000060c0100060000000603020201010301010102020603
-0100000b01000002010100010100000101000002010000030100000a0100000101010001
-0101000101000093010100810101000801000009010000010100000e0100000701000009
-0100000101000004010000140101000b0100000201010001010000010100000201000003
-0100000a0100000101010001010100010100008b0101000a010000030100000201000043
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a01000600000006040202010103010101020206030100000b01000002
-010000020100000101000002010000030100000a01000002010000010100000201000093
-010100810101000701000009010000020103000b010000060100000a0100000101000005
-010000130101000b01000002010000020100000101000002010000030100000a01000002
-01000001010000020100008b0101000a010000040103004301000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-0600000006030202010103010101020206030100000b0100000201000002010000010104
-00030100000a010000020100000101000002010000930101008101010008010000070100
-0003010000020100000a010000050100000b0100000101000004010000140101000b0100
-00020100000201000001010400030100000a0100000201000001010000020100008b0101
-000a0100000701000043010106000000060c010006000000060202020101030301010202
-06050000010000c40602010006000000060a010006000000060402020101030101010202
-06030100000b010000020100000201000001010000070100000a01000002010000010100
-00020100009301010081010100090100000501000004010000020100000a010000040100
-000c0100000101000003010000150101000b010000020100000201000001010000070100
-000a0100000201000001010000020100008b0101000a0100000701000043010006000100
-06000000060a0100060000000603020201010303010102020605010000c5060101000600
-0000060c01000600000006030202010103010101020206030100000b0100000201000002
-0100000101000002010000030100000a0100000101010001010100010100009301010081
-0101000a0100000301000005010000020100000301010004010000030100000701010003
-0100000101000002010000160101000b0100000201000002010000010100000201000003
-0100000a0100000101010001010100010100008b0101000a010000030100000201000043
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a01000600000006040202010103010101020206030100000b01000002
-010000020100000201020005010100090101000001000001010000000101009401010081
-0101000b0100000201040002010200040101000201040001010400030101000401010002
-010000170101000b01000002010000020100000201020005010100090101000001000001
-010000000101008c01010008010400020102004401000600010006000000060a01000600
-00000603020201010303010102020605010000c50601010006000000060c010006000000
-060302020101030101010202060301000023010500a1010100810101000c010000310100
-0018010100230105009901010058010106000000060c0100060000000602020201010303
-0101020206050000010000c40602010006000000060a0100060000000604020201010301
-010102020603010000cb0101008101010059010100c30101005801000600010006000000
-060a0100060000000603020201010303010102020605010000c50601010006000000060c
-0100060000000603020201010301010102020603010000cb0101008101010059010100c3
-01010058010106000000060c010006000000060202020101030301010202060500000100
-00c40602010006000000060a0100060000000604020201010301010102020603010000cb
-0101008101010059010100c30101005801000600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000000060c01000600000006030202
-01010301010102020603010000cb0101008101010059010100c301010058010106000000
-060c01000600000006020202010103030101020206050000010000c40602010006000000
-060a0100060000000604020201010301010102020603010000cb01010081010100590101
-00c30101005801000600010006000000060a010006000000060302020101030301010202
-0605010000c50601010006000000060c0100060000000603020201010301010102020603
-010000cb0101008101010059010100c301010058010106000000060c0100060000000602
-0202010103030101020206050000010000c40602010006000000060a0100060000000604
-02020101030101010202060301ff01ff01ce0600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000000060c01000600000006030202
-0101030101010202060301ff01ff01cf06000000060c0100060000000602020201010303
-0101020206050000010000c40602010006000000060a0100060000000604020201010301
-010102020603010000cb0101008101010059010100c30101005801000600010006000000
-060a0100060000000603020201010303010102020605010000c50601010006000000060c
-0100060000000603020201010301010102020603010000cb0101008101010059010100c3
-01010058010106000000060c010006000000060202020101030301010202060500000100
-00c40602010006000000060a0100060000000604020201010301010102020603010000cb
-010100810101000c0100003101000018010100c30101005801000600010006000000060a
-0100060000000603020201010303010102020605010000c50601010006000000060c0100
-0600000006030202010103010101020206030100000b010000120100000a010000150100
-0087010100810101000b01000003010200030102000b010000040102000b010100020100
-00170101000b010000120100000e010000010100008f0101000c0100004a010106000000
-060c01000600000006020202010103030101020206050000010000c40602010006000000
-060a01000600000006040202010103010101020206030100001f0100000a010000150100
-0087010100810101000a0100000301000002010000010100000201000009010100030100
-0002010000090100000101000002010000160101001f0100000e010000010100008f0101
-000b0101004a01000600010006000000060a010006000000060302020101030301010202
-0605010000c50601010006000000060c0100060000000603020201010301010102020603
-010000090102000201000000010100030102000201040008010000000101000301020003
-01020002010400020102007f010100810101000901000008010000010100000c01000000
-010000070100000901000001010000030100001501010009010200020100000001010003
-01020002010400090101000001000001010000000101008c0101000a010000000100004a
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a01000600000006040202010103010101020206030100000b01000002
-010100010100000101000002010000030100000a01010001010000010100000201000001
-010000020100000301000003010000020100007e01010081010100080100000901000001
-0100000e01000007010000090100000101000004010000140101000b0100000201010001
-0100000101000002010000030100000a0100000101010001010100010100008b01010009
-010000010100004a01000600010006000000060a01000600000006030202010103030101
-02020605010000c50601010006000000060c010006000000060302020101030101010202
-06030100000b01000002010000020100000101000002010000030100000a010000020100
-000101000002010000010100000701000003010000820101008101010007010000090100
-00020103000b010000060100000a0100000101000005010000130101000b010000020100
-00020100000101000002010000030100000a0100000201000001010000020100008b0101
-0008010000020100004a010106000000060c010006000000060202020101030301010202
-06050000010000c40602010006000000060a010006000000060402020101030101010202
-06030100000b010000020100000201000001010400030100000a01000002010000010100
-00020100000201020004010000040102007f010100810101000801000007010000030100
-00020100000a010000050100000b0100000101000004010000140101000b010000020100
-000201000001010400030100000a0100000201000001010000020100008b010100080100
-00020100004a01000600010006000000060a010006000000060302020101030301010202
-0605010000c50601010006000000060c0100060000000603020201010301010102020603
-0100000b010000020100000201000001010000070100000a010000020100000101000002
-0100000501000003010000070100007e0101008101010009010000050100000401000002
-0100000a010000040100000c0100000101000003010000150101000b0100000201000002
-01000001010000070100000a0100000201000001010000020100008b0101000801050049
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000000060a01000600000006040202010103010101020206030100000b01000002
-010000020100000101000002010000030100000a01000002010000010100000201000001
-010000020100000301000003010000020100007e010100810101000a0100000301000005
-010000020100000301010004010000030100000701010003010000010100000201000016
-0101000b01000002010000020100000101000002010000030100000a0100000101010001
-010100010100008b0101000c0100004a01000600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000000060c01000600000006030202
-010103010101020206030100000b01000002010000020100000201020005010100080100
-0002010000020102000301020005010100020102007f010100810101000b010000020104
-0002010200040101000201040001010400030101000401010002010000170101000b0100
-0002010000020100000201020005010100090101000001000001010000000101008c0101
-000c0100004a010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060a01000600000006040202010103010101020206030100
-0023010500a1010100810101000c01000031010000180101002301050099010100580100
-0600010006000000060a0100060000000603020201010303010102020605010000c50601
-010006000000060001000600010006000100060001000600010006000100060001000600
-00000603020201010301010102020603010000cb0101008101010059010100c301010058
-010106000000060c01000600000006020202010103030101020206050000010000c40602
-010006000100060001000600010006000100060001000600010006000100060000000604
-020201010301010102020603010000cb0101008101010059010100c30101005801000600
-010006000000060a0100060000000603020201010303010102020605010000c506010100
-0600040e060000000603020201010301010102020603010000cb01010081010100590101
-00c301010058010106000000060c01000600000006020202010103030101020206050000
-010000c40602010006000000060000000600000006000000060000000600000006000000
-060000000604020201010301010102020603010000cb0101008101010059010100c30101
-005801000600010006000000060a01000600000006030202010103030101020206050100
-00c506010100060004000600000006000000060000000600000006000000060000000600
-0100060000000603020201010301010102020603010000cb0101008101010059010100c3
-01010058010106000000060c010006000000060202020101030301010202060500000100
-00c40602010004000000060a0100040000000604020201010301010102020603010000cb
-0101008101010059010100c30101005801000600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000401000006080100060004000600
-0000060302020101030101010202060301ff01ff01cf06000000060c0100060000000602
-0202010103030101020206050000010000c4060201000401060000000606010006000401
-0000060402020101030101010202060301ff01ff01ce0600010006000000060a01000600
-00000603020201010303010102020605010000c506010100060004020600000006060100
-0401060000000603020201010301010102020603010000cb0101008101010059010100c3
-01010058010106000000060c010006000000060202020101030301010202060500000100
-00c4060201000402000006060100040200000604020201010301010102020603010000cb
-0101008101010059010100c30101005801000600010006000000060a0100060000000603
-020201010303010102020605010000c50601010006000403000006040100060004020600
-00000603020201010301010102020603010000cb010100810101000c0100003101000018
-010100c301010058010106000000060c0100060000000602020201010303010102020605
-0000010000c4060201000403060000000602010006000403000006040202010103010101
-0202060301000028010000040100000b0100008e010100810101000b0100000301020003
-0102000b010000030104000a0101000201000017010100180100000a0100002201020077
-0101000a0100004c01000600010006000000060a01000600000006030202010103030101
-02020605010000c506010100060004040600000006020100040306000000060302020101
-030101010202060301000028010000110100008e010100810101000a0100000301000002
-010000010100000201000009010100030100000201000009010000010100000201000016
-010100180100000a0100002401000077010100090101004c010106000000060c01000600
-000006020202010103030101020206050000010000c40602010004040000060201000404
-00000604020201010301010102020603010000090102000201000002010000020102000a
-010100000100000201020003010200020104008c01010081010100090100000801000001
-0100000c0100000001000007010000090100000101000003010000150101000801000000
-010100030102000201040008010000010100000301020002010000000101000201000000
-01010003010200050100007701010008010000000100004c01000600010006000000060a
-0100060000000603020201010303010102020605010000c5060101000600040500000600
-010006000404060000000603020201010301010102020603010000080100000201000001
-010000020100000101000002010000080100000101010004010000020100000201000003
-0100008e010100810101000801000009010000010100000e010000060100000a01000001
-010000040100001401010008010100010100000101000002010000030100000a01000000
-010000030100000201000001010100010100000101010001010000010100000201000004
-010000770101000a0100004c010106000000060c01000600000006020202010103030101
-020206050000010000c40602010004050600010006000405000006040202010103010101
-02020603010000080100000601000001010000010100000c010000020100000401000002
-010000070100008e010100810101000701000009010000020103000b010000060100000a
-01000001010000050100001301010008010000020100000101000002010000030100000a
-010100040100000201000001010000050100000201000001010000020100000401000077
-0101000a0100004c01000600010006000000060a01000600000006030202010103030101
-02020605010000c506010100060004060600010004050600000006030202010103010101
-020206030100000901020003010000010100000201020009010000020100000401000003
-010200040100008e01010081010100080100000701000003010000020100000a01000006
-0100000a010000010100000401000014010100080100000201000001010400030100000a
-010100040104000101000005010000020100000101040004010000770101000a0100004c
-010106000000060c010006000000060202020101030301010202060500c6060201000406
-01000406000006040202010103010101020206030100000c010000030100000001000005
-01000008010000020100000401000006010000030100008e010100810101000901000005
-01000004010000020100000a010000050100000b01000001010000030100001501010008
-0100000201000001010000070100000a0100000001000003010000050100000501000002
-0100000101000008010000770101000a0100004c01000600010006000000060a01000600
-000006030202010103030101020206ce0100060000000600000006000000060000000600
-000006000000060000000600000006000000060302020101030101010202060301000008
-010000020100000301010002010000020100000801000001010100040100000201000002
-010000030100008e010100810101000a0100000301000005010000020100000301010004
-010000050100000501010003010000010100000201000016010100080100000201000001
-01000002010000030100000a010000010100000201000002010000010100000501000002
-010000010100000201000004010000770101000a0100004c010106000000060c01000600
-000006020202010103030101020206cf0000060000000600000006000000060000000600
-000006000000060000000600000006040202010103010101020206030100000901020005
-010000030102000a010100000100000401000003010200050101008c010100810101000b
-010000020104000201020004010100020104000301000005010100040101000201000017
-010100080100000201000002010200050101000801000002010000020102000201000005
-01000002010000020102000501000077010100080104004a01000600010006000000060a
-010006000000060302020101030301010202060401000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000613
-0202010103010101020206030100001201000008010500a8010100810101000c01000031
-010000180101001c010500a001010058010106000000060c010006000000060202020101
-030301010202060301000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600000006120202010103010101
-020206030100000f01000000010000b80101008101010059010100c30101005801000600
-010006000000060a01000600000006030202010103030101020206040100040d06000400
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600040006000000040c00000613020201010301
-01010202060301000010010000b90101008101010059010100c301010058010106000000
-060c010006000000060202020101030301010202060301000600040b0000060001000400
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-00000600000006000000060000000600010004000000060000000600040a060000000612
-020201010301010102020603010000cb0101008101010059010100c30101005801000600
-010006000000060a01000600000006030202010103030101020206040100040906000000
-06000100060004000600000006a601000600040006000000060000000600000004080000
-0613020201010301010102020603010000cb0101008101010059010100c3010100580101
-06000000060c010006000000060202020101030301010202060301000600040700000600
-0000060201000400000006a8010004000000060200000600000006000406060000000612
-020201010301010102020603010000cb0101008101010059010100c30101005801000600
-010006000000060a01000600000006030202010103030101020206040100040506000000
-0600000006020100060004000600000006a6010006000400060000000604000006000000
-040400000613020201010301010102020603010000cb0101008101010059010100c30101
-0058010106000000060c0100060000000602020201010303010102020603010006000403
-000006000000060601000400000006a80100040000000606000006000000060004020600
-0000061202020101030101010202060301ff01ff01ce0600010006000000060a01000600
-000006030202010103030101020206040100040106000000060000000606010006000400
-0600000006a6010006000400060000000608000006000000040000000613020201010301
-01010202060301ff01ff01cf06000000060c010006000000060202020101030301010202
-060301000600010006000100060a01000400000006a8010004000000060a010006000100
-060000000612020201010301010102020603010000cb0101008101010059010100c30101
-005801000600010006000000060a01000600000006030202010103030101020206040100
-0401060001000600010006060100060004000600000006a6010006000400060000000608
-010006000100040000000613020201010301010102020603010000cb0101008101010059
-010100c301010058010106000000060c0100060000000602020201010303010102020603
-010006000403010006000100060601000400000006a80100040000000606010006000100
-06000402060000000612020201010301010102020603010000cb01010081010100590101
-00c30101005801000600010006000000060a010006000000060302020101030301010202
-060401000405060001000600010006020100060004000600000006a60100060004000600
-00000604010006000100040400000613020201010301010102020603010000cb01010081
-01010059010100c301010058010106000000060c01000600000006020202010103030101
-02020603010006000407010006000100060201000400000006a801000400000006020100
-0600010006000406060000000612020201010301010102020603010000cb010100810101
-0059010100c30101005801000600010006000000060a0100060000000603020201010303
-010102020604010004090600010006000100060004000600000006a60100060004000600
-00000600010006000100040800000613020201010301010102020603010000cb01010081
-01010059010100c301010058010106000000060c01000600000006020202010103030101
-0202060301000600040b0100060001000400000006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-04000000060001000600040a060000000612020201010301010102020603010000cb0101
-008101010059010100c30101005801000600010006000000060a01000600000006030202
-010103030101020206040100040d06000400060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-040006000100040c00000613020201010301010102020603010000cb0101008101010059
-010100c301010058010106000000060c0100060000000602020201010303000406030100
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-06000000060000000600000006000000061200040301010102020603010000cb01010081
-01010059010100c30101005801000600010006000000060a010006000000060302020101
-030300000202050006040000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000061300000202050003010101
-02020603010000cb0101008101010059010100c301010058010106000000060c01000600
-0000060202020101030300000202050006e50000020205000301010102020603010000cb
-0101008101010059010100c30101005801000600010006000000060a0100060000000603
-02020101030300000202050006e50000020205000301010102020603010000cb01010081
-01010059010100c301010058010106000000060c01000600000006020202010103030000
-0202050006e50000020205000301010102020603010000cb0101008101010059010100c3
-0101005801000600010006000000060a0100060000000603020201010303000002020500
-06e50000020205000301010102020603010000cb0101008101010059010100c301010058
-010106000000060c0100060000000602020201010303000002020500000502d900060202
-05000301010102020603010000cb0101008101010059010100c301010058010006000100
-06000000060a010006000000060302020101030300000208050002d90000020805000301
-010102020603010000cb0101008101010059010100c301010058010106000000060c0100
-06000000060202020101030300000208050002d900000208050003010101020206030100
-00cb0101008101010059010100c30101005801000600010006000000060a010006000000
-060302020101030300000208050001d90000020805000301010102020603010000cb0101
-008101010059010100c30101005801010600000006000100060001000600010006000100
-0600010006000100060001000600000006020202010103030000050901d9000005090301
-010102020603010000cb0101008101010059010100c30101005801000600010006000100
-0600010006000100060001000600010006000100060001000600000006030202010103f5
-01010202060301ff01ff01cf0600040e0600000006020202010103f501010202060301ff
-01ff01ce06000100040e000006030202010103f5010102020603010000cb010100810101
-0059010100c30101005801010600040e0600000006020202010103f50101020206030100
-00cb0101008101010059010100c301010058010006000100040e000006030202010103f5
-010102020603010000cb0101008101010059010100c30101005801010600040e06000000
-06020202010103f5010102020603010000cb0101008101010059010100c3010100580100
-06000100040e000006030202010103f5010102020603010000cb01010081010100590101
-00c30101005801010600040e0600000006020202010103f5010102020603010000cb0101
-008101010059010100c301010058010006000100040e000006030202010103f501010202
-0603010000cb0101008101010059010100c30101005801010600040e0600000006020202
-010103f5010102020603010000cb0101008101010059010100c301010058010006000100
-040e000006030202010103f5010102020603010000cb0101008101010059010100c30101
-005801010600040e0600000006020202010103f5010102020603010000cb010100810101
-0059010100c301010058010006000100040e000006030202010103f50101020206030100
-00cb0101008101010059010100c30101005801010600040e0600000006020202010103f5
-010102020603010000cb0101008101010059010100c301010058010006000100040e0000
-06030202010103f5010102020603010000cb0101008101010059010100c3010100580101
-0600040e0600000006020202010103f5010102020603010000cb01010081010100590101
-00c301010058010006000100040e000006030202010103f5010102020603010000cb0101
-008101010059010100c30101005801010600040e0600000006020202010103f501010202
-0603010000cb0101008101010059010100c301010058010006000100040e000006030202
-010103f5010102020603010000cb0101008101010059010100c30101005801010600040e
-0600000006020202010103f5010102020603010000cb0101008101010059010100c30101
-0058010006000100040e000006030202010103f5010102020603010000cb010100810101
-0059010100c30101005801010600040e0600000006020202010103f501010202060301ff
-01ff01ce06000100040e000006030202010103f501010202060301ff01ff01cf06000000
-060000000600000006000000060000000600000006000000060000000600000006020202
-010103f5010102020603010000cb0101008101010059010100c301010058010006000100
-040000000600000006000000060000000600000006000000060000000600000006030202
-010103f5010102020603010000cb0101008101010059010100c301010058010106000400
-0600000006080100060004000600000006020202010103f5010102020603010000cb0101
-008101010059010100c30101005801000600010004010600000006080100040000000603
-0202010103f5010102020603010000cb0101008101010059010100c30101005801010600
-040100000608010004010600000006020202010103f5010102020603010000cb01010081
-01010059010100c301010058010006000100040200000606010006000401000006030202
-010103f5010102020603010000cb0101008101010059010100c301010058010106000402
-0600000006040100060004020600000006020202010103f5010102020603010000cb0101
-008101010059010100c30101005801000600010004030600000006040100040200000603
-0202010103f5010102020603010000cb0101008101010059010100c30101005801010600
-040300000604010004030600000006020202010103f5010102020603010000cb01010081
-01010059010100c301010058010006000100040400000602010006000403000006030202
-010103f5010102020603010000cb0101008101010059010100c301010058010106000404
-0600000006000100060004040600000006020202010103f5010102020603010000cb0101
-008101010059010100c30101005801000600010004050600010006000100040400000603
-0202010103f5010102020603010000cb0101008101010059010100c30101005801010600
-040500000600010004050600000006020202010103f5010102020603010000cb01010081
-01010059010100c3010100580100060001000406010006000405000006030202010103f5
-010102020603010000cb0101008101010059010100c30101005801010600040606000406
-0600000006020202010103f5010102020603010000cb0101008101010059010100c30101
-005801000600010006000000060000000600000006000000060000000600000006000000
-0600000006030202010103f5010102020603010000cb0101008101010059010100c30101
-005801010600000006000000060000000600000006000000060000000600000006000000
-0600000006020202010103f5010102020603010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-06000100060001000600010006000100060001000600010006110202010103f501010202
-060201000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006000100060001000600010006000100060001000600010006000100
-060001000600010006120202010103f50101020206030100040d06000400060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-0000040000000600040c0600000006110202010103f501010202060201000600040b0000
-060001000400000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060000000600000006000000060000000600000006000000
-060000000600000006000000060004000600000006000000040a000006120202010103f5
-010102020603010004090600000006000100060004000600000006ff06ff06ac01000400
-00000600000006000000060004080600000006110202010103f501010202060201000600
-0407000006000000060201000400000006ff06ff06ac0100060004000600000006020000
-060000000406000006120202010103f50101020206030100040506000000060000000602
-0100060004000600000006ff06ff06ac0100040000000604000006000000060004040600
-000006110202010103f50101020206020100060004030000060000000606010004000000
-06ff06ff06ac0100060004000600000006060000060000000402000006120202010103f5
-01010202060301000401060000000600000006060100060004000600000006ff06ff06ac
-0100040000000608000006000000060004000600000006110202010103f5010102020602
-01000600010006000100060a01000400000006ff06ff06ac010006000400060000000608
-0100060001000600000006120202010103f5010102020603010004010600010006000100
-06060100060004000600000006ff06ff06ac010004000000060801000600010006000400
-0600000006110202010103f5010102020602010006000403010006000100060601000400
-000006ff06ff06ac01000600040006000000060601000600010004020000061202020101
-03f501010202060301000405060001000600010006020100060004000600000006ff06ff
-06ac0100040000000604010006000100060004040600000006110202010103f501010202
-0602010006000407010006000100060201000400000006ff06ff06ac0100060004000600
-000006020100060001000406000006120202010103f50101020206030100040906000100
-06000100060004000600000006ff06ff06ac010004000000060001000600010006000408
-0600000006110202010103f501010202060201000600040b010006000100040000000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-0100060004000600000006000100040a000006120202010103f5000406030100040d0600
-040006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-010006000100060001000600010006000100060001000600010006000100060001000600
-01000600010006000100040000000600040c060000000611000403f50000020205000602
-010006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000061200000202050003f50000020205000603000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000060000000600
-000006000000060000000600000006000000060000000600000006000000061100000202
-050003f500000202050006ff06ff06e800000202050003f500000202050006ff06ff06e8
-00000202050003f500000202050006ff06ff06e800000202050003f50000020205000005
-02ff02ff02dc00060202050003f500000208050002ff02ff02dc00000208050003f50000
-0208050002ff02ff02dc00000208050003f500000208050001ff01ff01dc000002080500
-03f50000050901ff01ff01dc0000050903ff03ff03ff03ff03ff03ff03ff03d3
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 21 400 186
-%%EOF
diff --git a/lib/tv/doc/src/tv_start_pid_sorted.gif b/lib/tv/doc/src/tv_start_pid_sorted.gif
deleted file mode 100644
index 390f98541f..0000000000
--- a/lib/tv/doc/src/tv_start_pid_sorted.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start_pid_sorted.ps b/lib/tv/doc/src/tv_start_pid_sorted.ps
deleted file mode 100644
index 13ef2ed027..0000000000
--- a/lib/tv/doc/src/tv_start_pid_sorted.ps
+++ /dev/null
@@ -1,1853 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_start_pid_sorted.eps)
-%%CreationDate: (Mon Mar 19 17:15:26 2001)
-%%BoundingBox: 0 0 377 205
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 377 205
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-377.000000 205.000000
-12
-755 410
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-aab6aa
-e7e7e7
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff01ff01dc000b0208040001ff01ff01dc00000208040000000208040002ff02ff
-02dc000002080400000002080400020000ff00ff00d90400020000000208040000000202
-04060200000004ff04ff04d9020000000405020204000000020204000209000d02ff02ff
-02d000000202040000000202040002080000020d040002f6010302110103023801010206
-0101024001010230010102ff020400000202040000000202040002080000020d040002f6
-010102020107020001010203010102010101020e0105020001070201010302070100020b
-01010206010102400101020c0104021e010102ff02040000020204000000020204000208
-0000020d040002f6010102050101020301010203010102010101020e0101020701010203
-01010201010102050101020b010102060101024e010102020101021d010102ff02040000
-0202040000000202040002080000020204060203040002f6010102050101020301010203
-010102010101020e01010207010102030101020801040201010302030101020001010203
-010102020103020301040206010302030101020001010207010102000101020101010203
-010302030101020201010200010102020101020101030202010102000101020101010203
-010302020101020001010201010102020103020201010202010102f30000020204000000
-04030208000002020400030400000203040002f601010205010102040101020201000202
-0101020e0101020701010203010202080101020201010201010102020102020001010202
-010102010101020101010201010102090101020101010202010202000101020601020200
-010202000101020101010201010102020101020201020200010102010101020001010200
-010102020102020001020200010102010101020101010201010102000101020101010201
-010102010101020101010202010102f3000004030101020b000002030400030200000204
-040002f6010102050101020401010201010102020101020e010402040101020401030206
-010102060101020201010201010102020101020101010201010102010102020801010201
-010102020101020101010206010102010101020101010205010102020101020201010201
-010102010101020001010200010102020101020101010201010102050101020101020203
-01010201010102010101020101010202010002f70103020b000002030400030200000204
-040002f6010102050101020501010200010002030101020e010102070101020601020205
-010102030104020201010201010102020101020101050202010302060101020101010202
-010102010101020601010201010102010101020201040202010102020101020101010201
-010102000101020001010202010102010101020101010202010402010101020401010201
-0105020201010200010102f70103020b000002040400030000000205040002f601010205
-01010205010302030101020e010102070101020701010205010102020101020101010202
-010102010101020201010201010102080102020501010201010102020101020101010206
-010102010101020101010201010102010101020201010202010102010101020101010201
-010102000101020101010201010102010101020101010201010102010101020401010201
-0101020601010200010002f80103020b000002040400030000000205040002f601010205
-01010206010102040101020e010102070101020301010201010102050101020201010201
-010102020101020101010202010102010101020201000205010102050101020101010202
-010102010101020601010201010102010101020101010201010102020101020201010201
-010102020101020701010201010102010101020101010201010102010101020401010201
-0101020201000203010202f80103020b0000020500000206040002f60101020501010206
-010102040101020e01050203010102040103020701020201010202000101020101040203
-010102020103020201040207010302030101020101010206010102010101020101010202
-010202000101020101010202010102010101020301050202010102010101020101010202
-0102020001010200010102040101020201030204010102f90103020b0000020d040002f6
-01030211010302c4010102fa0103020b0000020d040002ff02d5010102fa0103020b0000
-020d040002ff02ff02d20103020c040d02ff02ff02d3010302ff02ff02ee010302ff02ff
-02ee0103020200ff00ff00e70400020201030202000004ff04ff04e70202010302ff02ff
-02ee01030202050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050002020103020200000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050001000202010302020500000005ff05ff05e401000500020201030202000005ff05ff
-05e601000202010302020500000005ff05ff05e401000500020201030202000005ff05ff
-05e601000202010302020500000005ff05ff05e4010005000202010302020000050c0604
-0504060005030602051f0600050206000504060005270602050b06000506060005ff05ff
-0535060005020600050906020514010002020103020205000000050b0600050f0600051f
-060005020600052c060005020600050a060005ff05ff053d060005020600050b06000513
-010005000202010302020000050c06000506060205050600050306020518060005020600
-050206020503060205020600050206000517060005020600050106000500060105020604
-050206020503060205020600050006010503060205ff05ff052006000502060005020602
-050506000502060005000601050d010002020103020205000000050b0600050806000505
-060005020600050206000518060005000600050506000502060005020600050106000502
-060005170600050206000501060105010600050306000506060005020600050206000501
-060105010600050106000502060005ff05ff051f06000502060005010600050206000504
-06000502060105010600050b010005000202010302020000050c06030505060005050600
-050206000502060005180600050006000505060005020600050206000501060005000600
-050006000517060005020600050106000502060005030600050606000502060005020600
-05010600050206000501060005ff05ff0523060405010600050206000504060005020600
-05020600050c010002020103020205000000050b06000508060005050600050206040518
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05ff052006000502060005010604050406000502060005020600050b0100050002020103
-02020000050c0600050806000505060005020600051d0600050606000502060005050600
-050006000500060005170600050206000501060005020600050306000506060005020600
-0502060005010600050206000505060005ff05ff051f0600050206000501060005080600
-0502060005020600050c010002020103020205000000050b060005080600050506000502
-060005020600051906000506060005020600050206000501060005000600050006000517
-060005020600050106010501060005030600050606000502060005020600050106000502
-0600050106000502060005ff05ff051f0600050206000501060005020600050406000502
-060105010600050b010005000202010302020000050c0600050806000505060005030602
-051a06000506060005030602050306000500060005190602050206000500060105050601
-050406000503060205020600050206000502060205ff05ff052006000502060005020602
-050506000502060005000601050d0100020201030202050000000576060005ff05ff055b
-0600050f010005000202010302020000050b0606052a0606052a06060500060005ff05ff
-05450606050e06000510010002020103020205000000050a0606052a0606052a06060500
-060005ff05ff05450606050e0600050f01000500020201030202000005ff05ff05e60100
-0202010302020500000005ff05ff05e401000500020201030202000005ff05ff05e60100
-020201030202050000000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050002020103020200000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010002020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff
-05ff05e802020103020205ff05ff05e8020201030202051c01020504010305c101020504
-0103051a0102057f01010505010205f001020504010305190101052f020201030202050e
-01060508010005060101050f010205010102059b01060508010005060101051001050504
-0101054d010205240104050d0101051e0102052401020501010205930106050801000506
-0101051101030535020201030202050e0100050101010500010005070101050601000511
-010105010100059d0100050101010500010005070101050601000513010105060100054d
-0101050001010524010105000101050c0100051e01010500010105240101050101000595
-010005010101050001000507010105060100051101010501010105340202010302020510
-010105030103050201030503010105030103050801020500010105010103050001010500
-01000500010005020103058b010105030103050201030503010105030103050a01010503
-0104054c0101050101050500010305000102050201030501010105000102050701010501
-01010500010305030104051d010105010105050001030500010205020103050101010500
-010205070102050001010501010305000101050001000500010005020103058301010503
-010305020103050301010503010305090101050101000500010305020105050101030521
-020201030202051001010506010105000101050101010502010105020101050101010507
-0100050001000500010005050101050001050500010105010101058a0101050601010500
-010105010101050201010502010105010101050901010502010105010101054c01000502
-010105000101050201000500010205000101050001010501010105010102050001000507
-010105010101050201010502010105010101051d01000502010105000101050201000500
-010205000101050001010501010105010102050001000507010005000100050001000505
-010105000105050001010501010105820101050601010500010105010101050201010502
-010105010101050801020504010105020101050001010501010105010101052002020103
-020205100100050401040500010105010101050201010501010605070100050001020502
-0104050001010500010005000107058a0100050401040500010105010101050201010501
-0106050901010501010105020101054b0101050201000501010105000100050001000500
-01010501010805010101050a0103050401010501010105020101051c0101050201000501
-01010500010005000100050001010501010805010101050a010005000102050201040500
-010105000100050001070582010005040104050001010501010105020101050101060509
-01020503010105040101050101060520020201030202050f010105020101050101010500
-0101050201010501010105020101050b0101050001010501010105010101050101000500
-01000500010005000101058e010105020101050101010500010105020101050101010502
-0101050d01010502010105010101054c0101050101010501010205000100050101000502
-01000500010105050101050a0101050601010502010105010101051d0101050101010501
-01020500010005010100050201000500010105050101050a010105000101050101010501
-010105010100050001000500010005000101058601010502010105010101050001010502
-01010501010105020101050b010105010101050201010503010105030101052502020103
-0202050f0101050201010501010105000101050101010502010105020101050101010507
-01000501010105010101050101010500010105000100050001000500010105010101058a
-010105020101050101010500010105010101050201010502010105010101050901010502
-010105010101054c01010500010105020103050101010501010105000101050101010501
-0101050a0101050601010502010105010101051d01010500010105020103050101010501
-0101050001010501010105010101050a0100050101010501010105010101050001010500
-010005000100050001010501010105820101050201010501010105000101050101010502
-010105020101050101010507010105010101050201010502010205000101050001010501
-01010521020201030202050e01030502010a050101050501010305070102050001010502
-0107050001000500010105000103058a01030502010a0501010505010103050801050501
-0105054c0102050301010500010005000103050001020500010305010104050701030503
-010505010105051d01020503010105000100050001030500010205000103050101040507
-01020500010105020107050001000500010105000103058201030502010a050101050501
-010305090103050101050500010505010103052202020103020205ff05ff05e802020103
-020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103
-020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e802020103
-0202050201ff01ff01e205020202010302020503010000cb0101008101010059010100c3
-010100580101050001000500010005000100050001000500010005000100050001000500
-01000500000005020202010302020503010000cb0101008101010059010100c301010058
-010005000100030601000306000005030202010302020503010000cb010100810101000c
-0100002301000026010100c3010100580101050003050000050003060500000005020202
-0103020205030100001f0100000a0100009e010100810101000b01000004010100090104
-000a01010002010000250101001e0102000501000012010000060100002e010000120102
-0003010200310101000a0100000501010044010005000100030505000100050003050000
-050302020103020205030100001f0100000a0100009e010100810101000a010000040100
-0001010000080100000d0100000101000002010000240101002001000019010000360100
-001401000005010000310101000901010004010000010100004301010500030405000000
-050001000305050000000502020201030202050301000009010200030102000901040002
-01020002010000000101009b01010081010100090100000501000001010000080100000d
-010000010100000301000023010100090102000201000000010100020100000001010005
-01000003010200030102000301020002010400020102000301020002010000000101000a
-010200030102000201000000010100020104000101000000010100030102000501000005
-010000030102000201000000010100230101000801000000010000040100000101000043
-010005000100030400000502010003040000050302020103020205030100000801000002
-01000001010000020100000a010000030100000201000001010100010100009a01010081
-010100080100000601000001010000080103000a01000001010000040100002201010008
-010000020100000101010001010000010101000101000004010000050100000201000002
-010000010100000201000003010000060100000201000002010000010101000101000008
-010000020100000101000002010000010101000101000003010000030101000101000001
-01000002010000040100000501000002010000020100000101010001010000220101000a
-010000040100000101000043010105000303000005020100050003040500000005020202
-0103020205030100000c010000010100000e0100000701000001010000020100009a0101
-00810101000701000007010000010100000c010000090100000101000005010000210101
-000c01000001010000020100000101000002010000040100000501000002010000090100
-000301000006010000020100000201000001010000020100000801000005010000020100
-000101000002010000030100000301000005010000020100000401000005010000020100
-000201000001010000260101000a01000004010000010100004301000500010003030500
-0000050201000500030300000503020201030202050301000009010300010100000e0100
-000401030001010000020100009a010100810101000801000006010000010100000c0100
-000901000001010000040100002201010009010300010100000201000001010000020100
-000401000005010000020100000601030003010000060100000201000002010000010100
-000201000008010000050100000201000001010000020100000301000003010000050100
-000201000004010000050100000201040001010000260101000a01000004010000010100
-004301010500030205000000050401000303050000000502020201030202050301000008
-01000002010000010100000e010000030100000201000001010000020100009a01010081
-010100090100000501000001010000080100000201000009010000010100000301000023
-010100080100000201000001010000020100000101000002010000040100000501000002
-010000050100000201000003010000060100000201000002010000010100000201000008
-010000050100000201000001010000020100000301000003010000050100000201000004
-010000050100000201000005010000260101000a01000004010000010100004301000500
-010003020000050601000302000005030202010302020503010000080100000201000001
-010000020100000a010000030100000201000001010100010100009a010100810101000a
-010000040100000101000003010100020100000201000003010100030100000101000002
-010000240101000801000002010000010101000101000001010100010100000401000005
-010000020100000201000001010000020100000301000006010000020100000201000001
-010000020100000801000002010000010100000201000001010000020100000301000003
-01000005010000020100000401000005010000020100000201000001010000260101000a
-010000040100000101000043010105000301000005060100050003020500000005020202
-01030202050301000009010300020102000c0101000201030001010000000101009b0101
-00810101000b010000040101000401010003010200040101000401010002010000250101
-000901030001010000000101000201000000010100050100000501000003010200030103
-000401010004010000030102000201000002010000090102000301020002010000020100
-000401010001010000060102000501000005010000030102000201000026010100080104
-000301010044010005000100030105000000050601000500030100000503020201030202
-050301000015010500af010100810101000c01000023010000260101000f010000050100
-003c01050068010100580101050003000500000005080100030105000000050202020103
-02020503010000cb01010081010100590101000f01000005010000ab0101005801000500
-010003000000050a01000300000005030202010302020503010000cb0101008101010059
-0101000f01000005010000ab010100580101050000000500010005000100050001000500
-01000500010005000100050003000500000005020202010302020503010000cb01010081
-01010059010100c301010058010005000100050001000500010005000100050001000500
-010005000100050001000500000005030202010302020503010000cb0101008101010059
-010100c30101005801010500030e0500000005020202010302020503010000cb01010081
-01010059010100c301010058010005000100050000000500000005000000050000000500
-000005000000050000000500000005030202010302020503010000cb0101008101010059
-010100c30101005801010500000005000000050000000500000005000000050000000500
-000005000100050000000502020201030202050301ff01ff01ce0500010005000000050a
-0100050000000503020201030202050301ff01ff01cf05000000050c0100050000000502
-0202010302020503010000cb0101008101010059010100c3010100580100050001000500
-0000050a01000500000005030202010302020503010000cb0101008101010059010100c3
-01010058010105000000050c01000500000005020202010302020503010000cb01010081
-0101000c0100002a0100001f010100c30101005801000500010005000000050a01000500
-00000503020201030202050301000010010200090100000d0102000a010200100100007b
-010100810101000b010000040101000b010000050100000c010100020100001e01010010
-010200090100000d010200930101000a0101004b010105000000050c0100050000000502
-020201030202050301000012010000090100000f0100000c010000100100007b01010081
-0101000a010000040100000101000009010100040101000b01000001010000020100001d
-01010012010000090100000f0100009301010009010000010100004a0100050001000500
-0000050a0100050000000503020201030202050301000009010100000100000401000003
-010200020100000001010003010200050100000c01000003010200030102000201000001
-010000030102007101010081010100090100000501000001010000080100000001000003
-010000000100000b01000001010000030100001c01010009010100000100000401000003
-010200020100000001010003010200050100000901000000010100030102000201010000
-010000030102000a01020003010200020100000001010002010000020100000201020002
-010000000101003f01010009010000010100004a010105000000050c0100050000000502
-020201030202050301000008010000010101000401000002010000020100000101010001
-0100000101000002010000040100000c0100000201000002010000010100000201000001
-01000000010000030100000201000070010100810101000801000006010000010100000a
-010000050100000b01000001010000040100001b01010008010000010101000401000002
-010000020100000101010001010000010100000201000004010000090101000101000001
-010000020100000101000000010000000100000101000002010000080100000201000001
-010000020100000101010001010000010100000201000001010000020100000101010001
-0100003e01010009010000010100004a01000500010005000000050a0100050000000503
-020201030202050301000008010000020100000401000002010000020100000101000002
-01000005010000040100000c010000020100000201000001010000050101000401000074
-010100810101000701000007010000010100000a010000050100000b0100000101000005
-0100001a0101000801000002010000040100000201000002010000010100000201000005
-010000040100000901000002010000050100000101000000010000000100000101000002
-010000080100000501000002010000010100000501000002010000010100000201000001
-0100004201010009010000010100004a010105000000050c010005000000050202020103
-020205030100000801000002010000040100000201000002010000010100000201000002
-010300040100000c01000002010000020100000101000005010100050102007101010081
-0101000801000006010000010100000a010000050100000b01000001010000040100001b
-010100080100000201000004010000020100000201000001010000020100000201030004
-010000090100000201000002010300010100000001000000010000010104000901020002
-01040001010000060100000001000002010400010100004201010009010000010100004a
-01000500010005000000050a010005000000050302020103020205030100000801000002
-01000004010000020100000201000001010000020100000101000002010000040100000c
-010000020100000201000001010000050100000001000007010000700101008101010009
-01000005010000010100000a010000050100000b01000001010000030100001c01010008
-010000020100000401000002010000020100000101000002010000010100000201000004
-010000090100000201000001010000020100000101000000010000000100000101000010
-010000010100000501000006010000000100000201000005010000420101000901000001
-0100004a010105000000050c010005000000050202020103020205030100000801000001
-01010004010000020100000201000001010100010100000101000002010000040100000c
-010000020100000201000001010000020100000101000001010000020100000201000070
-010100810101000a01000004010000010100000301010004010000050100000501010003
-01000001010000020100001d010100080100000101010004010000020100000201000001
-010100010100000101000002010000040100000901000002010000010100000201000001
-010000000100000001000001010000020100000801000002010000010100000201000001
-010000070100000301000002010000010100004201010009010000010100004a01000500
-010005000000050a01000500000005030202010302020503010000090101000001000004
-01000003010200020100000001010003010300040100000c010000030102000301020002
-010000020100000201020071010100810101000b01000004010100040101000201040001
-0104000301010004010100020100001e0101000901010000010000040100000301020002
-010000000101000301030004010000090100000201000002010300010100000001000000
-010000020102000a0102000301020002010000070100000401020002010000420101000a
-0101004b010105000000050c010005000000050202020103020205030100000c01000023
-01050093010100810101000c0100002a0100001f0101000c010000230105001c01050068
-0101005801000500010005000000050a0100050000000503020201030202050301000008
-01000002010000bd01010081010100590101000801000002010000b50101005801010500
-0000050c0100050000000502020201030202050301000009010200be0101008101010059
-01010009010200b60101005801000500010005000000050a010005000000050302020103
-02020503010000cb0101008101010059010100c301010058010105000000050c01000500
-000005020202010302020503010000cb0101008101010059010100c30101005801000500
-010005000000050a01000500000005030202010302020503010000cb0101008101010059
-010100c301010058010105000000050c01000500000005020202010302020503010000cb
-0101008101010059010100c30101005801000500010005000000050a0100050000000503
-020201030202050301ff01ff01cf05000000050c01000500000005020202010302020503
-01ff01ff01ce0500010005000000050a01000500000005030202010302020503010000cb
-0101008101010059010100c301010058010105000000050c010005000000050202020103
-02020503010000cb0101008101010059010100c30101005801000500010005000000050a
-01000500000005030202010302020503010000cb010100810101000c0100002a0100001f
-010100c301010058010105000000050c0100050000000502020201030202050301000010
-010200090100000d0102009b010100810101000b010000040101000b010000050100000c
-010100020100001e01010010010200090100000d010200930101000a0101004b01000500
-010005000000050a0100050000000503020201030202050301000012010000090100000f
-0100009b010100810101000a010000040100000101000009010100040101000b01000001
-010000020100001d01010012010000090100000f0100009301010009010000010100004a
-010105000000050c01000500000005020202010302020503010000090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-010100000100000301020003010200710101008101010009010000050100000101000008
-0100000001000003010000000100000b01000001010000030100001c0101000901010000
-010000040100000301020002010000000101000301020005010000090100000001010003
-0102000201010000010000030102000a0102000301020002010000000101000201000002
-0100000201020002010000000101003f01010009010000010100004a0100050001000500
-0000050a0100050000000503020201030202050301000008010000010101000401000002
-010000020100000101010001010000010100000201000004010000090101000101000001
-010000020100000101000000010000000100000101000002010000010100000201000070
-010100810101000801000006010000010100000a010000050100000b0100000101000004
-0100001b0101000801000001010100040100000201000002010000010101000101000001
-010000020100000401000009010100010100000101000002010000010100000001000000
-010000010100000201000008010000020100000101000002010000010101000101000001
-01000002010000010100000201000001010100010100003e01010009010000010100004a
-010105000000050c01000500000005020202010302020503010000080100000201000004
-010000020100000201000001010000020100000501000004010000090100000201000005
-010000010100000001000000010000010100000201000001010000740101008101010007
-01000007010000010100000a010000050100000b01000001010000050100001a01010008
-010000020100000401000002010000020100000101000002010000050100000401000009
-010000020100000501000001010000000100000001000001010000020100000801000005
-010000020100000101000005010000020100000101000002010000010100004201010009
-010000010100004a01000500010005000000050a01000500000005030202010302020503
-010000080100000201000004010000020100000201000001010000020100000201030004
-010000090100000201000002010300010100000001000000010000010104000201020071
-010100810101000801000006010000010100000a010000050100000b0100000101000004
-0100001b0101000801000002010000040100000201000002010000010100000201000002
-010300040100000901000002010000020103000101000000010000000100000101040009
-010200020104000101000006010000000100000201040001010000420101000901000001
-0100004a010105000000050c010005000000050202020103020205030100000801000002
-010000040100000201000002010000010100000201000001010000020100000401000009
-010000020100000101000002010000010100000001000000010000010100000901000070
-010100810101000901000005010000010100000a010000050100000b0100000101000003
-0100001c0101000801000002010000040100000201000002010000010100000201000001
-010000020100000401000009010000020100000101000002010000010100000001000000
-010000010100001001000001010000050100000601000000010000020100000501000042
-01010009010000010100004a01000500010005000000050a010005000000050302020103
-020205030100000801000001010100040100000201000002010000010101000101000001
-010000020100000401000009010000020100000101000002010000010100000001000000
-0100000101000002010000010100000201000070010100810101000a0100000401000001
-010000030101000401000005010000050101000301000001010000020100001d01010008
-010000010101000401000002010000020100000101010001010000010100000201000004
-010000090100000201000001010000020100000101000000010000000100000101000002
-010000080100000201000001010000020100000101000007010000030100000201000001
-0100004201010009010000010100004a010105000000050c010005000000050202020103
-020205030100000901010000010000040100000301020002010000000101000301030004
-010000090100000201000002010300010100000001000000010000020102000301020071
-010100810101000b01000004010100040101000201040001010400030101000401010002
-0100001e0101000901010000010000040100000301020002010000000101000301030004
-010000090100000201000002010300010100000001000000010000020102000a01020003
-01020002010000070100000401020002010000420101000a0101004b0100050001000500
-0000050a010005000000050302020103020205030100000c010000230105009301010081
-0101000c0100002a0100001f0101000c010000230105001c010500680101005801010500
-0000050c010005000000050202020103020205030100000801000002010000bd01010081
-010100590101000801000002010000b50101005801000500010005000000050a01000500
-00000503020201030202050301000009010200be010100810101005901010009010200b6
-01010058010105000000050c01000500000005020202010302020503010000cb01010081
-01010059010100c30101005801000500010005000000050a010005000000050302020103
-02020503010000cb0101008101010059010100c301010058010105000000050c01000500
-000005020202010302020503010000cb0101008101010059010100c30101005801000500
-010005000000050a01000500000005030202010302020503010000cb0101008101010059
-010100c301010058010105000000050c0100050000000502020201030202050301ff01ff
-01ce0500010005000000050a0100050000000503020201030202050301ff01ff01cf0500
-0000050c01000500000005020202010302020503010000cb0101008101010059010100c3
-0101005801000500010005000000050a01000500000005030202010302020503010000cb
-0101008101010059010100c301010058010105000000050c010005000000050202020103
-02020503010000cb010100810101000c0100002a0100001f010100c30101005801000500
-010005000000050a0100050000000503020201030202050301000010010200090100000d
-0102004301000056010100810101000b010000040101000b010000050100000c01010002
-0100001e01010010010200090100000d010200930101000a0101004b010105000000050c
-0100050000000502020201030202050301000012010000090100000f0100004301000056
-010100810101000a010000040100000101000009010100040101000b0100000101000002
-0100001d01010012010000090100000f0100009301010009010000010100004a01000500
-010005000000050a01000500000005030202010302020503010000090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-0101000001000003010200030102000a0102000201000002010000010104005401010081
-010100090100000501000001010000080100000001000003010000000100000b01000001
-010000030100001c01010009010100000100000401000003010200020100000001010003
-010200050100000901000000010100030102000201010000010000030102000a01020003
-010200020100000001010002010000020100000201020002010000000101003f01010009
-010000010100004a010105000000050c0100050000000502020201030202050301000008
-010000010101000401000002010000020100000101010001010000010100000201000004
-010000090101000101000001010000020100000101000000010000000100000101000002
-010000010100000201000008010000020100000101000002010000030100005601010081
-0101000801000006010000010100000a010000050100000b01000001010000040100001b
-010100080100000101010004010000020100000201000001010100010100000101000002
-010000040100000901010001010000010100000201000001010000000100000001000001
-010000020100000801000002010000010100000201000001010100010100000101000002
-010000010100000201000001010100010100003e01010009010000010100004a01000500
-010005000000050a01000500000005030202010302020503010000080100000201000004
-010000020100000201000001010000020100000501000004010000090100000201000005
-0100000101000000010000000100000101000002010000010100000c0100000201000002
-010000000100000401000056010100810101000701000007010000010100000a01000005
-0100000b01000001010000050100001a0101000801000002010000040100000201000002
-010000010100000201000005010000040100000901000002010000050100000101000000
-010000000100000101000002010000080100000501000002010000010100000501000002
-0100000101000002010000010100004201010009010000010100004a010105000000050c
-010005000000050202020103020205030100000801000002010000040100000201000002
-010000010100000201000002010300040100000901000002010000020103000101000000
-010000000100000101040002010200090104000301000005010000560101008101010008
-01000006010000010100000a010000050100000b01000001010000040100001b01010008
-010000020100000401000002010000020100000101000002010000020103000401000009
-010000020100000201030001010000000100000001000001010400090102000201040001
-010000060100000001000002010400010100004201010009010000010100004a01000500
-010005000000050a01000500000005030202010302020503010000080100000201000004
-010000020100000201000001010000020100000101000002010000040100000901000002
-010000010100000201000001010000000100000001000001010000090100000801000006
-010000000100000401000056010100810101000901000005010000010100000a01000005
-0100000b01000001010000030100001c0101000801000002010000040100000201000002
-010000010100000201000001010000020100000401000009010000020100000101000002
-010000010100000001000000010000010100001001000001010000050100000601000000
-01000002010000050100004201010009010000010100004a010105000000050c01000500
-000005020202010302020503010000080100000101010004010000020100000201000001
-010100010100000101000002010000040100000901000002010000010100000201000001
-010000000100000001000001010000020100000101000002010000080100000201000001
-010000020100000301000056010100810101000a01000004010000010100000301010004
-01000005010000050101000301000001010000020100001d010100080100000101010004
-010000020100000201000001010100010100000101000002010000040100000901000002
-010000010100000201000001010000000100000001000001010000020100000801000002
-010000010100000201000001010000070100000301000002010000010100004201010009
-010000010100004a01000500010005000000050a01000500000005030202010302020503
-010000090101000001000004010000030102000201000000010100030103000401000009
-010000020100000201030001010000000100000001000002010200030102000a01020002
-010000020100000401010054010100810101000b01000004010100040101000201040001
-0104000301010004010100020100001e0101000901010000010000040100000301020002
-010000000101000301030004010000090100000201000002010300010100000001000000
-010000020102000a0102000301020002010000070100000401020002010000420101000a
-0101004b010105000000050c010005000000050202020103020205030100000c01000023
-0105002301050069010100810101000c0100002a0100001f0101000c010000230105001c
-010500680101005801000500010005000000050a01000500000005030202010302020503
-0100000801000002010000bd01010081010100590101000801000002010000b501010058
-010105000000050c0100050000000502020201030202050301000009010200be01010081
-0101005901010009010200b60101005801000500010005000000050a0100050000000503
-0202010302020503010000cb0101008101010059010100c301010058010105000000050c
-01000500000005020202010302020503010000cb0101008101010059010100c301010058
-01000500010005000000050a01000500000005030202010302020503010000cb01010081
-01010059010100c301010058010105000000050c01000500000005020202010302020503
-010000cb0101008101010059010100c30101005801000500010005000000050a01000500
-00000503020201030202050301ff01ff01cf05000000050c010005000000050202020103
-0202050301ff01ff01ce0500010005000000050a01000500000005030202010302020503
-010000cb0101008101010059010100c301010058010105000000050c0100050000000502
-0202010302020503010000cb0101008101010059010100c3010100580100050001000500
-0000050a01000500000005030202010302020503010000cb010100810101000c0100002a
-0100001f010100c301010058010105000000050c01000500000005020202010302020503
-0100000b010000120100001f01000089010100810101000b010000040101000b01000004
-0102000b010100020100001e0101000b010000120100000e010000010100008f0101000a
-0101004b01000500010005000000050a010005000000050302020103020205030100001f
-0100001f01000089010100810101000a0100000401000001010000090101000301000002
-0100000901000001010000020100001d0101001f0100000e010000010100008f01010009
-010000010100004a010105000000050c0100050000000502020201030202050301000009
-010200020100000001010003010200020104000901020003010200030102000201000000
-010100030102007f01010081010100090100000501000001010000080100000001000007
-0100000901000001010000030100001c0101000901020002010000000101000301020002
-010400090101000001000001010000000101008c01010009010000010100004a01000500
-010005000000050a010005000000050302020103020205030100000b0100000201010001
-0100000101000002010000030100000a0100000201000001010000020100000101000002
-010000010101000101000001010000020100007e01010081010100080100000601000001
-0100000a010000070100000901000001010000040100001b0101000b0100000201010001
-0100000101000002010000030100000a0100000101010001010100010100008b01010009
-010000010100004a010105000000050c010005000000050202020103020205030100000b
-01000002010000020100000101000002010000030100000a010000090100000101000005
-0100000201000001010000020100007e010100810101000701000007010000010100000a
-010000060100000a01000001010000050100001a0101000b010000020100000201000001
-01000002010000030100000a0100000201000001010000020100008b0101000901000001
-0100004a01000500010005000000050a010005000000050302020103020205030100000b
-010000020100000201000001010400030100000a01000006010300010100000501000002
-010000010104007e010100810101000801000006010000010100000a010000050100000b
-01000001010000040100001b0101000b010000020100000201000001010400030100000a
-0100000201000001010000020100008b01010009010000010100004a010105000000050c
-010005000000050202020103020205030100000b01000002010000020100000101000007
-0100000a0100000501000002010000010100000501000002010000010100008201010081
-0101000901000005010000010100000a010000040100000c01000001010000030100001c
-0101000b010000020100000201000001010000070100000a010000020100000101000002
-0100008b01010009010000010100004a01000500010005000000050a0100050000000503
-02020103020205030100000b01000002010000020100000101000002010000030100000a
-010000020100000101000002010000010100000201000001010000020100000101000002
-0100007e010100810101000a010000040100000101000003010100040100000301000007
-0101000301000001010000020100001d0101000b01000002010000020100000101000002
-010000030100000a0100000101010001010100010100008b01010009010000010100004a
-010105000000050c010005000000050202020103020205030100000b0100000201000002
-01000002010200050101000901020003010300020102000201000002010000020102007f
-010100810101000b01000004010100040101000201040001010400030101000401010002
-0100001e0101000b01000002010000020100000201020005010100090101000001000001
-010000000101008c0101000a0101004b01000500010005000000050a0100050000000503
-020201030202050301000023010500a1010100810101000c0100002a0100001f01010023
-0105009901010058010105000000050c01000500000005020202010302020503010000cb
-0101008101010059010100c30101005801000500010005000000050a0100050000000503
-0202010302020503010000cb0101008101010059010100c301010058010105000000050c
-01000500000005020202010302020503010000cb0101008101010059010100c301010058
-01000500010005000000050a01000500000005030202010302020503010000cb01010081
-01010059010100c301010058010105000000050c01000500000005020202010302020503
-010000cb0101008101010059010100c30101005801000500010005000000050a01000500
-000005030202010302020503010000cb0101008101010059010100c30101005801010500
-0000050c0100050000000502020201030202050301ff01ff01ce0500010005000000050a
-0100050000000503020201030202050301ff01ff01cf05000000050c0100050000000502
-0202010302020503010000cb0101008101010059010100c3010100580100050001000500
-0000050a01000500000005030202010302020503010000cb0101008101010059010100c3
-01010058010105000000050c01000500000005020202010302020503010000cb01010081
-0101000c0100002a0100001f010100c30101005801000500010005000000050a01000500
-0000050302020103020205030100000b010000120100000e010000010100009701010081
-0101000b010000040101000b010000040102000b010100020100001e0101000b01000012
-0100000e010000010100008f0101000a0100000401020044010105000000050c01000500
-0000050202020103020205030100001f0100000e0100000101000097010100810101000a
-01000004010000010100000901010003010000020100000901000001010000020100001d
-0101001f0100000e010000010100008f0101000901010003010000020100004301000500
-010005000000050a01000500000005030202010302020503010000090102000201000000
-010100030102000201040009010100000100000101000000010100940101008101010009
-01000005010000010100000801000000010000070100000901000001010000030100001c
-010100090102000201000000010100030102000201040009010100000100000101000000
-0101008c0101000801000000010000030100000201000043010105000000050c01000500
-0000050202020103020205030100000b0100000201010001010000010100000201000003
-0100000a0100000101010001010100010100009301010081010100080100000601000001
-0100000a010000070100000901000001010000040100001b0101000b0100000201010001
-0100000101000002010000030100000a0100000101010001010100010100008b0101000a
-01000003010000020100004301000500010005000000050a010005000000050302020103
-020205030100000b01000002010000020100000101000002010000030100000a01000002
-010000010100000201000093010100810101000701000007010000010100000a01000006
-0100000a01000001010000050100001a0101000b01000002010000020100000101000002
-010000030100000a0100000201000001010000020100008b0101000a0100000401030043
-010105000000050c010005000000050202020103020205030100000b0100000201000002
-01000001010400030100000a010000020100000101000002010000930101008101010008
-01000006010000010100000a010000050100000b01000001010000040100001b0101000b
-010000020100000201000001010400030100000a0100000201000001010000020100008b
-0101000a010000070100004301000500010005000000050a010005000000050302020103
-020205030100000b010000020100000201000001010000070100000a0100000201000001
-0100000201000093010100810101000901000005010000010100000a010000040100000c
-01000001010000030100001c0101000b010000020100000201000001010000070100000a
-0100000201000001010000020100008b0101000a0100000701000043010105000000050c
-010005000000050202020103020205030100000b01000002010000020100000101000002
-010000030100000a01000001010100010101000101000093010100810101000a01000004
-01000001010000030101000401000003010000070101000301000001010000020100001d
-0101000b01000002010000020100000101000002010000030100000a0100000101010001
-010100010100008b0101000a01000003010000020100004301000500010005000000050a
-010005000000050302020103020205030100000b01000002010000020100000201020005
-0101000901010000010000010100000001010094010100810101000b0100000401010004
-01010002010400010104000301010004010100020100001e0101000b0100000201000002
-0100000201020005010100090101000001000001010000000101008c0101000801040002
-01020044010105000000050c0100050000000502020201030202050301000023010500a1
-010100810101000c0100002a0100001f0101002301050099010100580100050001000500
-0000050a01000500000005030202010302020503010000cb0101008101010059010100c3
-01010058010105000000050c01000500000005020202010302020503010000cb01010081
-01010059010100c30101005801000500010005000000050a010005000000050302020103
-02020503010000cb0101008101010059010100c301010058010105000000050c01000500
-000005020202010302020503010000cb0101008101010059010100c30101005801000500
-010005000000050a01000500000005030202010302020503010000cb0101008101010059
-010100c301010058010105000000050c01000500000005020202010302020503010000cb
-0101008101010059010100c30101005801000500010005000000050a0100050000000503
-020201030202050301ff01ff01cf05000000050c01000500000005020202010302020503
-01ff01ff01ce0500010005000000050a01000500000005030202010302020503010000cb
-0101008101010059010100c301010058010105000000050c010005000000050202020103
-02020503010000cb0101008101010059010100c30101005801000500010005000000050a
-01000500000005030202010302020503010000cb010100810101000c0100002a0100001f
-010100c301010058010105000000050c010005000000050202020103020205030100000b
-010000120100000a0100001501000087010100810101000b010000040101000b01000004
-0102000b010100020100001e0101000b010000120100000e010000010100008f0101000c
-0100004a01000500010005000000050a010005000000050302020103020205030100001f
-0100000a0100001501000087010100810101000a01000004010000010100000901010003
-010000020100000901000001010000020100001d0101001f0100000e010000010100008f
-0101000b0101004a010105000000050c0100050000000502020201030202050301000009
-010200020100000001010003010200020104000801000000010100030102000301020002
-010400020102007f01010081010100090100000501000001010000080100000001000007
-0100000901000001010000030100001c0101000901020002010000000101000301020002
-010400090101000001000001010000000101008c0101000a010000000100004a01000500
-010005000000050001000500010005000100050001000500010005000100050000000503
-02020103020205030100000b01000002010100010100000101000002010000030100000a
-01010001010000010100000201000001010000020100000301000003010000020100007e
-010100810101000801000006010000010100000a01000007010000090100000101000004
-0100001b0101000b01000002010100010100000101000002010000030100000a01000001
-01010001010100010100008b01010009010000010100004a010105000000050001000500
-010005000100050001000500010005000100050001000500000005020202010302020503
-0100000b01000002010000020100000101000002010000030100000a0100000201000001
-010000020100000101000007010000030100008201010081010100070100000701000001
-0100000a010000060100000a01000001010000050100001a0101000b0100000201000002
-0100000101000002010000030100000a0100000201000001010000020100008b01010008
-010000020100004a010005000100030e0000050302020103020205030100000b01000002
-0100000201000001010400030100000a0100000201000001010000020100000201020004
-010000040102007f010100810101000801000006010000010100000a010000050100000b
-01000001010000040100001b0101000b010000020100000201000001010400030100000a
-0100000201000001010000020100008b01010008010000020100004a01010500030e0500
-0000050202020103020205030100000b010000020100000201000001010000070100000a
-0100000201000001010000020100000501000003010000070100007e0101008101010009
-01000005010000010100000a010000040100000c01000001010000030100001c0101000b
-010000020100000201000001010000070100000a0100000201000001010000020100008b
-0101000801050049010005000100030e0000050302020103020205030100000b01000002
-010000020100000101000002010000030100000a01000002010000010100000201000001
-010000020100000301000003010000020100007e010100810101000a0100000401000001
-010000030101000401000003010000070101000301000001010000020100001d0101000b
-01000002010000020100000101000002010000030100000a010000010101000101010001
-0100008b0101000c0100004a01010500030e05000000050202020103020205030100000b
-010000020100000201000002010200050101000801000002010000020102000301020005
-010100020102007f010100810101000b0100000401010004010100020104000101040003
-01010004010100020100001e0101000b0100000201000002010000020102000501010009
-0101000001000001010000000101008c0101000c0100004a010005000100030e00000503
-020201030202050301000023010500a1010100810101000c0100002a0100001f01010023
-010500990101005801010500030e0500000005020202010302020503010000cb01010081
-01010059010100c301010058010005000100030e000005030202010302020503010000cb
-0101008101010059010100c30101005801010500030e0500000005020202010302020503
-010000cb0101008101010059010100c301010058010005000100030e0000050302020103
-02020503010000cb0101008101010059010100c30101005801010500030e050000000502
-0202010302020503010000cb0101008101010059010100c301010058010005000100030e
-000005030202010302020503010000cb0101008101010059010100c30101005801010500
-030e050000000502020201030202050301ff01ff01ce05000100030e0000050302020103
-0202050307cd01ff01ff01010500030e0500000005020202010302020503070008cb0700
-0100088101010859010108c301010858010005000100030e000005030202010302020503
-070008cb07000100080b010108470101082901010859010108c30101085801010500030e
-0500000005020202010302020503070008cb07000100080a010008150100082a01000808
-010008280101080c0100082a0100081f010108c301010858010005000100030e00000503
-02020103020205030700081d07000808070008a207000100080a010008040102080c0100
-08040101080b010008030104080a0101080201000807010008280101080b010008040101
-080b010008030104080a010108020100081e010108180100080a01000822010208770101
-080a0100084c01010500030e05000000050202020103020205030700081d070008ac0700
-0100080a01000803010008020100080a0100080401000801010008090101080301000802
-01000809010008010100080201000806010008280101080a010008040100080101000809
-01010803010008020100080901000801010008020100081d010108180100080a01000824
-01000877010108090101084c010005000100030e00000503020201030202050307000809
-070208030702080307020802070008010700080307020803070208030702089407000100
-080a01000803010008020100080901000805010008010100080801000800010008070100
-080901000801010008030100080501000828010108090100080501000801010008080100
-0800010008070100080901000801010008030100081c0101080801000800010108030102
-080201040808010008010100080301020802010008000101080201000800010108030102
-08050100087701010808010008000100084c01010500030e050000000502020201030202
-050307000808070008020700080107000802070008010700080207000801070008000700
-0806070008020700080207000801070008020700089307000100080a0100080301000802
-0100080801000806010008010100080a010008060100080a010008010100080401000804
-010008280101080801000806010008010100080a010008060100080a0100080101000804
-0100081b01010808010108010100080101000802010008030100080a0100080001000803
-010008020100080101010801010008010101080101000801010008020100080401000877
-0101080a0100084c010005000100030e0000050302020103020205030700080807000805
-070008020700080107000802070008010701080707000802070008020700080107000897
-070001000808010108050102080801000807010008010100080a010008060100080a0100
-08010100080501000804010108260101080701000807010008010100080a010008060100
-080a01000801010008050100081a01010808010008020100080101000802010008030100
-080a01010804010008020100080101000805010008020100080101000802010008040100
-08770101080a0100084c01010500030e0500000005020202010302020503070008080700
-080507000802070008010700080207000801070108070700080207040802070208940700
-0100080a01000803010008020100080801000806010008010100080a010008060100080a
-010008010100080401000804010008280101080801000806010008010100080a01000806
-0100080a01000801010008040100081b010108080100080201000801010408030100080a
-010108040104080101000805010008020100080101040804010008770101080a0100084c
-010005000100030e00000503020201030202050307000808070008050700080207000801
-0700080207000801070008000700080607000802070008090700089307000100080a0100
-0803010008020100080901000805010008010100080a010008050100080b010008010100
-080301000805010008280101080901000805010008010100080a010008050100080b0100
-0801010008030100081c010108080100080201000801010008070100080a010008000100
-08030100080501000805010008020100080101000808010008770101080a0100084c0101
-0500030e0500000005020202010302020503070008080700080207000801070008020700
-080107000802070008010700080107000805070008020700080207000801070008020700
-089307000100080a01000803010008020100080301010804010008040100080101000803
-01010804010008050100080501010803010008010100080201000806010008280101080a
-010008040100080101000803010108040100080501000805010108030100080101000802
-0100081d01010808010008020100080101000802010008030100080a0100080101000802
-01000802010008010100080501000802010008010100080201000804010008770101080a
-0100084c010005000100030e000005030202010302020503070008090702080307020803
-07020802070008020700080407000803070208030702089407000100080a010008040102
-080401010805010008040101080401010802010408030100080501010804010108020100
-0807010008280101080b0100080401010804010108020104080301000805010108040101
-08020100081e010108080100080201000802010208050101080801000802010008020102
-08020100080501000802010008020102080501000877010108080104084a01010500030e
-0500000005020202010302020503070008cb07000100080a0100080d010008060100082a
-01000808010008280101080c0100082a0100081f0101081c010508a00101085801000500
-0100030e000005030202010302020503070008cb07000100080b010108090101083b0101
-082901010859010108c30101085801010500030e05000000050202020103020205030700
-08cb07000100088101010859010108c301010858010005000100030e0000050302020103
-02020503070008cb07000100088101010859010108c30101085801010500030e05000000
-05020202010302020503070008cb07000100088101010859010108c30101085801000500
-0100030e000005030202010302020503070008cb07000100088101010859010108c30101
-085801010500030e0500000005020202010302020503070008cb07000100088101010859
-010108c301010858010005000100030e00000503020201030202050307cd01ff01ff0101
-0500030e050000000502020201030202050301ff01ff01ce05000100030e000005030202
-010302020503010000cb0101008101010059010100c30101005801010500030e05000000
-05020202010302020503010000cb0101008101010059010100c301010058010005000100
-030e000005030202010302020503010000cb010100810101000c0100002a0100001f0101
-00c30101005801010500030e050000000502020201030202050301000028010000040100
-000b0100008e010100810101000b010000040101000b010000030104000a010100020100
-001e010100180100000a01000022010200770101000a0101004b010005000100030e0000
-0503020201030202050301000028010000110100008e010100810101000a010000040100
-00010100000901010003010000020100000901000001010000020100001d010100180100
-000a010000240100007701010009010000010100004a01010500030e0500000005020202
-010302020503010000090102000201000002010000020102000a01010000010000020102
-0003010200020104008c0101008101010009010000050100000101000008010000000100
-00070100000901000001010000030100001c010100080100000001010003010200020104
-000801000001010000030102000201000000010100020100000001010003010200050100
-007701010009010000010100004a010005000100030e0000050302020103020205030100
-000801000002010000010100000201000001010000020100000801000001010100040100
-000201000002010000030100008e010100810101000801000006010000010100000a0100
-00060100000a01000001010000040100001b010100080101000101000001010000020100
-00030100000a010000000100000301000002010000010101000101000001010100010100
-000101000002010000040100007701010009010000010100004a01010500030e05000000
-05020202010302020503010000080100000601000001010000010100000c010000020100
-000401000002010000070100008e010100810101000701000007010000010100000a0100
-00060100000a01000001010000050100001a010100080100000201000001010000020100
-00030100000a010100040100000201000001010000050100000201000001010000020100
-00040100007701010009010000010100004a010005000100030e00000503020201030202
-050301000009010200030100000101000002010200090100000201000004010000030102
-00040100008e010100810101000801000006010000010100000a010000060100000a0100
-0001010000040100001b010100080100000201000001010400030100000a010100040104
-0001010000050100000201000001010400040100007701010009010000010100004a0101
-0500030e05000000050202020103020205030100000c0100000301000000010000050100
-0008010000020100000401000006010000030100008e0101008101010009010000050100
-00010100000a010000050100000b01000001010000030100001c01010008010000020100
-0001010000070100000a0100000001000003010000050100000501000002010000010100
-00080100007701010009010000010100004a010005000100030e00000503020201030202
-050301000008010000020100000301010002010000020100000801000001010100040100
-000201000002010000030100008e010100810101000a0100000401000001010000030101
-000401000005010000050101000301000001010000020100001d01010008010000020100
-000101000002010000030100000a01000001010000020100000201000001010000050100
-00020100000101000002010000040100007701010009010000010100004a01010500030e
-05000000050202020103020205030100000901020005010000030102000a010100000100
-000401000003010200050101008c010100810101000b0100000401010004010100020104
-00030100000501010004010100020100001e010100080100000201000002010200050101
-000801000002010000020102000201000005010000020100000201020005010000770101
-000a0101004b010005000100030e00000503020201030202050301000012010000080105
-00a8010100810101000c0100002a0100001f0101001c010500a00101005801010500030e
-05000000050202020103020205030100000f01000000010000b801010081010100590101
-00c301010058010005000100030e00000503020201030202050301000010010000b90101
-008101010059010100c30101005801010500030e05000000050202020103020205030100
-00cb0101008101010059010100c301010058010005000100030e00000503020201030202
-0503010000cb0101008101010059010100c30101005801010500030e0500000005020202
-010302020503010000cb0101008101010059010100c301010058010005000100030e0000
-05030202010302020503010000cb0101008101010059010100c30101005801010500030e
-050000000502020201030202050301ff01ff01ce05000100030e00000503020201030202
-050307cd01ff01ff01010500030e0500000005020202010302020503070008cb07000100
-088101010859010108c301010858010005000100030e0000050302020103020205030700
-08cb07000100080b0101084e0101082201010859010108c30101085801010500030e0500
-000005020202010302020503070008cb07000100080a0100081c0100082a010008080100
-08210101080c0100082a0100081f010108c301010858010005000100030e000005030202
-0103020205030700081a070008af07000100080a01000805010008050101080c01000804
-0101080a010208020104080a0101080201000807010008210101080b010008040101080a
-010208020104080a010108020100081e0101081a010008a7010108090102080201040802
-0102083d01010500030e05000000050202020103020205030700081a070008af07000100
-080a0100080401010804010008010100080a010008040100080101000808010008020100
-08010100080201000809010008010100080201000806010008210101080a010008040100
-0801010008080100080201000801010008020100080901000801010008020100081d0101
-081a010008a701010808010008020100080101000805010008020100083c010005000100
-030e00000503020201030202050307000809070208030702080307010800070008020702
-08a907000100080a01000803010008000100080401000801010008090100080501000801
-0100080c0100080501000809010008010100080301000805010008210101080901000805
-010008010100080c010008050100080901000801010008030100081c0101080901020803
-0102080301010800010008020102080a0102080301020802010008000101080201000802
-010008020102080201000800010108700101080c01000801010008090100083c01010500
-030e05000000050202020103020205030700080807000802070008010700080207000801
-070008010701080107000802070008a807000100080a0100080501000804010008010100
-080801000806010008010100080c010008040100080a0100080101000804010008040100
-08210101080801000806010008010100080c010008040100080a01000801010008040100
-081b01010808010008020100080101000802010008010100080101010801010008020100
-080801000802010008010100080201000801010108010100080101000802010008010100
-080201000801010108010100086f0101080c01000801010308060100083c010005000100
-030e00000503020201030202050307000808070008050700080207000801070008020700
-080107000802070008a80700010008080101080601000804010008010100080701000807
-010008010100080b010008050100080a0100080101000805010008040101081f01010807
-01000807010008010100080b010008050100080a01000801010008050100081a01010808
-010008050100080201000801010008020100080101000802010008080100080501000802
-010008010100080501000802010008010100080201000801010008730101080b01000806
-010008040100083d01010500030e05000000050202020103020205030700080807000805
-07000802070008010700080207000801070408a807000100080a01000805010008040100
-08010100080801000806010008010100080a010008060100080a01000801010008040100
-0804010008210101080801000806010008010100080a010008060100080a010008010100
-08040100081b010108080100080501000802010008010100080201000801010408090102
-08020104080101000806010008000100080201040801010008730101080a010008070100
-08030100083e010005000100030e00000503020201030202050307000808070008050700
-0802070008010700080207000801070008ac07000100080a010008050100080401000801
-01000809010008050100080101000809010008060100080b010008010100080301000805
-0100082101010809010008050100080101000809010008060100080b0100080101000803
-0100081c0101080801000805010008020100080101000802010008010100081001000801
-010008050100080601000800010008020100080501000873010108090100080401000802
-010008020100083f01010500030e05000000050202020103020205030700080807000802
-070008010700080207000801070008010701080107000802070008a807000100080a0100
-080501000804010008010100080301010804010008040100080101000803010108020100
-08070100080501010803010008010100080201000806010008210101080a010008040100
-0801010008030101080201000807010008050101080301000801010008020100081d0101
-080801000802010008010100080201000801010008010101080101000802010008080100
-080201000801010008020100080101000807010008030100080201000801010008730101
-080801000805010008020100080101000840010005000100030e00000503020201030202
-05030700080907020803070208030701080007000802070208a907000100080a01000803
-010408030101080401010805010008040101080401010802010408030100080501010804
-0101080201000807010008210101080b0100080401010804010108020104080301000805
-01010804010108020100081e01010809010208030102080301010800010008020102080a
-010208030102080201000807010008040102080201000873010108080104080201020802
-0104083c01010500030e0500000005020202010302020503070008cb07000100080a0100
-0814010008060100082a01000808010008210101080c0100082a0100081f010108230105
-089901010858010005000100030e000005030202010302020503070008cb07000100080b
-010108100101083b0101082201010859010108c30101085801010500030e050000000502
-0202010302020503070008cb07000100088101010859010108c301010858010005000100
-030e000005030202010302020503070008cb07000100088101010859010108c301010858
-01010500030e0500000005020202010302020503070008cb070001000881010108590101
-08c301010858010005000100030e000005030202010302020503070008cb070001000881
-01010859010108c30101085801010500030e0500000005020202010302020503070008cb
-07000100088101010859010108c301010858010005000100030e00000503020201030202
-050307cd01ff01ff01010500030e050000000502020201030202050307cd01ff01ff0100
-05000100030e000005030202010302020503070008cb07000100088101010859010108c3
-0101085801010500030e0500000005020202010302020503070008cb07000100080b0101
-084e0101082201010859010108c301010858010005000100030e00000503020201030202
-0503070008cb07000100080a0100081c0100082a01000808010008210101080c0100082a
-0100081f010108c30101085801010500030e05000000050202020103020205030700081a
-070008af07000100080a01000805010008050100080d010008040101080a010208020104
-080a0101080201000807010008210101080b010008040101080a010208020104080a0101
-08020100081e0101081a010008a7010108090102080301020844010005000100030e0000
-050302020103020205030700081a070008af07000100080a01000804010108040101080c
-010008040100080101000808010008020100080101000802010008090100080101000802
-01000806010008210101080a010008040100080101000808010008020100080101000802
-0100080901000801010008020100081d0101081a010008a7010108080100080201000801
-010008020100084301010500030e05000000050202020103020205030700080907020803
-070208030701080007000802070208090700080007010803070208020701080007000803
-070208030702087f07000100080a010008030100080001000803010008000100080b0100
-0805010008010100080c0100080501000809010008010100080301000805010008210101
-080901000805010008010100080c010008050100080901000801010008030100081c0101
-0809010208030102080301010800010008020102080a0102080301020802010008000101
-080201000802010008020102080201000800010108700101080c01000805010008430100
-05000100030e000005030202010302020503070008080700080207000801070008020700
-080107000801070108010700080207000808070108010700080107000802070008010700
-080007000800070008010700080207000801070008020700087e07000100080a01000805
-010008050100080a01000806010008010100080c010008040100080a0100080101000804
-01000804010008210101080801000806010008010100080c010008040100080a01000801
-010008040100081b01010808010008020100080101000802010008010100080101010801
-010008020100080801000802010008010100080201000801010108010100080101000802
-010008010100080201000801010108010100086f0101080c010008050100084301010500
-030e05000000050202020103020205030700080807000805070008020700080107000802
-070008010700080207000808070008020700080507000801070008000700080007000801
-070008020700080107000882070001000808010108060100080501000809010008070100
-08010100080b010008050100080a0100080101000805010008040101081f010108070100
-0807010008010100080b010008050100080a01000801010008050100081a010108080100
-080501000802010008010100080201000801010008020100080801000805010008020100
-08010100080501000802010008010100080201000801010008730101080a010108040101
-0844010005000100030e0000050302020103020205030700080807000805070008020700
-080107000802070008010704080807000802070008020703080107000800070008000700
-0801070408020702087f07000100080a01000805010008050100080a0100080601000801
-0100080a010008060100080a010008010100080401000804010008210101080801000806
-010008010100080a010008060100080a01000801010008040100081b0101080801000805
-010008020100080101000802010008010104080901020802010408010100080601000800
-0100080201040801010008730101080c010008050100084301010500030e050000000502
-02020103020205030700080807000805070008020700080107000802070008010700080c
-07000802070008010700080207000801070008000700080007000801070008090700087e
-07000100080a01000805010008050100080b010008050100080101000809010008060100
-080b01000801010008030100080501000821010108090100080501000801010008090100
-08060100080b01000801010008030100081c010108080100080501000802010008010100
-080201000801010008100100080101000805010008060100080001000802010008050100
-08730101080c0100080501000843010005000100030e0000050302020103020205030700
-080807000802070008010700080207000801070008010701080107000802070008080700
-080207000801070008020700080107000800070008000700080107000802070008010700
-08020700087e07000100080a010008050100080501000805010108040100080401000801
-010008030101080201000807010008050101080301000801010008020100080601000821
-0101080a0100080401000801010008030101080201000807010008050101080301000801
-010008020100081d01010808010008020100080101000802010008010100080101010801
-010008020100080801000802010008010100080201000801010008070100080301000802
-0100080101000873010108080100080201000801010008020100084301010500030e0500
-000005020202010302020503070008090702080307020803070108000700080207020809
-070008020700080207030801070008000700080007000802070208030702087f07000100
-080a01000803010408010104080301010805010008040101080401010802010408030100
-0805010108040101080201000807010008210101080b0100080401010804010108020104
-08030100080501010804010108020100081e010108090102080301020803010108000100
-08020102080a010208030102080201000807010008040102080201000873010108090102
-080301020844010005000100030e00000503020201030202050307000823070508a10700
-0100080a01000814010008060100082a01000808010008210101080c0100082a0100081f
-01010823010508990101085801010500030e0500000005020202010302020503070008cb
-07000100080b010108100101083b0101082201010859010108c301010858010005000100
-030e000005030202010302020503070008cb07000100088101010859010108c301010858
-01010500030e0500000005020202010302020503070008cb070001000881010108590101
-08c301010858010005000100030e000005030202010302020503070008cb070001000881
-01010859010108c30101085801010500030e0500000005020202010302020503070008cb
-07000100088101010859010108c301010858010005000100030e00000503020201030202
-0503070008cb07000100088101010859010108c30101085801010500030e050000000502
-020201030202050307cd01ff01ff010005000100030e00000503020201030202050301ff
-01ff01cf0500030e0500000005020202010302020503010000cb01010081010100590101
-00c301010058010005000100030e000005030202010302020503010000cb010100810101
-0059010100c30101005801010500030e0500000005020202010302020503010000cb0101
-00810101000c0100002a0100001f010100c301010058010005000100030e000005030202
-0103020205030100003d0100000a0100000a010000060102006a010100810101000b0100
-00040101000a010200030102000b010100020100001e010100c30101000a0101004b0101
-0500030e05000000050202020103020205030100003d0100000a0100000a010000080100
-006a010100810101000a0100000401000001010000080100000201000001010000020100
-000901000001010000020100001d010100c301010009010000010100004a010005000100
-030e00000503020201030202050301000008010100000100000201000002010000080100
-000001010003010200020101000001000003010200030101000001000008010400020102
-000201000000010100050100000301020063010100810101000901000005010000010100
-000c010000050100000901000001010000030100001c010100c301010009010000010100
-004a01010500030e05000000050202020103020205030100000801000000010000000100
-000101000002010000080101000101000001010000020100000101000000010000000100
-00010100000201000001010000010101000a010000030100000201000001010100010100
-0004010000020100000201000062010100810101000801000006010000010100000c0100
-00050100000901000001010000040100001b010100c301010009010000010100004a0100
-05000100030e000005030202010302020503010000080100000001000000010000020100
-000101000008010000020100000501000001010000000100000001000001010000020100
-0001010000020100000a0100000701000001010000020100000401000002010000020100
-0062010100810101000701000007010000010100000a010100040101000a010000010100
-00050100001a010100c301010009010000010100004a01010500030e0500000005020202
-010302020503010000080100000001000000010000020100000101000008010000020100
-00020103000101000000010000000100000101040001010000020100000a010000040103
-000101000002010000040100000201040062010100810101000801000006010000010100
-000c010000050100000901000001010000040100001b010100c301010009010000010100
-004a010005000100030e0000050302020103020205030100000801000000010000000100
-000301000000010000080100000201000001010000020100000101000000010000000100
-000101000005010000020100000a01000003010000020100000101000002010000040100
-000201000066010100810101000901000005010000010100000c01000005010000090100
-0001010000030100001c010100c301010009010000010100004a01010500030e05000000
-050202020103020205030100000801000000010000000100000301010009010000020100
-000101000002010000010100000001000000010000010100000201000001010000010101
-000a01000003010000020100000101010001010000040100000201000002010000620101
-00810101000a010000040100000101000003010100020100000201000001010000020100
-00030101000301000001010000020100001d010100c301010009010000010100004a0100
-05000100030e000005030202010302020503010000080100000001000000010000040100
-000901000002010000020103000101000000010000000100000201020003010100000100
-000b010100020103000101000000010100050100000301020063010100810101000b0100
-00040101000401010003010200030102000401010004010100020100001e010100c30101
-000a0101004b01010500030e050000000502020201030202050301000012010000010105
-002301050085010100810101000c0100002a0100001f010100c301010058010005000100
-030e0000050302020103020205030100000f01000000010000b801010081010100590101
-00c30101005801010500030e050000000502020201030202050301000010010000b90101
-008101010059010100c301010058010005000100030e0000050302020103020205030100
-00cb0101008101010059010100c30101005801010500030e050000000502020201030202
-0503010000cb0101008101010059010100c301010058010005000100030e000005030202
-010302020503010000cb0101008101010059010100c30101005801010500030e05000000
-05020202010302020503010000cb0101008101010059010100c301010058010005000100
-030e00000503020201030202050301ff01ff01cf0500030e050000000502020201030202
-050307cd01ff01ff010005000100030e000005030202010302020503070000cb07000100
-008101010059010100c30101005801010500030e05000000050202020103020205030700
-00cb07000100000b0101004e0101002201010059010100c301010058010005000100030e
-000005030202010302020503070000cb07000100000a0100001c0100002a010000080100
-00210101000c0100002a0100001f010100c30101005801010500030e0500000005020202
-0103020205030700001f0700000a070000060702009407000100000a0100000401020003
-0102000c010000040101000a010200030102000b0101000201000007010000210101000b
-010000040101000a010200030102000b010100020100001e010100c30101000a0101004b
-010005000100030e0000050302020103020205030700001f0700000a0700000807000094
-07000100000a010000030100000201000001010000020100000a01000004010000010100
-000801000002010000010100000201000009010000010100000201000006010000210101
-000a01000004010000010100000801000002010000010100000201000009010000010100
-00020100001d010100c301010009010000010100004a01010500030e0500000005020202
-010302020503070000080701000007000002070000020700000807040002070200020700
-000007010005070000030702008d07000100000a01000007010000050100000901000005
-010000010100000c01000005010000090100000101000003010000050100002101010009
-01000005010000010100000c010000050100000901000001010000030100001c010100c3
-01010009010000010100004a010005000100030e00000503020201030202050307000008
-070000000700000007000001070000020700000a07000003070000020700000107010001
-0700000407000002070000020700008c07000100000a0100000701000005010000080100
-0006010000010100000c0100000501000009010000010100000401000004010000210101
-000801000006010000010100000c010000050100000901000001010000040100001b0101
-00c301010009010000010100004a01010500030e05000000050202020103020205030700
-0008070000000700000007000002070000010700000a0700000707000001070000020700
-000407000002070000020700008c07000100000801010007010000050100000801000007
-010000010100000a010100040101000a0100000101000005010000040101001f01010007
-01000007010000010100000a010100040101000a01000001010000050100001a010100c3
-01010009010000010100004a010005000100030e00000503020201030202050307000008
-070000000700000007000002070000010700000a07000004070300010700000207000004
-070000020704008c07000100000a01000005010000050100000a01000006010000010100
-000c01000005010000090100000101000004010000040100002101010008010000060100
-00010100000c010000050100000901000001010000040100001b010100c3010100090100
-00010100004a01010500030e050000000502020201030202050307000008070000000700
-000007000003070000000700000a07000003070000020700000107000002070000040700
-00020700009007000100000a01000004010000050100000c01000005010000010100000c
-010000050100000901000001010000030100000501000021010100090100000501000001
-0100000c010000050100000901000001010000030100001c010100c30101000901000001
-0100004a010005000100030e000005030202010302020503070000080700000007000000
-070000030701000b07000003070000020700000107010001070000040700000207000002
-0700008c07000100000a0100000301000005010000070101000401000004010000010100
-000301010002010000020100000101000002010000030101000301000001010000020100
-0006010000210101000a0100000401000001010000030101000201000002010000010100
-0002010000030101000301000001010000020100001d010100c301010009010000010100
-004a01010500030e05000000050202020103020205030700000807000000070000000700
-00040700000c07010002070300010700000007010005070000030702008d07000100000a
-010000030104000101040003010100050100000401010004010100030102000301020004
-010100040101000201000007010000210101000b01000004010100040101000301020003
-0102000401010004010100020100001e010100c30101000a0101004b010005000100030e
-0000050302020103020205030700001207000001070500af07000100000a010000140100
-00060100002a01000008010000210101000c0100002a0100001f010100c3010100580101
-0500030e05000000050202020103020205030700000f07000000070000b807000100000b
-010100100101003b0101002201010059010100c301010058010005000100030e00000503
-020201030202050307000010070000b907000100008101010059010100c3010100580101
-0500030e0500000005020202010302020503070000cb07000100008101010059010100c3
-01010058010005000100030e000005030202010302020503070000cb0700010000810101
-0059010100c30101005801010500030e0500000005020202010302020503070000cb0700
-0100008101010059010100c301010058010005000100030e000005030202010302020503
-070000cb07000100008101010059010100c30101005801010500030e0500000005020202
-01030202050307cd01ff01ff010005000100030e00000503020201030202050307cd01ff
-01ff01010500000005000000050000000500000005000000050000000500000005000000
-0500000005020202010302020503070000cb07000100008101010059010100c301010058
-010005000100030000000500000005000000050000000500000005000000050000000500
-000005030202010302020503070000cb07000100000b0101004e01010022010100590101
-00c301010058010105000300050000000508010005000300050000000502020201030202
-0503070000cb07000100000a0100001c0100002a01000008010000210101000c0100002a
-0100001f010100c301010058010005000100030105000000050801000300000005030202
-010302020503070000cb07000100000a01000005010000040102000c010000040101000d
-010000020102000b0101000201000007010000210101000b010000040101000d01000002
-0102000b010100020100001e0101002001010018010000150100006f0101000a01000005
-010100040101003d01010500030100000508010003010500000005020202010302020503
-070000cb07000100000a0100000401010003010000020100000a01000004010000010100
-000b010100010100000201000009010000010100000201000006010000210101000a0100
-0004010000010100000b01010001010000020100000901000001010000020100001d0101
-001f0100001a010000150100006f01010009010100040100000101000002010000010100
-003c01000500010003020000050601000500030100000503020201030202050307000009
-070100000700000207020009070000000701000307020002070100000700000307020003
-0702008d07000100000a0100000301000000010000070100000901000005010000010100
-000a01000000010000050100000901000001010000030100000501000021010100090100
-0005010000010100000a01000000010000050100000901000001010000030100001c0101
-000901010000010000020102000b01000003010000000101000301020002010000000101
-000201040002010200020100000001010003010100000100006f01010008010000000100
-00040100000101000002010000010100003c010105000302050000000504010005000302
-050000000502020201030202050307000008070000010701000107000002070000080701
-000107000001070000020700000107000000070000000700000107000002070000010700
-00020700008c07000100000a010000050100000701000008010000060100000101000009
-010000010100000501000009010000010100000401000004010000210101000801000006
-010000010100000901000001010000050100000901000001010000040100001b01010008
-010000010101000101000002010000080104000101010001010000010100000201000001
-01010001010000030100000301000002010000010101000101000001010000010101006f
-0101000a010000040100000101000002010000010100003c010005000100030305000000
-0504010003020000050302020103020205030700000807000002070000010700000c0700
-000207000005070000010700000007000000070000010700000207000001070000900700
-010000080101000601000006010000080100000701000001010000080100000201000003
-0101000a0100000101000005010000040101001f01010007010000070100000101000008
-01000002010000030101000a01000001010000050100001a010100080100000201000001
-0100000e0100000301000005010000020100000101000002010000030100000301000002
-010000010100000201000001010000020100006f0101000a010000040100000101000002
-010000010100003c01010500030300000504010003030500000005020202010302020503
-070000080700000207000002070200090700000207000002070300010700000007000000
-07000001070400020702008d07000100000a01000005010000050100000a010000060100
-000101000008010000020100000501000009010000010100000401000004010000210101
-000801000006010000010100000801000002010000050100000901000001010000040100
-001b0101000801000002010000020102000b010000030100000501000002010000010100
-00020100000301000003010400010100000201000001010000020100006f0101000a0100
-00040100000101000002010000010100003c010005000100030400000502010005000303
-000005030202010302020503070000080700000207000005070000080700000207000001
-0700000207000001070000000700000007000001070000090700008c07000100000a0100
-0005010000040100000c0100000501000001010000080105000401000009010000010100
-000301000005010000210101000901000005010000010100000801050004010000090100
-0001010000030100001c0101000801000002010000050100000a01000003010000050100
-000201000001010000020100000301000003010000050100000201000001010000020100
-006f0101000a010000040100000101000002010000010100003c01010500030405000000
-050001000500030405000000050202020103020205030700000807000001070100010700
-000207000008070000020700000107000002070000010700000007000000070000010700
-000207000001070000020700008c07000100000a01000005010000030100000701010004
-010000040100000101000003010100060100000101000002010000030101000301000001
-0100000201000006010000210101000a0100000401000001010000030101000601000001
-01000002010000030101000301000001010000020100001d010100080100000101010001
-010000020100000a01000003010000050100000201000001010000020100000301000003
-01000002010000010100000201000001010000010101006f0101000a0100000401000001
-01000002010000010100003c010005000100030505000100050001000304000005030202
-010302020503070000090701000007000002070200090700000207000002070300010700
-00000700000007000002070200030702008d07000100000a010000030104000101040003
-010100050100000401010004010100060100000201020004010100040101000201000007
-010000210101000b01000004010100040101000601000002010200040101000401010002
-0100001e0101000901010000010000020102000b01000003010000060102000201000002
-0100000401010002010200020100000201000002010100000100006f0101000801040003
-010100040101003d01010500030500000500010003050500000005020202010302020503
-0700000c07000007070500af07000100000a01000014010000060100002a010000080100
-00210101000c0100002a0100001f0101000c01000007010500a701010058010005000100
-03060100050003050000050302020103020205030700000807000002070000bd07000100
-000b010100100101003b01010022010100590101000801000002010000b5010100580101
-0500030605000306050000000502020201030202050307000009070200be070001000081
-0101005901010009010200b6010100580100050001000500000005000000050000000500
-00000500000005000000050000000500000005030202010302020503070000cb07000100
-008101010059010100c30101005801010500000005000000050000000500000005000000
-050000000500000005000000050000000502020201030202050301000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005110202
-010302020502010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100051202020103020205030100030d05000300050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-0000030000000500030c050000000511020201030202050201000500030b000005000100
-030000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050003000500000005000000030a0000051202020103020205030100
-03090500000005000100050003000500000005ff05ff05ac010003000000050000000500
-000005000308050000000511020201030202050201000500030700000500000005020100
-0300000005ff05ff05ac0100050003000500000005020000050000000306000005120202
-01030202050301000305050000000500000005020100050003000500000005ff05ff05ac
-010003000000050400000500000005000304050000000511020201030202050201000500
-0303000005000000050601000300000005ff05ff05ac0100050003000500000005060000
-050000000302000005120202010302020503010003010500000005000000050601000500
-03000500000005ff05ff05ac010003000000050800000500000005000300050000000511
-020201030202050201000500010005000100050a01000300000005ff05ff05ac01000500
-030005000000050801000500010005000000051202020103020205030100030105000100
-0500010005060100050003000500000005ff05ff05ac0100030000000508010005000100
-050003000500000005110202010302020502010005000303010005000100050601000300
-000005ff05ff05ac01000500030005000000050601000500010003020000051202020103
-0202050301000305050001000500010005020100050003000500000005ff05ff05ac0100
-030000000504010005000100050003040500000005110202010302020502010005000307
-010005000100050201000300000005ff05ff05ac01000500030005000000050201000500
-010003060000051202020103020205030100030905000100050001000500030005000000
-05ff05ff05ac010003000000050001000500010005000308050000000511020201030202
-050201000500030b01000500010003000000050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050001000500010005000100050003000500000005000100030a
-0000051202020101000405030100030d0500030005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001000500010005000100050001000500010005000100030000000500030c
-050000000511000502020400050201000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005120000020204000000020204000503
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000051100000202040000000202040005ff05ff05e800000202040000000202
-040005ff05ff05e800000202040000000202040005ff05ff05e800000202040000000202
-0400000502ff02ff02dc00060202040000000208040002ff02ff02dc0000020804000000
-0208040002ff02ff02dc00000208040000000208040001ff01ff01dc0000020804000000
-040901ff01ff01dc00000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 377 205
-%%EOF
diff --git a/lib/tv/doc/src/tv_start_system.gif b/lib/tv/doc/src/tv_start_system.gif
deleted file mode 100644
index 3d9502b00c..0000000000
--- a/lib/tv/doc/src/tv_start_system.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start_system.ps b/lib/tv/doc/src/tv_start_system.ps
deleted file mode 100644
index 5c115328c5..0000000000
--- a/lib/tv/doc/src/tv_start_system.ps
+++ /dev/null
@@ -1,1330 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_start_system.eps)
-%%CreationDate: (Mon Mar 19 17:15:27 2001)
-%%BoundingBox: 0 0 377 205
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 377 205
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-377.000000 205.000000
-12
-755 410
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-828282
-aab6aa
-000000
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff01ff01dc000b0208040001ff01ff01dc00000208040000000208040002ff02ff
-02dc000002080400000002080400020000ff00ff00d90400020000000208040000000202
-04060200000004ff04ff04d9020000000405020204000000020204000209000d02ff02ff
-02d000000202040000000202040002080000020d040002f6010302110103023801010206
-0101024001010230010102ff020400000202040000000202040002080000020d040002f6
-010102020107020001010203010102010101020e0105020001070201010302070100020b
-01010206010102400101020c0104021e010102ff02040000020204000000020204000208
-0000020d040002f6010102050101020301010203010102010101020e0101020701010203
-01010201010102050101020b010102060101024e010102020101021d010102ff02040000
-0202040000000202040002080000020204060203040002f6010102050101020301010203
-010102010101020e01010207010102030101020801040201010302030101020001010203
-010102020103020301040206010302030101020001010207010102000101020101010203
-010302030101020201010200010102020101020101030202010102000101020101010203
-010302020101020001010201010102020103020201010202010102f30000020204000000
-04030208000002020400030400000203040002f601010205010102040101020201000202
-0101020e0101020701010203010202080101020201010201010102020102020001010202
-010102010101020101010201010102090101020101010202010202000101020601020200
-010202000101020101010201010102020101020201020200010102010101020001010200
-010102020102020001020200010102010101020101010201010102000101020101010201
-010102010101020101010202010102f3000004030101020b000002030400030200000204
-040002f6010102050101020401010201010102020101020e010402040101020401030206
-010102060101020201010201010102020101020101010201010102010102020801010201
-010102020101020101010206010102010101020101010205010102020101020201010201
-010102010101020001010200010102020101020101010201010102050101020101020203
-01010201010102010101020101010202010002f70103020b000002030400030200000204
-040002f6010102050101020501010200010002030101020e010102070101020601020205
-010102030104020201010201010102020101020101050202010302060101020101010202
-010102010101020601010201010102010101020201040202010102020101020101010201
-010102000101020001010202010102010101020101010202010402010101020401010201
-0105020201010200010102f70103020b000002040400030000000205040002f601010205
-01010205010302030101020e010102070101020701010205010102020101020101010202
-010102010101020201010201010102080102020501010201010102020101020101010206
-010102010101020101010201010102010101020201010202010102010101020101010201
-010102000101020101010201010102010101020101010201010102010101020401010201
-0101020601010200010002f80103020b000002040400030000000205040002f601010205
-01010206010102040101020e010102070101020301010201010102050101020201010201
-010102020101020101010202010102010101020201000205010102050101020101010202
-010102010101020601010201010102010101020101010201010102020101020201010201
-010102020101020701010201010102010101020101010201010102010101020401010201
-0101020201000203010202f80103020b0000020500000206040002f60101020501010206
-010102040101020e01050203010102040103020701020201010202000101020101040203
-010102020103020201040207010302030101020101010206010102010101020101010202
-010202000101020101010202010102010101020301050202010102010101020101010202
-0102020001010200010102040101020201030204010102f90103020b0000020d040002f6
-01030211010302c4010102fa0103020b0000020d040002ff02d5010102fa0103020b0000
-020d040002ff02ff02d20103020c040d02ff02ff02d3010302ff02ff02ee010302ff02ff
-02ee0103020200ff00ff00e70400020201030202000004ff04ff04e70202010302ff02ff
-02ee0103020200ff00ff00e802020103020200ff00ff00e70700020201030202000105ff
-05ff05e40701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e407010202
-010302020001050b06040504060005030602051f0600050206000504060005270602050b
-06000506060005ff05ff053506000502060005090602051307010202010302020001050b
-0600050f0600051f060005020600052c060005020600050a060005ff05ff053d06000502
-0600050b0600051307010202010302020001050b06000506060205050600050306020518
-060005020600050206020503060205020600050206000517060005020600050106000500
-060105020604050206020503060205020600050006010503060205ff05ff052006000502
-060005020602050506000502060005000601050c07010202010302020001050b06000508
-060005050600050206000502060005180600050006000505060005020600050206000501
-060005020600051706000502060005010601050106000503060005060600050206000502
-06000501060105010600050106000502060005ff05ff051f060005020600050106000502
-0600050406000502060105010600050b07010202010302020001050b0603050506000505
-060005020600050206000518060005000600050506000502060005020600050106000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000501060005ff05ff052306040501060005020600050406000502
-060005020600050b07010202010302020001050b06000508060005050600050206040518
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05ff052006000502060005010604050406000502060005020600050b0701020201030202
-0001050b0600050806000505060005020600051d06000506060005020600050506000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000505060005ff05ff051f06000502060005010600050806000502
-060005020600050b07010202010302020001050b06000508060005050600050206000502
-060005190600050606000502060005020600050106000500060005000600051706000502
-060005010601050106000503060005060600050206000502060005010600050206000501
-06000502060005ff05ff051f060005020600050106000502060005040600050206010501
-0600050b07010202010302020001050b0600050806000505060005030602051a06000506
-060005030602050306000500060005190602050206000500060105050601050406000503
-060205020600050206000502060205ff05ff052006000502060005020602050506000502
-060005000601050c070102020103020200010576060005ff05ff055b0600050f07010202
-010302020001050a0606052a0606052a06060500060005ff05ff05450606050e0600050f
-07010202010302020001050a0606052a0606052a06060500060005ff05ff05450606050e
-0600050f0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000107ff07ff07e602020103
-0202000007ff07ff07e702020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e8020201030202051c010205040103
-05c1010205040103051a0102057f01010505010205f001020504010305190101052f0202
-01030202050e01060508010005060101050f010205010102059b01060508010005060101
-0510010505040101054d010205240104050d0101051e0102052401020501010205930106
-0508010005060101051101030535020201030202050e0100050101010500010005070101
-050601000511010105010100059d01000501010105000100050701010506010005130101
-05060100054d0101050001010524010105000101050c0100051e01010500010105240101
-050101000595010005010101050001000507010105060100051101010501010105340202
-010302020510010105030103050201030503010105030103050801020500010105010103
-05000101050001000500010005020103058b010105030103050201030503010105030103
-050a010105030104054c0101050101050500010305000102050201030501010105000102
-05070101050101010500010305030104051d010105010105050001030500010205020103
-050101010500010205070102050001010501010305000101050001000500010005020103
-058301010503010305020103050301010503010305090101050101000500010305020105
-050101030521020201030202051001010506010105000101050101010502010105020101
-0501010105070100050001000500010005050101050001050500010105010101058a0101
-050601010500010105010101050201010502010105010101050901010502010105010101
-054c01000502010105000101050201000500010205000101050001010501010105010102
-050001000507010105010101050201010502010105010101051d01000502010105000101
-050201000500010205000101050001010501010105010102050001000507010005000100
-050001000505010105000105050001010501010105820101050601010500010105010101
-050201010502010105010101050801020504010105020101050001010501010105010101
-052002020103020205100100050401040500010105010101050201010501010605070100
-0500010205020104050001010500010005000107058a0100050401040500010105010101
-0502010105010106050901010501010105020101054b0101050201000501010105000100
-05000100050001010501010805010101050a0103050401010501010105020101051c0101
-05020100050101010500010005000100050001010501010805010101050a010005000102
-050201040500010105000100050001070582010005040104050001010501010105020101
-05010106050901020503010105040101050101060520020201030202050f010105020101
-0501010105000101050201010501010105020101050b0101050001010501010105010101
-05010100050001000500010005000101058e010105020101050101010500010105020101
-0501010105020101050d01010502010105010101054c0101050101010501010205000100
-05010100050201000500010105050101050a0101050601010502010105010101051d0101
-05010101050101020500010005010100050201000500010105050101050a010105000101
-050101010501010105010100050001000500010005000101058601010502010105010101
-05000101050201010501010105020101050b010105010101050201010503010105030101
-0525020201030202050f0101050201010501010105000101050101010502010105020101
-050101010507010005010101050101010501010105000101050001000500010005000101
-05010101058a010105020101050101010500010105010101050201010502010105010101
-050901010502010105010101054c01010500010105020103050101010501010105000101
-0501010105010101050a0101050601010502010105010101051d01010500010105020103
-0501010105010101050001010501010105010101050a0100050101010501010105010101
-050001010500010005000100050001010501010105820101050201010501010105000101
-050101010502010105020101050101010507010105010101050201010502010205000101
-05000101050101010521020201030202050e01030502010a050101050501010305070102
-0500010105020107050001000500010105000103058a01030502010a0501010505010103
-0508010505010105054c0102050301010500010005000103050001020500010305010104
-050701030503010505010105051d01020503010105000100050001030500010205000103
-05010104050701020500010105020107050001000500010105000103058201030502010a
-050101050501010305090103050101050500010505010103052202020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e8020201030202050201ff01ff01e205020202010302020503010000cb010100810101
-0059010100c30101005801000711000005020202010302020503010000cb010100810101
-0059010100c30101005801000701030607000306000105020202010302020503010000cb
-010100810101000c0100002301000026010100c301010058010007010305000007000306
-0001050202020103020205030100001f0100000a0100009e010100810101000b01000004
-010100090104000a01010002010000250101001e0102000501000012010000060100002e
-010000120102000301020031010100080104004a01000701030500000701030500010502
-02020103020205030100001f0100000a0100009e010100810101000a0100000401000001
-010000080100000d01000001010000020100002401010020010000190100003601000014
-010000050100003101010008010000020100004a01000701030400010701030500010502
-02020103020205030100000901020003010200090104000201020002010000000101009b
-01010081010100090100000501000001010000080100000d010000010100000301000023
-010100090102000201000000010100020100000001010005010000030102000301020003
-01020002010400020102000301020002010000000101000a010200030102000201000000
-010100020104000101000000010100030102000501000005010000030102000201000000
-010100230101000c0100004a010007010304000105000701030400010502020201030202
-0503010000080100000201000001010000020100000a0100000301000002010000010101
-00010100009a01010081010100080100000601000001010000080103000a010000010100
-000401000022010100080100000201000001010100010100000101010001010000040100
-000501000002010000020100000101000002010000030100000601000002010000020100
-000101010001010000080100000201000001010000020100000101010001010000030100
-000301010001010000010100000201000004010000050100000201000002010000010101
-0001010000220101000b0100004b01000701030300010501070103040001050202020103
-020205030100000c010000010100000e0100000701000001010000020100009a01010081
-0101000701000007010000010100000c010000090100000101000005010000210101000c
-010000010100000201000001010000020100000401000005010000020100000901000003
-010000060100000201000002010000010100000201000008010000050100000201000001
-010000020100000301000003010000050100000201000004010000050100000201000002
-01000001010000260101000b0100004b0100070103030001050207010303000105020202
-01030202050301000009010300010100000e0100000401030001010000020100009a0101
-00810101000801000006010000010100000c010000090100000101000004010000220101
-000901030001010000020100000101000002010000040100000501000002010000060103
-000301000006010000020100000201000001010000020100000801000005010000020100
-000101000002010000030100000301000005010000020100000401000005010000020104
-0001010000260101000b0100004b01000701030200010503070103030001050202020103
-020205030100000801000002010000010100000e01000003010000020100000101000002
-0100009a0101008101010009010000050100000101000008010000020100000901000001
-010000030100002301010008010000020100000101000002010000010100000201000004
-010000050100000201000005010000020100000301000006010000020100000201000001
-010000020100000801000005010000020100000101000002010000030100000301000005
-0100000201000004010000050100000201000005010000260101000a0100004c01000701
-030200010504070103020001050202020103020205030100000801000002010000010100
-00020100000a010000030100000201000001010100010100009a010100810101000a0100
-000401000001010000030101000201000002010000030101000301000001010000020100
-002401010008010000020100000101010001010000010101000101000004010000050100
-000201000002010000010100000201000003010000060100000201000002010000010100
-000201000008010000020100000101000002010000010100000201000003010000030100
-0005010000020100000401000005010000020100000201000001010000260101000a0100
-004c01000701030100010505070103020001050202020103020205030100000901030002
-0102000c0101000201030001010000000101009b010100810101000b0100000401010004
-010100030102000401010004010100020100002501010009010300010100000001010002
-010000000101000501000005010000030102000301030004010100040100000301020002
-010000020100000901020003010200020100000201000004010100010100000601020005
-010000050100000301020002010000260101000a0100004c010007010301000105060701
-030100010502020201030202050301000015010500af010100810101000c010000230100
-00260101000f010000050100003c01050068010100580100070103000001050707010301
-000105020202010302020503010000cb01010081010100590101000f01000005010000ab
-010100580100070103000001050807010300000105020202010302020503010000cb0101
-0081010100590101000f01000005010000ab01010058010007010001070b030000010502
-0202010302020503010000cb0101008101010059010100c301010058010007010000070d
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-030e000105020202010302020503010000cb0101008101010059010100c3010100580100
-0701001005020202010302020503010000cb0101008101010059010100c3010100580100
-0701000d070000010502020201030202050301ff01ff01ce07010001050a070100010502
-020201030202050301ff01ff01ce07010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb010100810101000c0100002a0100001f010100c30101
-0058010007010001050a070100010502020201030202050301000010010200090100000d
-0102000a010200100100007b010100810101000b010000040101000b010000050100000c
-010100020100001e01010010010200090100000d010200930101000a0101004b01000701
-0001050a070100010502020201030202050301000012010000090100000f0100000c0100
-00100100007b010100810101000a010000040100000101000009010100040101000b0100
-0001010000020100001d01010012010000090100000f0100009301010009010000010100
-004a010007010001050a0701000105020202010302020503010000090101000001000004
-01000003010200020100000001010003010200050100000c010000030102000301020002
-010000010100000301020071010100810101000901000005010000010100000801000000
-01000003010000000100000b01000001010000030100001c010100090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-01010000010000030102000a010200030102000201000000010100020100000201000002
-01020002010000000101003f01010009010000010100004a010007010001050a07010001
-050202020103020205030100000801000001010100040100000201000002010000010101
-00010100000101000002010000040100000c010000020100000201000001010000020100
-000101000000010000030100000201000070010100810101000801000006010000010100
-000a010000050100000b01000001010000040100001b0101000801000001010100040100
-000201000002010000010101000101000001010000020100000401000009010100010100
-000101000002010000010100000001000000010000010100000201000008010000020100
-000101000002010000010101000101000001010000020100000101000002010000010101
-00010100003e01010009010000010100004a010007010001050a07010001050202020103
-020205030100000801000002010000040100000201000002010000010100000201000005
-010000040100000c01000002010000020100000101000005010100040100007401010081
-0101000701000007010000010100000a010000050100000b01000001010000050100001a
-010100080100000201000004010000020100000201000001010000020100000501000004
-010000090100000201000005010000010100000001000000010000010100000201000008
-010000050100000201000001010000050100000201000001010000020100000101000042
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000801000002010000040100000201000002010000010100000201000002010300040100
-000c01000002010000020100000101000005010100050102007101010081010100080100
-0006010000010100000a010000050100000b01000001010000040100001b010100080100
-000201000004010000020100000201000001010000020100000201030004010000090100
-000201000002010300010100000001000000010000010104000901020002010400010100
-00060100000001000002010400010100004201010009010000010100004a010007010001
-050a07010001050202020103020205030100000801000002010000040100000201000002
-01000001010000020100000101000002010000040100000c010000020100000201000001
-01000005010000000100000701000070010100810101000901000005010000010100000a
-010000050100000b01000001010000030100001c01010008010000020100000401000002
-010000020100000101000002010000010100000201000004010000090100000201000001
-010000020100000101000000010000000100000101000010010000010100000501000006
-0100000001000002010000050100004201010009010000010100004a010007010001050a
-070100010502020201030202050301000008010000010101000401000002010000020100
-0001010100010100000101000002010000040100000c0100000201000002010000010100
-00020100000101000001010000020100000201000070010100810101000a010000040100
-0001010000030101000401000005010000050101000301000001010000020100001d0101
-000801000001010100040100000201000002010000010101000101000001010000020100
-000401000009010000020100000101000002010000010100000001000000010000010100
-000201000008010000020100000101000002010000010100000701000003010000020100
-00010100004201010009010000010100004a010007010001050a07010001050202020103
-020205030100000901010000010000040100000301020002010000000101000301030004
-0100000c010000030102000301020002010000020100000201020071010100810101000b
-010000040101000401010002010400010104000301010004010100020100001e01010009
-010100000100000401000003010200020100000001010003010300040100000901000002
-01000002010300010100000001000000010000020102000a010200030102000201000007
-0100000401020002010000420101000a0101004b010007010001050a0701000105020202
-0103020205030100000c0100002301050093010100810101000c0100002a0100001f0101
-000c010000230105001c0105006801010058010007010001050a07010001050202020103
-020205030100000801000002010000bd01010081010100590101000801000002010000b5
-01010058010007010001050a070100010502020201030202050301000009010200be0101
-00810101005901010009010200b601010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a070100010502020201030202050301ff01ff01ce0701
-0001050a070100010502020201030202050301ff01ff01ce07010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb010100810101000c0100002a
-0100001f010100c301010058010007010001050a07010001050202020103020205030100
-0010010200090100000d0102009b010100810101000b010000040101000b010000050100
-000c010100020100001e01010010010200090100000d010200930101000a0101004b0100
-07010001050a070100010502020201030202050301000012010000090100000f0100009b
-010100810101000a010000040100000101000009010100040101000b0100000101000002
-0100001d01010012010000090100000f0100009301010009010000010100004a01000701
-0001050a0701000105020202010302020503010000090101000001000004010000030102
-000201000000010100030102000501000009010000000101000301020002010100000100
-000301020003010200710101008101010009010000050100000101000008010000000100
-0003010000000100000b01000001010000030100001c0101000901010000010000040100
-000301020002010000000101000301020005010000090100000001010003010200020101
-0000010000030102000a0102000301020002010000000101000201000002010000020102
-0002010000000101003f01010009010000010100004a010007010001050a070100010502
-020201030202050301000008010000010101000401000002010000020100000101010001
-010000010100000201000004010000090101000101000001010000020100000101000000
-010000000100000101000002010000010100000201000070010100810101000801000006
-010000010100000a010000050100000b01000001010000040100001b0101000801000001
-010100040100000201000002010000010101000101000001010000020100000401000009
-010100010100000101000002010000010100000001000000010000010100000201000008
-010000020100000101000002010000010101000101000001010000020100000101000002
-01000001010100010100003e01010009010000010100004a010007010001050a07010001
-050202020103020205030100000801000002010000040100000201000002010000010100
-000201000005010000040100000901000002010000050100000101000000010000000100
-0001010000020100000101000074010100810101000701000007010000010100000a0100
-00050100000b01000001010000050100001a010100080100000201000004010000020100
-000201000001010000020100000501000004010000090100000201000005010000010100
-000001000000010000010100000201000008010000050100000201000001010000050100
-00020100000101000002010000010100004201010009010000010100004a010007010001
-050a07010001050202020103020205030100000801000002010000040100000201000002
-010000010100000201000002010300040100000901000002010000020103000101000000
-01000000010000010104000201020071010100810101000801000006010000010100000a
-010000050100000b01000001010000040100001b01010008010000020100000401000002
-010000020100000101000002010000020103000401000009010000020100000201030001
-010000000100000001000001010400090102000201040001010000060100000001000002
-010400010100004201010009010000010100004a010007010001050a0701000105020202
-010302020503010000080100000201000004010000020100000201000001010000020100
-000101000002010000040100000901000002010000010100000201000001010000000100
-0000010000010100000901000070010100810101000901000005010000010100000a0100
-00050100000b01000001010000030100001c010100080100000201000004010000020100
-000201000001010000020100000101000002010000040100000901000002010000010100
-000201000001010000000100000001000001010000100100000101000005010000060100
-000001000002010000050100004201010009010000010100004a010007010001050a0701
-000105020202010302020503010000080100000101010004010000020100000201000001
-010100010100000101000002010000040100000901000002010000010100000201000001
-01000000010000000100000101000002010000010100000201000070010100810101000a
-010000040100000101000003010100040100000501000005010100030100000101000002
-0100001d0101000801000001010100040100000201000002010000010101000101000001
-010000020100000401000009010000020100000101000002010000010100000001000000
-010000010100000201000008010000020100000101000002010000010100000701000003
-01000002010000010100004201010009010000010100004a010007010001050a07010001
-050202020103020205030100000901010000010000040100000301020002010000000101
-000301030004010000090100000201000002010300010100000001000000010000020102
-000301020071010100810101000b01000004010100040101000201040001010400030101
-0004010100020100001e0101000901010000010000040100000301020002010000000101
-000301030004010000090100000201000002010300010100000001000000010000020102
-000a0102000301020002010000070100000401020002010000420101000a0101004b0100
-07010001050a07010001050202020103020205030100000c010000230105009301010081
-0101000c0100002a0100001f0101000c010000230105001c010500680101005801000701
-0001050a07010001050202020103020205030100000801000002010000bd010100810101
-00590101000801000002010000b501010058010007010001050a07010001050202020103
-0202050301000009010200be010100810101005901010009010200b60101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb0101008101010059010100c301010058010007010001050a0701000105020202
-01030202050301ff01ff01ce07010001050a070100010502020201030202050301ff01ff
-01ce07010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb010100810101000c0100002a0100001f010100c301010058010007010001050a0701
-00010502020201030202050301000010010200090100000d010200430100005601010081
-0101000b010000040101000b010000050100000c010100020100001e0101001001020009
-0100000d010200930101000a0101004b010007010001050a070100010502020201030202
-050301000012010000090100000f0100004301000056010100810101000a010000040100
-000101000009010100040101000b01000001010000020100001d01010012010000090100
-000f0100009301010009010000010100004a010007010001050a07010001050202020103
-020205030100000901010000010000040100000301020002010000000101000301020005
-010000090100000001010003010200020101000001000003010200030102000a01020002
-010000020100000101040054010100810101000901000005010000010100000801000000
-01000003010000000100000b01000001010000030100001c010100090101000001000004
-010000030102000201000000010100030102000501000009010000000101000301020002
-01010000010000030102000a010200030102000201000000010100020100000201000002
-01020002010000000101003f01010009010000010100004a010007010001050a07010001
-050202020103020205030100000801000001010100040100000201000002010000010101
-000101000001010000020100000401000009010100010100000101000002010000010100
-000001000000010000010100000201000001010000020100000801000002010000010100
-00020100000301000056010100810101000801000006010000010100000a010000050100
-000b01000001010000040100001b01010008010000010101000401000002010000020100
-000101010001010000010100000201000004010000090101000101000001010000020100
-000101000000010000000100000101000002010000080100000201000001010000020100
-0001010100010100000101000002010000010100000201000001010100010100003e0101
-0009010000010100004a010007010001050a070100010502020201030202050301000008
-010000020100000401000002010000020100000101000002010000050100000401000009
-01000002010000050100000101000000010000000100000101000002010000010100000c
-010000020100000201000000010000040100005601010081010100070100000701000001
-0100000a010000050100000b01000001010000050100001a010100080100000201000004
-010000020100000201000001010000020100000501000004010000090100000201000005
-010000010100000001000000010000010100000201000008010000050100000201000001
-01000005010000020100000101000002010000010100004201010009010000010100004a
-010007010001050a07010001050202020103020205030100000801000002010000040100
-000201000002010000010100000201000002010300040100000901000002010000020103
-000101000000010000000100000101040002010200090104000301000005010000560101
-00810101000801000006010000010100000a010000050100000b01000001010000040100
-001b01010008010000020100000401000002010000020100000101000002010000020103
-000401000009010000020100000201030001010000000100000001000001010400090102
-000201040001010000060100000001000002010400010100004201010009010000010100
-004a010007010001050a0701000105020202010302020503010000080100000201000004
-010000020100000201000001010000020100000101000002010000040100000901000002
-010000010100000201000001010000000100000001000001010000090100000801000006
-010000000100000401000056010100810101000901000005010000010100000a01000005
-0100000b01000001010000030100001c0101000801000002010000040100000201000002
-010000010100000201000001010000020100000401000009010000020100000101000002
-010000010100000001000000010000010100001001000001010000050100000601000000
-01000002010000050100004201010009010000010100004a010007010001050a07010001
-050202020103020205030100000801000001010100040100000201000002010000010101
-000101000001010000020100000401000009010000020100000101000002010000010100
-000001000000010000010100000201000001010000020100000801000002010000010100
-00020100000301000056010100810101000a010000040100000101000003010100040100
-0005010000050101000301000001010000020100001d0101000801000001010100040100
-000201000002010000010101000101000001010000020100000401000009010000020100
-000101000002010000010100000001000000010000010100000201000008010000020100
-000101000002010000010100000701000003010000020100000101000042010100090100
-00010100004a010007010001050a07010001050202020103020205030100000901010000
-010000040100000301020002010000000101000301030004010000090100000201000002
-01030001010000000100000001000002010200030102000a010200020100000201000004
-01010054010100810101000b010000040101000401010002010400010104000301010004
-010100020100001e01010009010100000100000401000003010200020100000001010003
-01030004010000090100000201000002010300010100000001000000010000020102000a
-0102000301020002010000070100000401020002010000420101000a0101004b01000701
-0001050a07010001050202020103020205030100000c0100002301050023010500690101
-00810101000c0100002a0100001f0101000c010000230105001c01050068010100580100
-07010001050a07010001050202020103020205030100000801000002010000bd01010081
-010100590101000801000002010000b501010058010007010001050a0701000105020202
-01030202050301000009010200be010100810101005901010009010200b6010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-020201030202050301ff01ff01ce07010001050a070100010502020201030202050308cd
-01ff01ff010007010001050a0701000105020202010302020503080000cb080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100000b0101004e0101002201010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100000a0100001c0100002a01000008
-010000210101000c0100002a0100001f010100c301010058010007010001050a07010001
-05020202010302020503080000cb08000100000a01000005010000040102000c01000004
-0101000d010000020102000b0101000201000007010000210101000b010000040101000d
-010000020102000b010100020100001e0101002001010018010000150100006f01010008
-0104000301010044010007010001050a0701000105020202010302020503080000cb0800
-0100000a0100000401010003010000020100000a01000004010000010100000b01010001
-0100000201000009010000010100000201000006010000210101000a0100000401000001
-0100000b01010001010000020100000901000001010000020100001d0101001f0100001a
-010000150100006f0101000801000002010000020100000101000043010007010001050a
-070100010502020201030202050308000009080100000800000208020009080000000801
-0003080200020801000008000003080200030802008d08000100000a0100000301000000
-010000070100000901000005010000010100000a01000000010000050100000901000001
-0100000301000005010000210101000901000005010000010100000a0100000001000005
-0100000901000001010000030100001c0101000901010000010000020102000b01000003
-010000000101000301020002010000000101000201040002010200020100000001010003
-010100000100006f0101000c010000020100000101000043010007010001050a07010001
-050202020103020205030800000808000001080100010800000208000008080100010800
-000108000002080000010800000008000000080000010800000208000001080000020800
-008c08000100000a01000005010000070100000801000006010000010100000901000001
-010000050100000901000001010000040100000401000021010100080100000601000001
-0100000901000001010000050100000901000001010000040100001b0101000801000001
-010100010100000201000008010400010101000101000001010000020100000101010001
-010000030100000301000002010000010101000101000001010000010101006f0101000b
-010000030100000101000043010007010001050a07010001050202020103020205030800
-000808000002080000010800000c08000002080000050800000108000000080000000800
-000108000002080000010800009008000100000801010006010000060100000801000007
-010000010100000801000002010000030101000a0100000101000005010000040101001f
-0101000701000007010000010100000801000002010000030101000a0100000101000005
-0100001a0101000801000002010000010100000e01000003010000050100000201000001
-01000002010000030100000301000002010000010100000201000001010000020100006f
-0101000b010000030100000101000043010007010001050a070100010502020201030202
-050308000008080000020800000208020009080000020800000208030001080000000800
-000008000001080400020802008d08000100000a01000005010000050100000a01000006
-010000010100000801000002010000050100000901000001010000040100000401000021
-010100080100000601000001010000080100000201000005010000090100000101000004
-0100001b0101000801000002010000020102000b01000003010000050100000201000001
-010000020100000301000003010400010100000201000001010000020100006f0101000b
-010000030100000101000043010007010001050a07010001050202020103020205030800
-000808000002080000050800000808000002080000010800000208000001080000000800
-000008000001080000090800008c08000100000a01000005010000040100000c01000005
-010000010100000801050004010000090100000101000003010000050100002101010009
-010000050100000101000008010500040100000901000001010000030100001c01010008
-01000002010000050100000a010000030100000501000002010000010100000201000003
-01000003010000050100000201000001010000020100006f0101000a0100000401000001
-01000043010007010001050a070100010502020201030202050308000008080000010801
-000108000002080000080800000208000001080000020800000108000000080000000800
-00010800000208000001080000020800008c08000100000a010000050100000301000007
-010100040100000401000001010000030101000601000001010000020100000301010003
-010000010100000201000006010000210101000a01000004010000010100000301010006
-0100000101000002010000030101000301000001010000020100001d0101000801000001
-01010001010000020100000a010000030100000501000002010000010100000201000003
-0100000301000002010000010100000201000001010000010101006f0101000a01000004
-0100000101000043010007010001050a0701000105020202010302020503080000090801
-000008000002080200090800000208000002080300010800000008000000080000020802
-00030802008d08000100000a010000030104000101040003010100050100000401010004
-010100060100000201020004010100040101000201000007010000210101000b01000004
-0101000401010006010000020102000401010004010100020100001e0101000901010000
-010000020102000b01000003010000060102000201000002010000040101000201020002
-0100000201000002010100000100006f0101000a0100000501010044010007010001050a
-07010001050202020103020205030800000c08000007080500af08000100000a01000014
-010000060100002a01000008010000210101000c0100002a0100001f0101000c01000007
-010500a701010058010007010001050a0701000105020202010302020503080000080800
-0002080000bd08000100000b010100100101003b01010022010100590101000801000002
-010000b501010058010007010001050a0701000105020202010302020503080000090802
-00be0800010000810101005901010009010200b601010058010007010001050a07010001
-05020202010302020503080000cb08000100008101010059010100c30101005801000701
-0001050a0701000105020202010302020503080000cb08000100008101010059010100c3
-01010058010007010001050a0701000105020202010302020503080000cb080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-01030202050308cd01ff01ff010007010001050a070100010502020201030202050308cd
-01ff01ff010007010001050a0701000105020202010302020503080000cb080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100000b0101004e0101002201010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100000a0100001c0100002a01000008
-010000210101000c0100002a0100001f010100c301010058010007010001050a07010001
-05020202010302020503080000110800000308000010080000010800009e08000100000a
-01000005010000040102000c010000040101000d010000050100000a0101000201000007
-010000210101000b010000040101000d010000050100000a010100020100001e010100c3
-0101000a0100000401020044010007010001050a07010001050202020103020205030800
-00110800000308000010080000010800009e08000100000a010000040101000301000002
-0100000a01000004010000010100000b0101000401010009010000010100000201000006
-010000210101000a01000004010000010100000b01010004010100090100000101000002
-0100001d010100c301010009010100030100000201000043010007010001050a07010001
-0502020201030202050308000009080100000800000108040001080000010800000a0801
-000008000001080000000801009b08000100000a01000003010000000100000701000009
-01000005010000010100000a010000000100000301000000010000090100000101000003
-01000005010000210101000901000005010000010100000a010000000100000301000000
-0100000901000001010000030100001c010100c301010008010000000100000301000002
-01000043010007010001050a070100010502020201030202050308000008080000010801
-000308000003080000000800000a0800000108010001080100010800009a08000100000a
-010000050100000701000008010000060100000101000009010000010100000201000001
-010000090100000101000004010000040100002101010008010000060100000101000009
-0100000101000002010000010100000901000001010000040100001b010100c30101000a
-010000030100000201000043010007010001050a07010001050202020103020205030800
-00080800000208000003080000030801000b0800000208000001080000020800009a0800
-010000080101000601000005010100080100000701000001010000080100000201000001
-01000002010000090100000101000005010000040101001f010100070100000701000001
-010000080100000201000001010000020100000901000001010000050100001a010100c3
-0101000a0100000401030043010007010001050a07010001050202020103020205030800
-00080800000208000003080000030801000b0800000208000001080000020800009a0800
-0100000a0100000501000007010000080100000601000001010000080100000201000001
-010000020100000901000001010000040100000401000021010100080100000601000001
-010000080100000201000001010000020100000901000001010000040100001b010100c3
-0101000a0100000701000043010007010001050a07010001050202020103020205030800
-0008080000020800000308000003080000000800000a0800000208000001080000020800
-009a08000100000a01000005010000070100000901000005010000010100000801050000
-010500080100000101000003010000050100002101010009010000050100000101000008
-010500000105000801000001010000030100001c010100c30101000a0100000701000043
-010007010001050a07010001050202020103020205030800000808000001080100030800
-000308000001080000090800000108010001080100010800009a08000100000a01000005
-010000030100000201000003010100040100000401000001010000030101000601000005
-0100000301010003010000010100000201000006010000210101000a0100000401000001
-010000030101000601000005010000030101000301000001010000020100001d010100c3
-0101000a010000030100000201000043010007010001050a070100010502020201030202
-050308000009080100000800000408010001080000020800000908010000080000010800
-00000801009b08000100000a010000030104000201020004010100050100000401010004
-010100060100000501000003010100040101000201000007010000210101000b01000004
-0101000401010006010000050100000301010004010100020100001e010100c301010008
-0104000201020044010007010001050a07010001050202020103020205030800000c0800
-000e080500a808000100000a01000014010000060100002a01000008010000210101000c
-0100002a0100001f010100c301010058010007010001050a070100010502020201030202
-05030800000808000002080000bd08000100000b010100100101003b0101002201010059
-010100c301010058010007010001050a0701000105020202010302020503080000090802
-00be08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100008101010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a0701000105020202010302020503080000cb0800
-0100008101010059010100c301010058010007010001050a070100010502020201030202
-050308cd01ff01ff010007010001050a070100010502020201030202050308cd01ff01ff
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a0701000105020202010302020503080000cb0800
-0100000b0101004e0101002201010059010100c301010058010007010001050a07010001
-05020202010302020503080000cb08000100000a0100001c0100002a0100000801000021
-0101000c0100002a0100001f010100c301010058010007010001050a0701000105020202
-010302020503080000110800000308000010080000010800009e08000100000a01000005
-010000070100000b010000040101000d010000050100000a010100020100000701000021
-0101000b010000040101000d010000050100000a010100020100001e010100c30101000c
-0100000201020044010007010001050a0701000105020202010302020503080000110800
-000308000010080000010800009e08000100000a01000004010100060101000a01000004
-010000010100000b0101000401010009010000010100000201000006010000210101000a
-01000004010000010100000b010100040101000901000001010000020100001d010100c3
-0101000b010100010100000201000043010007010001050a070100010502020201030202
-050308000009080100000800000108040001080000010800000a08010000080000010800
-00000801009b08000100000a010000030100000001000005010000000100000901000005
-010000010100000a01000000010000030100000001000009010000010100000301000005
-010000210101000901000005010000010100000a01000000010000030100000001000009
-01000001010000030100001c010100c30101000a01000000010000050100004301000701
-0001050a0701000105020202010302020503080000080800000108010003080000030800
-00000800000a0800000108010001080100010800009a08000100000a0100000501000004
-010000010100000801000006010000010100000901000001010000020100000101000009
-010000010100000401000004010000210101000801000006010000010100000901000001
-01000002010000010100000901000001010000040100001b010100c30101000901000001
-0100000501000043010007010001050a0701000105020202010302020503080000080800
-000208000003080000030801000b0800000208000001080000020800009a080001000008
-010100060100000301000002010000070100000701000001010000080100000201000001
-01000002010000090100000101000005010000040101001f010100070100000701000001
-010000080100000201000001010000020100000901000001010000050100001a010100c3
-01010008010000020100000301010044010007010001050a070100010502020201030202
-0503080000080800000208000003080000030801000b0800000208000001080000020800
-009a08000100000a01000005010000030100000201000008010000060100000101000008
-010000020100000101000002010000090100000101000004010000040100002101010008
-010000060100000101000008010000020100000101000002010000090100000101000004
-0100001b010100c301010008010000020100000501000043010007010001050a07010001
-0502020201030202050308000008080000020800000308000003080000000800000a0800
-000208000001080000020800009a08000100000a01000005010000030105000801000005
-010000010100000801050000010500080100000101000003010000050100002101010009
-010000050100000101000008010500000105000801000001010000030100001c010100c3
-010100080105000401000043010007010001050a07010001050202020103020205030800
-000808000001080100030800000308000001080000090800000108010001080100010800
-009a08000100000a01000005010000070100000301010004010000040100000101000003
-01010006010000050100000301010003010000010100000201000006010000210101000a
-010000040100000101000003010100060100000501000003010100030100000101000002
-0100001d010100c30101000c010000010100000201000043010007010001050a07010001
-050202020103020205030800000908010000080000040801000108000002080000090801
-000008000001080000000801009b08000100000a01000003010400050100000301010005
-010000040101000401010006010000050100000301010004010100020100000701000021
-0101000b010000040101000401010006010000050100000301010004010100020100001e
-010100c30101000c0100000201020044010007010001050a070100010502020201030202
-05030800000c0800000e080500a808000100000a01000014010000060100002a01000008
-010000210101000c0100002a0100001f010100c301010058010007010001050a07010001
-050202020103020205030800000808000002080000bd08000100000b010100100101003b
-0101002201010059010100c301010058010007010001050a070100010502020201030202
-050308000009080200be08000100008101010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a0701000105020202010302020503080000cb0800
-0100008101010059010100c301010058010007010001050a070100010502020201030202
-0503080000cb08000100008101010059010100c301010058010007010001050a07010001
-0502020201030202050308cd01ff01ff010007010001050a070100010502020201030202
-050308cd01ff01ff010007010001050a0701000105020202010302020503080000cb0800
-0100008101010059010100c301010058010007010001050a070100010502020201030202
-0503080000cb08000100000b0101004e0101002201010059010100c30101005801000701
-0001050a0701000105020202010302020503080000cb08000100000a0100001c0100002a
-01000008010000210101000c0100002a0100001f010100c301010058010007010001050a
-0701000105020202010302020503080000110800000308000010080000010800009e0800
-0100000a01000005010000030104000b010000040101000d010000050100000a01010002
-01000007010000210101000b010000040101000d010000050100000a010100020100001e
-010100c3010100090102000301020044010007010001050a070100010502020201030202
-0503080000110800000308000010080000010800009e08000100000a0100000401010003
-0100000e01000004010000010100000b0101000401010009010000010100000201000006
-010000210101000a01000004010000010100000b01010004010100090100000101000002
-0100001d010100c30101000801000002010000010100000201000043010007010001050a
-070100010502020201030202050308000009080100000800000108040001080000010800
-000a0801000008000001080000000801009b08000100000a010000030100000001000003
-0100000d01000005010000010100000a0100000001000003010000000100000901000001
-0100000301000005010000210101000901000005010000010100000a0100000001000003
-010000000100000901000001010000030100001c010100c30101000c0100000501000043
-010007010001050a07010001050202020103020205030800000808000001080100030800
-0003080000000800000a0800000108010001080100010800009a08000100000a01000005
-010000030103000901000006010000010100000901000001010000020100000101000009
-010000010100000401000004010000210101000801000006010000010100000901000001
-01000002010000010100000901000001010000040100001b010100c30101000c01000005
-01000043010007010001050a070100010502020201030202050308000008080000020800
-0003080000030801000b0800000208000001080000020800009a08000100000801010006
-010000070100000701000007010000010100000801000002010000010100000201000009
-0100000101000005010000040101001f0101000701000007010000010100000801000002
-01000001010000020100000901000001010000050100001a010100c30101000a01010004
-01010044010007010001050a070100010502020201030202050308000008080000020800
-0003080000030801000b0800000208000001080000020800009a08000100000a01000005
-010000070100000801000006010000010100000801000002010000010100000201000009
-010000010100000401000004010000210101000801000006010000010100000801000002
-01000001010000020100000901000001010000040100001b010100c30101000c01000005
-01000043010007010001050a070100010502020201030202050308000008080000020800
-000308000003080000000800000a0800000208000001080000020800009a08000100000a
-010000050100000301000002010000090100000501000001010000080105000001050008
-010000010100000301000005010000210101000901000005010000010100000801050000
-0105000801000001010000030100001c010100c30101000c010000050100004301000701
-0001050a0701000105020202010302020503080000080800000108010003080000030800
-0001080000090800000108010001080100010800009a08000100000a0100000501000003
-010000020100000301010004010000040100000101000003010100060100000501000003
-01010003010000010100000201000006010000210101000a010000040100000101000003
-0101000601000005010000030101000301000001010000020100001d010100c301010008
-01000002010000010100000201000043010007010001050a070100010502020201030202
-050308000009080100000800000408010001080000020800000908010000080000010800
-00000801009b08000100000a010000030104000201020004010100050100000401010004
-010100060100000501000003010100040101000201000007010000210101000b01000004
-0101000401010006010000050100000301010004010100020100001e010100c301010009
-0102000301020044010007010001050a07010001050202020103020205030800000c0800
-000e080500a808000100000a01000014010000060100002a01000008010000210101000c
-0100002a0100001f010100c301010058010007010001050a070100010502020201030202
-05030800000808000002080000bd08000100000b010100100101003b0101002201010059
-010100c301010058010007010001050a0701000105020202010302020503080000090802
-00be08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100008101010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a0701000105020202010302020503080000cb0800
-0100008101010059010100c301010058010007010001050a070100010502020201030202
-050308cd01ff01ff010007010001050a070100010502020201030202050308cd01ff01ff
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a0701000105020202010302020503080000cb0800
-0100000b0101004e0101002201010059010100c301010058010007010001050a07010001
-05020202010302020503080000cb08000100000a0100001c0100002a0100000801000021
-0101000c0100002a0100001f010100c301010058010007010001050a0701000105020202
-010302020503080000110800000308000010080000010800009e08000100000a01000005
-010000040102000c010000040101000d010000050100000a010100020100000701000021
-0101000b010000040101000d010000050100000a010100020100001e010100c30101000a
-0101004b010007010001050a070100010502020201030202050308000011080000030800
-0010080000010800009e08000100000a0100000401010003010000020100000a01000004
-010000010100000b0101000401010009010000010100000201000006010000210101000a
-01000004010000010100000b010100040101000901000001010000020100001d010100c3
-01010009010000010100004a010007010001050a07010001050202020103020205030800
-0009080100000800000108040001080000010800000a0801000008000001080000000801
-009b08000100000a0100000301000000010000030100000d01000005010000010100000a
-010000000100000301000000010000090100000101000003010000050100002101010009
-01000005010000010100000a010000000100000301000000010000090100000101000003
-0100001c010100c301010009010000010100004a010007010001050a0701000105020202
-01030202050308000008080000010801000308000003080000000800000a080000010801
-0001080100010800009a08000100000a01000005010000030100000c0100000601000001
-010000090100000101000002010000010100000901000001010000040100000401000021
-010100080100000601000001010000090100000101000002010000010100000901000001
-010000040100001b010100c301010009010000010100004a010007010001050a07010001
-05020202010302020503080000080800000208000003080000030801000b080000020800
-0001080000020800009a0800010000080101000601000003010300080100000701000001
-01000008010000020100000101000002010000090100000101000005010000040101001f
-010100070100000701000001010000080100000201000001010000020100000901000001
-010000050100001a010100c301010009010000010100004a010007010001050a07010001
-05020202010302020503080000080800000208000003080000030801000b080000020800
-0001080000020800009a08000100000a0100000501000003010000020100000801000006
-010000010100000801000002010000010100000201000009010000010100000401000004
-010000210101000801000006010000010100000801000002010000010100000201000009
-01000001010000040100001b010100c301010009010000010100004a010007010001050a
-070100010502020201030202050308000008080000020800000308000003080000000800
-000a0800000208000001080000020800009a08000100000a010000050100000301000002
-010000090100000501000001010000080105000001050008010000010100000301000005
-010000210101000901000005010000010100000801050000010500080100000101000003
-0100001c010100c301010009010000010100004a010007010001050a0701000105020202
-010302020503080000080800000108010003080000030800000108000009080000010801
-0001080100010800009a08000100000a0100000501000003010000020100000301010004
-010000040100000101000003010100060100000501000003010100030100000101000002
-01000006010000210101000a010000040100000101000003010100060100000501000003
-0101000301000001010000020100001d010100c301010009010000010100004a01000701
-0001050a0701000105020202010302020503080000090801000008000004080100010800
-0002080000090801000008000001080000000801009b08000100000a0100000301040002
-010200040101000501000004010100040101000601000005010000030101000401010002
-01000007010000210101000b010000040101000401010006010000050100000301010004
-010100020100001e010100c30101000a0101004b010007010001050a0701000105020202
-0103020205030800000c0800000e080500a808000100000a01000014010000060100002a
-01000008010000210101000c0100002a0100001f010100c301010058010007010001050a
-07010001050202020103020205030800000808000002080000bd08000100000b01010010
-0101003b0101002201010059010100c301010058010007010001050a0701000105020202
-01030202050308000009080200be08000100008101010059010100c30101005801000701
-0001050a0701000105020202010302020503080000cb08000100008101010059010100c3
-01010058010007010001050a0701000105020202010302020503080000cb080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100008101010059010100c301010058010007010001050a
-070100010502020201030202050308cd01ff01ff010007010001050a0701000105020202
-01030202050308cd01ff01ff010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100000b0101004e0101002201010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100000a0100001c
-0100002a01000008010000210101000c0100002a0100001f010100c30101005801000701
-0001050a0701000105020202010302020503080000110800000308000010080000010800
-009e08000100000a01000005010000030104000b010000040101000d010000050100000a
-0101000201000007010000210101000b010000040101000d010000050100000a01010002
-0100001e010100c3010100090102000401010044010007010001050a0701000105020202
-010302020503080000110800000308000010080000010800009e08000100000a01000004
-01010003010000020100000a01000004010000010100000b010100040101000901000001
-0100000201000006010000210101000a01000004010000010100000b0101000401010009
-01000001010000020100001d010100c30101000801000002010000020100000101000043
-010007010001050a07010001050202020103020205030800000908010000080000010804
-0001080000010800000a0801000008000001080000000801009b08000100000a01000003
-01000000010000070100000901000005010000010100000a010000000100000301000000
-01000009010000010100000301000005010000210101000901000005010000010100000a
-0100000001000003010000000100000901000001010000030100001c010100c301010008
-01000002010000020100000101000043010007010001050a070100010502020201030202
-050308000008080000010801000308000003080000000800000a08000001080100010801
-00010800009a08000100000a010000050100000601000009010000060100000101000009
-010000010100000201000001010000090100000101000004010000040100002101010008
-010000060100000101000009010000010100000201000001010000090100000101000004
-0100001b010100c30101000801000002010000020100000101000043010007010001050a
-0701000105020202010302020503080000080800000208000003080000030801000b0800
-000208000001080000020800009a08000100000801010006010000060100000801000007
-010000010100000801000002010000010100000201000009010000010100000501000004
-0101001f0101000701000007010000010100000801000002010000010100000201000009
-01000001010000050100001a010100c30101000901030002010000010100004301000701
-0001050a0701000105020202010302020503080000080800000208000003080000030801
-000b0800000208000001080000020800009a08000100000a010000050100000601000009
-010000060100000101000008010000020100000101000002010000090100000101000004
-010000040100002101010008010000060100000101000008010000020100000101000002
-0100000901000001010000040100001b010100c30101000c010000020100000101000043
-010007010001050a07010001050202020103020205030800000808000002080000030800
-0003080000000800000a0800000208000001080000020800009a08000100000a01000005
-010000050100000b01000005010000010100000801050000010500080100000101000003
-010000050100002101010009010000050100000101000008010500000105000801000001
-010000030100001c010100c30101000c010000020100000101000043010007010001050a
-070100010502020201030202050308000008080000010801000308000003080000010800
-00090800000108010001080100010800009a08000100000a010000050100000501000005
-010100040100000401000001010000030101000601000005010000030101000301000001
-0100000201000006010000210101000a0100000401000001010000030101000601000005
-010000030101000301000001010000020100001d010100c3010100080100000201000002
-0100000101000043010007010001050a0701000105020202010302020503080000090801
-0000080000040801000108000002080000090801000008000001080000000801009b0800
-0100000a0100000301040003010000050101000501000004010100040101000601000005
-01000003010100040101000201000007010000210101000b010000040101000401010006
-010000050100000301010004010100020100001e010100c3010100090102000401010044
-010007010001050a07010001050202020103020205030800000c0800000e080500a80800
-0100000a01000014010000060100002a01000008010000210101000c0100002a0100001f
-010100c301010058010007010001050a0701000105020202010302020503080000080800
-0002080000bd08000100000b010100100101003b0101002201010059010100c301010058
-010007010001050a070100010502020201030202050308000009080200be080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100008101010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a070100010502020201030202050308cd01ff01ff
-010007010001050a070100010502020201030202050308cd01ff01ff010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100000b0101004e
-0101002201010059010100c301010058010007010001050a070100010502020201030202
-0503080000cb08000100000a0100001c0100002a01000008010000210101000c0100002a
-0100001f010100c301010058010007010001050a07010001050202020103020205030800
-00110800000308000010080000010800009e08000100000a01000005010000040102000c
-010000040101000d010000050100000a0101000201000007010000210101000b01000004
-0101000d010000050100000a010100020100001e010100c3010100090102000301020044
-010007010001050a07010001050202020103020205030800001108000003080000100800
-00010800009e08000100000a0100000401010003010000020100000a0100000401000001
-0100000b0101000401010009010000010100000201000006010000210101000a01000004
-010000010100000b010100040101000901000001010000020100001d010100c301010008
-01000002010000010100000201000043010007010001050a070100010502020201030202
-050308000009080100000800000108040001080000010800000a08010000080000010800
-00000801009b08000100000a010000030100000001000003010000020100000901000005
-010000010100000a01000000010000030100000001000009010000010100000301000005
-010000210101000901000005010000010100000a01000000010000030100000001000009
-01000001010000030100001c010100c3010100080100000901000043010007010001050a
-070100010502020201030202050308000008080000010801000308000003080000000800
-000a0800000108010001080100010800009a08000100000a010000050100000301000002
-010000080100000601000001010000090100000101000002010000010100000901000001
-010000040100000401000021010100080100000601000001010000090100000101000002
-010000010100000901000001010000040100001b010100c3010100080100000901000043
-010007010001050a07010001050202020103020205030800000808000002080000030800
-00030801000b0800000208000001080000020800009a0800010000080101000601000004
-010200080100000701000001010000080100000201000001010000020100000901000001
-01000005010000040101001f010100070100000701000001010000080100000201000001
-010000020100000901000001010000050100001a010100c3010100080103000501000044
-010007010001050a07010001050202020103020205030800000808000002080000030800
-00030801000b0800000208000001080000020800009a08000100000a0100000501000003
-010000020100000801000006010000010100000801000002010000010100000201000009
-010000010100000401000004010000210101000801000006010000010100000801000002
-01000001010000020100000901000001010000040100001b010100c30101000801000002
-0100000301000045010007010001050a0701000105020202010302020503080000080800
-00020800000308000003080000000800000a0800000208000001080000020800009a0800
-0100000a0100000501000003010000020100000901000005010000010100000801050000
-010500080100000101000003010000050100002101010009010000050100000101000008
-010500000105000801000001010000030100001c010100c3010100080100000201000002
-01000046010007010001050a070100010502020201030202050308000008080000010801
-00030800000308000001080000090800000108010001080100010800009a08000100000a
-010000050100000301000002010000030101000401000004010000010100000301010006
-010000050100000301010003010000010100000201000006010000210101000a01000004
-01000001010000030101000601000005010000030101000301000001010000020100001d
-010100c301010008010000020100000101000047010007010001050a0701000105020202
-010302020503080000090801000008000004080100010800000208000009080100000800
-0001080000000801009b08000100000a0100000301040002010200040101000501000004
-01010004010100060100000501000003010100040101000201000007010000210101000b
-010000040101000401010006010000050100000301010004010100020100001e010100c3
-010100090102000201040043010007010001050a07010001050202020103020205030800
-000c0800000e080500a808000100000a01000014010000060100002a0100000801000021
-0101000c0100002a0100001f010100c301010058010007010001050a0701000105020202
-0103020205030800000808000002080000bd08000100000b010100100101003b01010022
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-0009080200be08000100008101010059010100c301010058010007010001050a07010001
-05020202010302020503080000cb08000100008101010059010100c30101005801000701
-0001050a0701000105020202010302020503080000cb08000100008101010059010100c3
-01010058010007010001050a0701000105020202010302020503080000cb080001000081
-01010059010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-01030202050308cd01ff01ff010007010001050a070100010502020201030202050301ff
-01ff01ce07010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001050a0701000105020202010302020503
-010000cb010100810101000c0100002a0100001f010100c301010058010007010001050a
-07010001050202020103020205030100000b010000120100001f01000089010100810101
-000b010000040101000b010000040102000b010100020100001e0101000b010000120100
-000e010000010100008f0101000a0101004b010007010001050a07010001050202020103
-020205030100001f0100001f01000089010100810101000a010000040100000101000009
-01010003010000020100000901000001010000020100001d0101001f0100000e01000001
-0100008f01010009010000010100004a010007010001050a070100010502020201030202
-050301000009010200020100000001010003010200020104000901020003010200030102
-000201000000010100030102007f01010081010100090100000501000001010000080100
-0000010000070100000901000001010000030100001c0101000901020002010000000101
-000301020002010400090101000001000001010000000101008c01010009010000010100
-004a010007010001050a07010001050202020103020205030100000b0100000201010001
-0100000101000002010000030100000a0100000201000001010000020100000101000002
-010000010101000101000001010000020100007e01010081010100080100000601000001
-0100000a010000070100000901000001010000040100001b0101000b0100000201010001
-0100000101000002010000030100000a0100000101010001010100010100008b01010009
-010000010100004a010007010001050a07010001050202020103020205030100000b0100
-0002010000020100000101000002010000030100000a0100000901000001010000050100
-000201000001010000020100007e010100810101000701000007010000010100000a0100
-00060100000a01000001010000050100001a0101000b0100000201000002010000010100
-0002010000030100000a0100000201000001010000020100008b01010009010000010100
-004a010007010001050a07010001050202020103020205030100000b0100000201000002
-01000001010400030100000a01000006010300010100000501000002010000010104007e
-010100810101000801000006010000010100000a010000050100000b0100000101000004
-0100001b0101000b010000020100000201000001010400030100000a0100000201000001
-010000020100008b01010009010000010100004a010007010001050a0701000105020202
-0103020205030100000b010000020100000201000001010000070100000a010000050100
-000201000001010000050100000201000001010000820101008101010009010000050100
-00010100000a010000040100000c01000001010000030100001c0101000b010000020100
-000201000001010000070100000a0100000201000001010000020100008b010100090100
-00010100004a010007010001050a07010001050202020103020205030100000b01000002
-010000020100000101000002010000030100000a01000002010000010100000201000001
-01000002010000010100000201000001010000020100007e010100810101000a01000004
-01000001010000030101000401000003010000070101000301000001010000020100001d
-0101000b01000002010000020100000101000002010000030100000a0100000101010001
-010100010100008b01010009010000010100004a010007010001050a0701000105020202
-0103020205030100000b0100000201000002010000020102000501010009010200030103
-00020102000201000002010000020102007f010100810101000b01000004010100040101
-0002010400010104000301010004010100020100001e0101000b01000002010000020100
-000201020005010100090101000001000001010000000101008c0101000a0101004b0100
-07010001050a070100010502020201030202050301000023010500a1010100810101000c
-0100002a0100001f010100230105009901010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a0701000105020202010302020503010000cb0101
-008101010059010100c301010058010007010001070c0001050202020103020205030100
-00cb0101008101010059010100c301010058010007010000070d00010502020201030202
-050301ff01ff01ce0701030e00010502020201030202050301ff01ff01ce0701030e0001
-05020202010302020503010000cb0101008101010059010100c30101005801000701030e
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-030e000105020202010302020503010000cb010100810101000c0100002a0100001f0101
-00c30101005801000701030e0001050202020103020205030100000b010000120100000e
-0100000101000097010100810101000b010000040101000b010000040102000b01010002
-0100001e0101000b010000120100000e010000010100008f0101000a0100000401020044
-01000701030e0001050202020103020205030100001f0100000e01000001010000970101
-00810101000a010000040100000101000009010100030100000201000009010000010100
-00020100001d0101001f0100000e010000010100008f0101000901010003010000020100
-004301000701030e00010502020201030202050301000009010200020100000001010003
-010200020104000901010000010000010100000001010094010100810101000901000005
-010000010100000801000000010000070100000901000001010000030100001c01010009
-01020002010000000101000301020002010400090101000001000001010000000101008c
-010100080100000001000003010000020100004301000701030e00010502020201030202
-05030100000b01000002010100010100000101000002010000030100000a010000010101
-00010101000101000093010100810101000801000006010000010100000a010000070100
-000901000001010000040100001b0101000b010000020101000101000001010000020100
-00030100000a0100000101010001010100010100008b0101000a01000003010000020100
-004301000701030e0001050202020103020205030100000b010000020100000201000001
-01000002010000030100000a010000020100000101000002010000930101008101010007
-01000007010000010100000a010000060100000a01000001010000050100001a0101000b
-01000002010000020100000101000002010000030100000a010000020100000101000002
-0100008b0101000a010000040103004301000701030e0001050202020103020205030100
-000b010000020100000201000001010400030100000a0100000201000001010000020100
-0093010100810101000801000006010000010100000a010000050100000b010000010100
-00040100001b0101000b010000020100000201000001010400030100000a010000020100
-0001010000020100008b0101000a010000070100004301000701030e0001050202020103
-020205030100000b010000020100000201000001010000070100000a0100000201000001
-0100000201000093010100810101000901000005010000010100000a010000040100000c
-01000001010000030100001c0101000b010000020100000201000001010000070100000a
-0100000201000001010000020100008b0101000a010000070100004301000701030e0001
-050202020103020205030100000b01000002010000020100000101000002010000030100
-000a01000001010100010101000101000093010100810101000a01000004010000010100
-00030101000401000003010000070101000301000001010000020100001d0101000b0100
-0002010000020100000101000002010000030100000a0100000101010001010100010100
-008b0101000a01000003010000020100004301000701030e000105020202010302020503
-0100000b0100000201000002010000020102000501010009010100000100000101000000
-01010094010100810101000b010000040101000401010002010400010104000301010004
-010100020100001e0101000b010000020100000201000002010200050101000901010000
-01000001010000000101008c01010008010400020102004401000701030e000105020202
-01030202050301000023010500a1010100810101000c0100002a0100001f010100230105
-00990101005801000701030e000105020202010302020503010000cb0101008101010059
-010100c30101005801000701030e000105020202010302020503010000cb010100810101
-0059010100c30101005801000701030e000105020202010302020503010000cb01010081
-01010059010100c30101005801000701030e000105020202010302020503010000cb0101
-008101010059010100c30101005801000701030e000105020202010302020503010000cb
-0101008101010059010100c30101005801000701030e0001050202020103020205030100
-00cb0101008101010059010100c30101005801000701030e000105020202010302020503
-01ff01ff01ce0701030e00010502020201030202050301ff01ff01ce0701001005020202
-010302020503010000cb0101008101010059010100c301010058010007010300000c0700
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-03000001050807010300000105020202010302020503010000cb010100810101000c0100
-002a0100001f010100c30101005801000701030100010507070103000001050202020103
-020205030100000b010000120100000a0100001501000087010100810101000b01000004
-0101000b010000040102000b010100020100001e0101000b010000120100000e01000001
-0100008f0101000c0100004a010007010301000105060701030100010502020201030202
-05030100001f0100000a0100001501000087010100810101000a01000004010000010100
-000901010003010000020100000901000001010000020100001d0101001f0100000e0100
-00010100008f0101000b0101004a01000701030200010505070103010001050202020103
-020205030100000901020002010000000101000301020002010400080100000001010003
-0102000301020002010400020102007f0101008101010009010000050100000101000008
-01000000010000070100000901000001010000030100001c010100090102000201000000
-0101000301020002010400090101000001000001010000000101008c0101000a01000000
-0100004a01000701030200010504070103020001050202020103020205030100000b0100
-0002010100010100000101000002010000030100000a0101000101000001010000020100
-0001010000020100000301000003010000020100007e0101008101010008010000060100
-00010100000a010000070100000901000001010000040100001b0101000b010000020101
-00010100000101000002010000030100000a0100000101010001010100010100008b0101
-0009010000010100004a0100070103030001050307010302000105020202010302020503
-0100000b01000002010000020100000101000002010000030100000a0100000201000001
-010000020100000101000007010000030100008201010081010100070100000701000001
-0100000a010000060100000a01000001010000050100001a0101000b0100000201000002
-0100000101000002010000030100000a0100000201000001010000020100008b01010008
-010000020100004a01000701030300010502070103030001050202020103020205030100
-000b010000020100000201000001010400030100000a0100000201000001010000020100
-000201020004010000040102007f010100810101000801000006010000010100000a0100
-00050100000b01000001010000040100001b0101000b0100000201000002010000010104
-00030100000a0100000201000001010000020100008b01010008010000020100004a0100
-0701030400010501070103030001050202020103020205030100000b0100000201000002
-01000001010000070100000a010000020100000101000002010000050100000301000007
-0100007e010100810101000901000005010000010100000a010000040100000c01000001
-010000030100001c0101000b010000020100000201000001010000070100000a01000002
-01000001010000020100008b010100080105004901000701030400010500070103040001
-050202020103020205030100000b01000002010000020100000101000002010000030100
-000a01000002010000010100000201000001010000020100000301000003010000020100
-007e010100810101000a0100000401000001010000030101000401000003010000070101
-000301000001010000020100001d0101000b010000020100000201000001010000020100
-00030100000a0100000101010001010100010100008b0101000c0100004a010007010305
-0000070203040001050202020103020205030100000b0100000201000002010000020102
-00050101000801000002010000020102000301020005010100020102007f010100810101
-000b010000040101000401010002010400010104000301010004010100020100001e0101
-000b01000002010000020100000201020005010100090101000001000001010000000101
-008c0101000c0100004a0100070103050000070103050001050202020103020205030100
-0023010500a1010100810101000c0100002a0100001f0101002301050099010100580100
-0701030607010305000105020202010302020503010000cb0101008101010059010100c3
-0101005801000701030607000306000105020202010302020503010000cb010100810101
-0059010100c30101005801000701001005020202010302020503010000cb010100810101
-0059010100c3010100580100070000110502020201030202050207ff07ff07d305110202
-01030202050207ff07ff07d20000051102020103020205020701030d0000030000ff00ff
-00af03000001030c0001051102020103020205020701030b00010700030000ff00ff00ae
-070003000003030a00010511020201030202050207010309000207010300000105ff05ff
-05ab07010300000503080001051102020103020205020701030700030500070103000001
-05ff05ff05ab070103000001050100030306000105110202010302020502070103050003
-050207010300000105ff05ff05ab07010300000105030003030400010511020201030202
-0502070103030003050407010300000105ff05ff05ab0701030000010505000303020001
-05110202010302020502070103010003050607010300000105ff05ff05ab070103000001
-0507000303000001051102020103020205020705050807010300000105ff05ff05ab0701
-0300000105080703000105110202010302020502070103010703050607010300000105ff
-05ff05ab0701030000010507070303000001051102020103020205020701030307030504
-07010300000105ff05ff05ab070103000001050507030302000105110202010302020502
-070103050703050207010300000105ff05ff05ab07010300000105030703030400010511
-0202010302020502070103070703050007010300000105ff05ff05ab0701030000010501
-070303060001051102020103020205020701030907040300000105ff05ff05ab07010300
-0001070303080001051102020103020205020701030b07020300000107ff07ff07ad0300
-00010701030a0001051102020101000405020701030d07000300000007ff07ff07ae0300
-00000700030c000105110005020204000502070100ff00ff00d105110000020204000000
-020204000502070000ff00ff00d2051100000202040000000202040005ff05ff05e80000
-0202040000000202040005ff05ff05e800000202040000000202040005ff05ff05e80000
-02020400000002020400000502ff02ff02dc00060202040000000208040002ff02ff02dc
-00000208040000000208040002ff02ff02dc00000208040000000208040001ff01ff01dc
-0000020804000000040901ff01ff01dc00000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 377 205
-%%EOF
diff --git a/lib/tv/doc/src/tv_start_system_unreadable.gif b/lib/tv/doc/src/tv_start_system_unreadable.gif
deleted file mode 100644
index 38b69deb8e..0000000000
--- a/lib/tv/doc/src/tv_start_system_unreadable.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_start_system_unreadable.ps b/lib/tv/doc/src/tv_start_system_unreadable.ps
deleted file mode 100644
index 4486557837..0000000000
--- a/lib/tv/doc/src/tv_start_system_unreadable.ps
+++ /dev/null
@@ -1,1377 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_start_system_unreadable.eps)
-%%CreationDate: (Mon Mar 19 17:15:29 2001)
-%%BoundingBox: 0 0 377 205
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 377 205
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-377.000000 205.000000
-12
-755 410
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-828282
-aab6aa
-e7e7e7
-000000
-000000
-000000
-000000
-000000
-000000
-000a01ff01ff01dc000b0208040001ff01ff01dc00000208040000000208040002ff02ff
-02dc000002080400000002080400020000ff00ff00d90400020000000208040000000202
-04060200000004ff04ff04d9020000000405020204000000020204000209000d02ff02ff
-02d000000202040000000202040002080000020d040002f6010302110103023801010206
-0101024001010230010102ff020400000202040000000202040002080000020d040002f6
-010102020107020001010203010102010101020e0105020001070201010302070100020b
-01010206010102400101020c0104021e010102ff02040000020204000000020204000208
-0000020d040002f6010102050101020301010203010102010101020e0101020701010203
-01010201010102050101020b010102060101024e010102020101021d010102ff02040000
-0202040000000202040002080000020204060203040002f6010102050101020301010203
-010102010101020e01010207010102030101020801040201010302030101020001010203
-010102020103020301040206010302030101020001010207010102000101020101010203
-010302030101020201010200010102020101020101030202010102000101020101010203
-010302020101020001010201010102020103020201010202010102f30000020204000000
-04030208000002020400030400000203040002f601010205010102040101020201000202
-0101020e0101020701010203010202080101020201010201010102020102020001010202
-010102010101020101010201010102090101020101010202010202000101020601020200
-010202000101020101010201010102020101020201020200010102010101020001010200
-010102020102020001020200010102010101020101010201010102000101020101010201
-010102010101020101010202010102f3000004030101020b000002030400030200000204
-040002f6010102050101020401010201010102020101020e010402040101020401030206
-010102060101020201010201010102020101020101010201010102010102020801010201
-010102020101020101010206010102010101020101010205010102020101020201010201
-010102010101020001010200010102020101020101010201010102050101020101020203
-01010201010102010101020101010202010002f70103020b000002030400030200000204
-040002f6010102050101020501010200010002030101020e010102070101020601020205
-010102030104020201010201010102020101020101050202010302060101020101010202
-010102010101020601010201010102010101020201040202010102020101020101010201
-010102000101020001010202010102010101020101010202010402010101020401010201
-0105020201010200010102f70103020b000002040400030000000205040002f601010205
-01010205010302030101020e010102070101020701010205010102020101020101010202
-010102010101020201010201010102080102020501010201010102020101020101010206
-010102010101020101010201010102010101020201010202010102010101020101010201
-010102000101020101010201010102010101020101010201010102010101020401010201
-0101020601010200010002f80103020b000002040400030000000205040002f601010205
-01010206010102040101020e010102070101020301010201010102050101020201010201
-010102020101020101010202010102010101020201000205010102050101020101010202
-010102010101020601010201010102010101020101010201010102020101020201010201
-010102020101020701010201010102010101020101010201010102010101020401010201
-0101020201000203010202f80103020b0000020500000206040002f60101020501010206
-010102040101020e01050203010102040103020701020201010202000101020101040203
-010102020103020201040207010302030101020101010206010102010101020101010202
-010202000101020101010202010102010101020301050202010102010101020101010202
-0102020001010200010102040101020201030204010102f90103020b0000020d040002f6
-01030211010302c4010102fa0103020b0000020d040002ff02d5010102fa0103020b0000
-020d040002ff02ff02d20103020c040d02ff02ff02d3010302ff02ff02ee010302ff02ff
-02ee0103020200ff00ff00e70400020201030202000004ff04ff04e70202010302ff02ff
-02ee0103020200ff00ff00e802020103020200ff00ff00e70700020201030202000105ff
-05ff05e40701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e407010202
-010302020001050b06040504060005030602051f0600050206000504060005270602050b
-06000506060005ff05ff053506000502060005090602051307010202010302020001050b
-0600050f0600051f060005020600052c060005020600050a060005ff05ff053d06000502
-0600050b0600051307010202010302020001050b06000506060205050600050306020518
-060005020600050206020503060205020600050206000517060005020600050106000500
-060105020604050206020503060205020600050006010503060205ff05ff052006000502
-060005020602050506000502060005000601050c07010202010302020001050b06000508
-060005050600050206000502060005180600050006000505060005020600050206000501
-060005020600051706000502060005010601050106000503060005060600050206000502
-06000501060105010600050106000502060005ff05ff051f060005020600050106000502
-0600050406000502060105010600050b07010202010302020001050b0603050506000505
-060005020600050206000518060005000600050506000502060005020600050106000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000501060005ff05ff052306040501060005020600050406000502
-060005020600050b07010202010302020001050b06000508060005050600050206040518
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05ff052006000502060005010604050406000502060005020600050b0701020201030202
-0001050b0600050806000505060005020600051d06000506060005020600050506000500
-060005000600051706000502060005010600050206000503060005060600050206000502
-060005010600050206000505060005ff05ff051f06000502060005010600050806000502
-060005020600050b07010202010302020001050b06000508060005050600050206000502
-060005190600050606000502060005020600050106000500060005000600051706000502
-060005010601050106000503060005060600050206000502060005010600050206000501
-06000502060005ff05ff051f060005020600050106000502060005040600050206010501
-0600050b07010202010302020001050b0600050806000505060005030602051a06000506
-060005030602050306000500060005190602050206000500060105050601050406000503
-060205020600050206000502060205ff05ff052006000502060005020602050506000502
-060005000601050c070102020103020200010576060005ff05ff055b0600050f07010202
-010302020001050a0606052a0606052a06060500060005ff05ff05450606050e0600050f
-07010202010302020001050a0606052a0606052a06060500060005ff05ff05450606050e
-0600050f0701020201030202000105ff05ff05e40701020201030202000105ff05ff05e4
-0701020201030202000105ff05ff05e40701020201030202000107ff07ff07e602020103
-0202000007ff07ff07e702020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff05e80202
-0103020205ff05ff05e802020103020205ff05ff05e8020201030202051c010205040103
-05c1010205040103051a0102057f01010505010205f001020504010305190101052f0202
-01030202050e01060508010005060101050f010205010102059b01060508010005060101
-0510010505040101054d010205240104050d0101051e0102052401020501010205930106
-0508010005060101051101030535020201030202050e0100050101010500010005070101
-050601000511010105010100059d01000501010105000100050701010506010005130101
-05060100054d0101050001010524010105000101050c0100051e01010500010105240101
-050101000595010005010101050001000507010105060100051101010501010105340202
-010302020510010105030103050201030503010105030103050801020500010105010103
-05000101050001000500010005020103058b010105030103050201030503010105030103
-050a010105030104054c0101050101050500010305000102050201030501010105000102
-05070101050101010500010305030104051d010105010105050001030500010205020103
-050101010500010205070102050001010501010305000101050001000500010005020103
-058301010503010305020103050301010503010305090101050101000500010305020105
-050101030521020201030202051001010506010105000101050101010502010105020101
-0501010105070100050001000500010005050101050001050500010105010101058a0101
-050601010500010105010101050201010502010105010101050901010502010105010101
-054c01000502010105000101050201000500010205000101050001010501010105010102
-050001000507010105010101050201010502010105010101051d01000502010105000101
-050201000500010205000101050001010501010105010102050001000507010005000100
-050001000505010105000105050001010501010105820101050601010500010105010101
-050201010502010105010101050801020504010105020101050001010501010105010101
-052002020103020205100100050401040500010105010101050201010501010605070100
-0500010205020104050001010500010005000107058a0100050401040500010105010101
-0502010105010106050901010501010105020101054b0101050201000501010105000100
-05000100050001010501010805010101050a0103050401010501010105020101051c0101
-05020100050101010500010005000100050001010501010805010101050a010005000102
-050201040500010105000100050001070582010005040104050001010501010105020101
-05010106050901020503010105040101050101060520020201030202050f010105020101
-0501010105000101050201010501010105020101050b0101050001010501010105010101
-05010100050001000500010005000101058e010105020101050101010500010105020101
-0501010105020101050d01010502010105010101054c0101050101010501010205000100
-05010100050201000500010105050101050a0101050601010502010105010101051d0101
-05010101050101020500010005010100050201000500010105050101050a010105000101
-050101010501010105010100050001000500010005000101058601010502010105010101
-05000101050201010501010105020101050b010105010101050201010503010105030101
-0525020201030202050f0101050201010501010105000101050101010502010105020101
-050101010507010005010101050101010501010105000101050001000500010005000101
-05010101058a010105020101050101010500010105010101050201010502010105010101
-050901010502010105010101054c01010500010105020103050101010501010105000101
-0501010105010101050a0101050601010502010105010101051d01010500010105020103
-0501010105010101050001010501010105010101050a0100050101010501010105010101
-050001010500010005000100050001010501010105820101050201010501010105000101
-050101010502010105020101050101010507010105010101050201010502010205000101
-05000101050101010521020201030202050e01030502010a050101050501010305070102
-0500010105020107050001000500010105000103058a01030502010a0501010505010103
-0508010505010105054c0102050301010500010005000103050001020500010305010104
-050701030503010505010105051d01020503010105000100050001030500010205000103
-05010104050701020500010105020107050001000500010105000103058201030502010a
-050101050501010305090103050101050500010505010103052202020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e802020103020205ff05ff05e802020103020205ff05ff05e802020103020205ff05ff
-05e8020201030202050201ff01ff01e205020202010302020503010000cb010100810101
-0059010100c30101005801000711000005020202010302020503010000cb010100810101
-0059010100c30101005801000701030607000306000105020202010302020503010000cb
-010100810101000c0100002301000026010100c301010058010007010305000007000306
-0001050202020103020205030100001f0100000a0100009e010100810101000b01000004
-010100090104000a01010002010000250101001e0102000501000012010000060100002e
-010000120102000301020031010100080104004a01000701030500000701030500010502
-02020103020205030100001f0100000a0100009e010100810101000a0100000401000001
-010000080100000d01000001010000020100002401010020010000190100003601000014
-010000050100003101010008010000020100004a01000701030400010701030500010502
-02020103020205030100000901020003010200090104000201020002010000000101009b
-01010081010100090100000501000001010000080100000d010000010100000301000023
-010100090102000201000000010100020100000001010005010000030102000301020003
-01020002010400020102000301020002010000000101000a010200030102000201000000
-010100020104000101000000010100030102000501000005010000030102000201000000
-010100230101000c0100004a010007010304000105000701030400010502020201030202
-0503010000080100000201000001010000020100000a0100000301000002010000010101
-00010100009a01010081010100080100000601000001010000080103000a010000010100
-000401000022010100080100000201000001010100010100000101010001010000040100
-000501000002010000020100000101000002010000030100000601000002010000020100
-000101010001010000080100000201000001010000020100000101010001010000030100
-000301010001010000010100000201000004010000050100000201000002010000010101
-0001010000220101000b0100004b01000701030300010501070103040001050202020103
-020205030100000c010000010100000e0100000701000001010000020100009a01010081
-0101000701000007010000010100000c010000090100000101000005010000210101000c
-010000010100000201000001010000020100000401000005010000020100000901000003
-010000060100000201000002010000010100000201000008010000050100000201000001
-010000020100000301000003010000050100000201000004010000050100000201000002
-01000001010000260101000b0100004b0100070103030001050207010303000105020202
-01030202050301000009010300010100000e0100000401030001010000020100009a0101
-00810101000801000006010000010100000c010000090100000101000004010000220101
-000901030001010000020100000101000002010000040100000501000002010000060103
-000301000006010000020100000201000001010000020100000801000005010000020100
-000101000002010000030100000301000005010000020100000401000005010000020104
-0001010000260101000b0100004b01000701030200010503070103030001050202020103
-020205030100000801000002010000010100000e01000003010000020100000101000002
-0100009a0101008101010009010000050100000101000008010000020100000901000001
-010000030100002301010008010000020100000101000002010000010100000201000004
-010000050100000201000005010000020100000301000006010000020100000201000001
-010000020100000801000005010000020100000101000002010000030100000301000005
-0100000201000004010000050100000201000005010000260101000a0100004c01000701
-030200010504070103020001050202020103020205030100000801000002010000010100
-00020100000a010000030100000201000001010100010100009a010100810101000a0100
-000401000001010000030101000201000002010000030101000301000001010000020100
-002401010008010000020100000101010001010000010101000101000004010000050100
-000201000002010000010100000201000003010000060100000201000002010000010100
-000201000008010000020100000101000002010000010100000201000003010000030100
-0005010000020100000401000005010000020100000201000001010000260101000a0100
-004c01000701030100010505070103020001050202020103020205030100000901030002
-0102000c0101000201030001010000000101009b010100810101000b0100000401010004
-010100030102000401010004010100020100002501010009010300010100000001010002
-010000000101000501000005010000030102000301030004010100040100000301020002
-010000020100000901020003010200020100000201000004010100010100000601020005
-010000050100000301020002010000260101000a0100004c010007010301000105060701
-030100010502020201030202050301000015010500af010100810101000c010000230100
-00260101000f010000050100003c01050068010100580100070103000001050707010301
-000105020202010302020503010000cb01010081010100590101000f01000005010000ab
-010100580100070103000001050807010300000105020202010302020503010000cb0101
-0081010100590101000f01000005010000ab01010058010007010001070b030000010502
-0202010302020503010000cb0101008101010059010100c301010058010007010000070d
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-030e000105020202010302020503010000cb0101008101010059010100c3010100580100
-0701001005020202010302020503010000cb0101008101010059010100c3010100580100
-0701000d070000010502020201030202050301ff01ff01ce07010001050a070100010502
-020201030202050308cd01ff01ff010007010001050a0701000105020202010302020503
-080009cb08000100098101010959010109c301010958010007010001050a070100010502
-0202010302020503080009cb08000100090b0101094e0101092201010959010109c30101
-0958010007010001050a0701000105020202010302020503080009cb08000100090a0100
-091c0100092a01000908010009210101090c0100092a0100091f010109c3010109580100
-07010001050a07010001050202020103020205030800091a080009af08000100090a0100
-0905010009050101090c010009040101090a010209020104090a01010902010009070100
-09210101090b010009040101090a010209020104090a010109020100091e0101091a0100
-09a70101090901020903010209020104093c010007010001050a07010001050202020103
-020205030800091a080009af08000100090a0100090401010904010009010100090a0100
-090401000901010009080100090201000901010009020100090901000901010009020100
-0906010009210101090a0100090401000901010009080100090201000901010009020100
-090901000901010009020100091d0101091a010009a70101090801000902010009010100
-090201000901010009020100093c010007010001050a0701000105020202010302020503
-0800090908020903080209030801090008000902080209a908000100090a010009030100
-090001000904010009010100090901000905010009010100090c01000905010009090100
-09010100090301000905010009210101090901000905010009010100090c010009050100
-090901000901010009030100091c01010909010209030102090301010900010009020102
-090a01020903010209020100090001010902010009020100090201020902010009000101
-09700101090c01000905010009050100093c010007010001050a07010001050202020103
-020205030800090808000902080009010800090208000901080009010801090108000902
-080009a808000100090a0100090501000904010009010100090801000906010009010100
-090c010009040100090a0100090101000904010009040100092101010908010009060100
-09010100090c010009040100090a01000901010009040100091b01010908010009020100
-090101000902010009010100090101010901010009020100090801000902010009010100
-090201000901010109010100090101000902010009010100090201000901010109010100
-096f0101090c01000905010009040100093d010007010001050a07010001050202020103
-0202050308000908080009050800090208000901080009020800090108000902080009a8
-0800010009080101090601000904010009010100090701000907010009010100090b0100
-09050100090a0100090101000905010009040101091f0101090701000907010009010100
-090b010009050100090a01000901010009050100091a0101090801000905010009020100
-090101000902010009010100090201000908010009050100090201000901010009050100
-0902010009010100090201000901010009730101090b01000905010009050100093d0100
-07010001050a070100010502020201030202050308000908080009050800090208000901
-0800090208000901080409a808000100090a010009050100090401000901010009080100
-0906010009010100090a010009060100090a010009010100090401000904010009210101
-090801000906010009010100090a010009060100090a01000901010009040100091b0101
-090801000905010009020100090101000902010009010104090901020902010409010100
-0906010009000100090201040901010009730101090a01000905010009060100093d0100
-07010001050a070100010502020201030202050308000908080009050800090208000901
-0800090208000901080009ac08000100090a010009050100090401000901010009090100
-09050100090101000909010009060100090b010009010100090301000905010009210101
-0909010009050100090101000909010009060100090b01000901010009030100091c0101
-090801000905010009020100090101000902010009010100091001000901010009050100
-0906010009000100090201000905010009730101090901000905010009060100093e0100
-07010001050a070100010502020201030202050308000908080009020800090108000902
-08000901080009010801090108000902080009a808000100090a01000905010009040100
-090101000903010109040100090401000901010009030101090201000907010009050101
-0903010009010100090201000906010009210101090a0100090401000901010009030101
-090201000907010009050101090301000901010009020100091d01010908010009020100
-090101000902010009010100090101010901010009020100090801000902010009010100
-090201000901010009070100090301000902010009010100097301010908010009050100
-09070100093e010007010001050a07010001050202020103020205030800090908020903
-080209030801090008000902080209a908000100090a0100090301040903010109040101
-090501000904010109040101090201040903010009050101090401010902010009070100
-09210101090b010009040101090401010902010409030100090501010904010109020100
-091e01010909010209030102090301010900010009020102090a01020903010209020100
-09070100090401020902010009730101090801040901010409030100093e010007010001
-050a0701000105020202010302020503080009cb08000100090a01000914010009060100
-092a01000908010009210101090c0100092a0100091f0101092301050999010109580100
-07010001050a0701000105020202010302020503080009cb08000100090b010109100101
-093b0101092201010959010109c301010958010007010001050a07010001050202020103
-02020503080009cb08000100098101010959010109c301010958010007010001050a0701
-000105020202010302020503080009cb08000100098101010959010109c3010109580100
-07010001050a0701000105020202010302020503080009cb080001000981010109590101
-09c301010958010007010001050a0701000105020202010302020503080009cb08000100
-098101010959010109c301010958010007010001050a0701000105020202010302020503
-080009cb08000100098101010959010109c301010958010007010001050a070100010502
-020201030202050308cd01ff01ff010007010001050a0701000105020202010302020503
-08cd01ff01ff010007010001050a0701000105020202010302020503080009cb08000100
-098101010959010109c301010958010007010001050a0701000105020202010302020503
-080009cb08000100090b0101094e0101092201010959010109c301010958010007010001
-050a0701000105020202010302020503080009cb08000100090a0100091c0100092a0100
-0908010009210101090c0100092a0100091f010109c301010958010007010001050a0701
-0001050202020103020205030800091a080009af08000100090a01000905010009050100
-090d010009040101090a010209020104090a0101090201000907010009210101090b0100
-09040101090a010209020104090a010109020100091e0101091a010009a7010109090102
-090301020944010007010001050a07010001050202020103020205030800091a080009af
-08000100090a01000904010109040101090c010009040100090101000908010009020100
-09010100090201000909010009010100090201000906010009210101090a010009040100
-0901010009080100090201000901010009020100090901000901010009020100091d0101
-091a010009a70101090801000902010009010100090201000943010007010001050a0701
-000105020202010302020503080009090802090308020903080109000800090208020909
-0800090008010903080209020801090008000903080209030802097f08000100090a0100
-09030100090001000903010009000100090b01000905010009010100090c010009050100
-0909010009010100090301000905010009210101090901000905010009010100090c0100
-09050100090901000901010009030100091c010109090102090301020903010109000100
-09020102090a010209030102090201000900010109020100090201000902010209020100
-0900010109700101090c0100090501000943010007010001050a07010001050202020103
-020205030800090808000902080009010800090208000901080009010801090108000902
-080009080801090108000901080009020800090108000900080009000800090108000902
-08000901080009020800097e08000100090a01000905010009050100090a010009060100
-09010100090c010009040100090a01000901010009040100090401000921010109080100
-0906010009010100090c010009040100090a01000901010009040100091b010109080100
-090201000901010009020100090101000901010109010100090201000908010009020100
-090101000902010009010101090101000901010009020100090101000902010009010101
-09010100096f0101090c0100090501000943010007010001050a07010001050202020103
-020205030800090808000905080009020800090108000902080009010800090208000908
-080009020800090508000901080009000800090008000901080009020800090108000982
-08000100090801010906010009050100090901000907010009010100090b010009050100
-090a0100090101000905010009040101091f0101090701000907010009010100090b0100
-09050100090a01000901010009050100091a010109080100090501000902010009010100
-090201000901010009020100090801000905010009020100090101000905010009020100
-09010100090201000901010009730101090a0101090401010944010007010001050a0701
-000105020202010302020503080009080800090508000902080009010800090208000901
-08040908080009020800090208030901080009000800090008000901080409020802097f
-08000100090a01000905010009050100090a01000906010009010100090a010009060100
-090a010009010100090401000904010009210101090801000906010009010100090a0100
-09060100090a01000901010009040100091b010109080100090501000902010009010100
-090201000901010409090102090201040901010009060100090001000902010409010100
-09730101090c0100090501000943010007010001050a0701000105020202010302020503
-0800090808000905080009020800090108000902080009010800090c0800090208000901
-0800090208000901080009000800090008000901080009090800097e08000100090a0100
-0905010009050100090b010009050100090101000909010009060100090b010009010100
-0903010009050100092101010909010009050100090101000909010009060100090b0100
-0901010009030100091c0101090801000905010009020100090101000902010009010100
-0910010009010100090501000906010009000100090201000905010009730101090c0100
-090501000943010007010001050a07010001050202020103020205030800090808000902
-080009010800090208000901080009010801090108000902080009080800090208000901
-08000902080009010800090008000900080009010800090208000901080009020800097e
-08000100090a010009050100090501000905010109040100090401000901010009030101
-0902010009070100090501010903010009010100090201000906010009210101090a0100
-090401000901010009030101090201000907010009050101090301000901010009020100
-091d01010908010009020100090101000902010009010100090101010901010009020100
-090801000902010009010100090201000901010009070100090301000902010009010100
-09730101090801000902010009010100090201000943010007010001050a070100010502
-020201030202050308000909080209030802090308010900080009020802090908000902
-0800090208030901080009000800090008000902080209030802097f08000100090a0100
-090301040901010409030101090501000904010109040101090201040903010009050101
-09040101090201000907010009210101090b010009040101090401010902010409030100
-090501010904010109020100091e01010909010209030102090301010900010009020102
-090a01020903010209020100090701000904010209020100097301010909010209030102
-0944010007010001050a070100010502020201030202050308000923080509a108000100
-090a01000914010009060100092a01000908010009210101090c0100092a0100091f0101
-09230105099901010958010007010001050a0701000105020202010302020503080009cb
-08000100090b010109100101093b0101092201010959010109c301010958010007010001
-050a0701000105020202010302020503080009cb08000100098101010959010109c30101
-0958010007010001050a0701000105020202010302020503080009cb0800010009810101
-0959010109c301010958010007010001050a0701000105020202010302020503080009cb
-08000100098101010959010109c301010958010007010001050a07010001050202020103
-02020503080009cb08000100098101010959010109c301010958010007010001050a0701
-000105020202010302020503080009cb08000100098101010959010109c3010109580100
-07010001050a070100010502020201030202050308cd01ff01ff010007010001050a0701
-00010502020201030202050308cd01ff01ff010007010001050a07010001050202020103
-02020503080009cb08000100098101010959010109c301010958010007010001050a0701
-000105020202010302020503080009cb08000100090b0101094701010929010109590101
-09c301010958010007010001050a0701000105020202010302020503080009cb08000100
-090a010009150100092a01000908010009280101090c0100092a0100091f010109c30101
-0958010007010001050a07010001050202020103020205030800091d08000908080009a2
-08000100090a010009040102090c010009040101090b010009030104090a010109020100
-0907010009280101090b010009040101090b010009030104090a010109020100091e0101
-09180100090a01000922010209770101090a0100094c010007010001050a070100010502
-02020103020205030800091d080009ac08000100090a01000903010009020100090a0100
-090401000901010009090101090301000902010009090100090101000902010009060100
-09280101090a010009040100090101000909010109030100090201000909010009010100
-09020100091d010109180100090a0100092401000977010109090101094c010007010001
-050a07010001050202020103020205030800090908020903080209030802090208000901
-0800090308020903080209030802099408000100090a0100090301000902010009090100
-090501000901010009080100090001000907010009090100090101000903010009050100
-092801010909010009050100090101000908010009000100090701000909010009010100
-09030100091c010109080100090001010903010209020104090801000901010009030102
-090201000900010109020100090001010903010209050100097701010908010009000100
-094c010007010001050a0701000105020202010302020503080009080800090208000901
-080009020800090108000902080009010800090008000906080009020800090208000901
-080009020800099308000100090a01000903010009020100090801000906010009010100
-090a010009060100090a0100090101000904010009040100092801010908010009060100
-09010100090a010009060100090a01000901010009040100091b01010908010109010100
-090101000902010009030100090a01000900010009030100090201000901010109010100
-090101010901010009010100090201000904010009770101090a0100094c010007010001
-050a07010001050202020103020205030800090808000905080009020800090108000902
-080009010801090708000902080009020800090108000997080001000908010109050102
-090801000907010009010100090a010009060100090a0100090101000905010009040101
-09260101090701000907010009010100090a010009060100090a01000901010009050100
-091a01010908010009020100090101000902010009030100090a01010904010009020100
-09010100090501000902010009010100090201000904010009770101090a0100094c0100
-07010001050a070100010502020201030202050308000908080009050800090208000901
-08000902080009010801090708000902080409020802099408000100090a010009030100
-09020100090801000906010009010100090a010009060100090a01000901010009040100
-0904010009280101090801000906010009010100090a010009060100090a010009010100
-09040100091b010109080100090201000901010409030100090a01010904010409010100
-0905010009020100090101040904010009770101090a0100094c010007010001050a0701
-000105020202010302020503080009080800090508000902080009010800090208000901
-080009000800090608000902080009090800099308000100090a01000903010009020100
-090901000905010009010100090a010009050100090b0100090101000903010009050100
-09280101090901000905010009010100090a010009050100090b01000901010009030100
-091c010109080100090201000901010009070100090a0100090001000903010009050100
-0905010009020100090101000908010009770101090a0100094c010007010001050a0701
-000105020202010302020503080009080800090208000901080009020800090108000902
-080009010800090108000905080009020800090208000901080009020800099308000100
-090a01000903010009020100090301010904010009040100090101000903010109040100
-09050100090501010903010009010100090201000906010009280101090a010009040100
-0901010009030101090401000905010009050101090301000901010009020100091d0101
-0908010009020100090101000902010009030100090a0100090101000902010009020100
-09010100090501000902010009010100090201000904010009770101090a0100094c0100
-07010001050a070100010502020201030202050308000909080209030802090308020902
-080009020800090408000903080209030802099408000100090a01000904010209040101
-090501000904010109040101090201040903010009050101090401010902010009070100
-09280101090b010009040101090401010902010409030100090501010904010109020100
-091e01010908010009020100090201020905010109080100090201000902010209020100
-090501000902010009020102090501000977010109080104094a010007010001050a0701
-000105020202010302020503080009cb08000100090a0100090d010009060100092a0100
-0908010009280101090c0100092a0100091f0101091c010509a001010958010007010001
-050a0701000105020202010302020503080009cb08000100090b010109090101093b0101
-092901010959010109c301010958010007010001050a0701000105020202010302020503
-080009cb08000100098101010959010109c301010958010007010001050a070100010502
-0202010302020503080009cb08000100098101010959010109c301010958010007010001
-050a0701000105020202010302020503080009cb08000100098101010959010109c30101
-0958010007010001050a0701000105020202010302020503080009cb0800010009810101
-0959010109c301010958010007010001050a0701000105020202010302020503080009cb
-08000100098101010959010109c301010958010007010001050a07010001050202020103
-0202050308cd01ff01ff010007010001050a070100010502020201030202050301ff01ff
-01ce07010001050a0701000105020202010302020503010000cb01010081010100590101
-00c301010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb010100810101000c0100002a0100001f010100c301010058010007010001050a0701
-00010502020201030202050301000010010200090100000d0102000a010200100100007b
-010100810101000b010000040101000b010000050100000c010100020100001e01010010
-010200090100000d010200930101000a0101004b010007010001050a0701000105020202
-01030202050301000012010000090100000f0100000c010000100100007b010100810101
-000a010000040100000101000009010100040101000b01000001010000020100001d0101
-0012010000090100000f0100009301010009010000010100004a010007010001050a0701
-000105020202010302020503010000090101000001000004010000030102000201000000
-01010003010200050100000c010000030102000301020002010000010100000301020071
-01010081010100090100000501000001010000080100000001000003010000000100000b
-01000001010000030100001c010100090101000001000004010000030102000201000000
-01010003010200050100000901000000010100030102000201010000010000030102000a
-01020003010200020100000001010002010000020100000201020002010000000101003f
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000801000001010100040100000201000002010000010101000101000001010000020100
-00040100000c010000020100000201000001010000020100000101000000010000030100
-000201000070010100810101000801000006010000010100000a010000050100000b0100
-0001010000040100001b0101000801000001010100040100000201000002010000010101
-000101000001010000020100000401000009010100010100000101000002010000010100
-000001000000010000010100000201000008010000020100000101000002010000010101
-00010100000101000002010000010100000201000001010100010100003e010100090100
-00010100004a010007010001050a07010001050202020103020205030100000801000002
-010000040100000201000002010000010100000201000005010000040100000c01000002
-010000020100000101000005010100040100007401010081010100070100000701000001
-0100000a010000050100000b01000001010000050100001a010100080100000201000004
-010000020100000201000001010000020100000501000004010000090100000201000005
-010000010100000001000000010000010100000201000008010000050100000201000001
-01000005010000020100000101000002010000010100004201010009010000010100004a
-010007010001050a07010001050202020103020205030100000801000002010000040100
-000201000002010000010100000201000002010300040100000c01000002010000020100
-0001010000050101000501020071010100810101000801000006010000010100000a0100
-00050100000b01000001010000040100001b010100080100000201000004010000020100
-000201000001010000020100000201030004010000090100000201000002010300010100
-000001000000010000010104000901020002010400010100000601000000010000020104
-00010100004201010009010000010100004a010007010001050a07010001050202020103
-020205030100000801000002010000040100000201000002010000010100000201000001
-01000002010000040100000c010000020100000201000001010000050100000001000007
-01000070010100810101000901000005010000010100000a010000050100000b01000001
-010000030100001c01010008010000020100000401000002010000020100000101000002
-010000010100000201000004010000090100000201000001010000020100000101000000
-010000000100000101000010010000010100000501000006010000000100000201000005
-0100004201010009010000010100004a010007010001050a070100010502020201030202
-050301000008010000010101000401000002010000020100000101010001010000010100
-0002010000040100000c0100000201000002010000010100000201000001010000010100
-00020100000201000070010100810101000a010000040100000101000003010100040100
-0005010000050101000301000001010000020100001d0101000801000001010100040100
-000201000002010000010101000101000001010000020100000401000009010000020100
-000101000002010000010100000001000000010000010100000201000008010000020100
-000101000002010000010100000701000003010000020100000101000042010100090100
-00010100004a010007010001050a07010001050202020103020205030100000901010000
-0100000401000003010200020100000001010003010300040100000c0100000301020003
-01020002010000020100000201020071010100810101000b010000040101000401010002
-010400010104000301010004010100020100001e01010009010100000100000401000003
-010200020100000001010003010300040100000901000002010000020103000101000000
-01000000010000020102000a010200030102000201000007010000040102000201000042
-0101000a0101004b010007010001050a07010001050202020103020205030100000c0100
-002301050093010100810101000c0100002a0100001f0101000c010000230105001c0105
-006801010058010007010001050a07010001050202020103020205030100000801000002
-010000bd01010081010100590101000801000002010000b501010058010007010001050a
-070100010502020201030202050301000009010200be0101008101010059010100090102
-00b601010058010007010001050a0701000105020202010302020503010000cb01010081
-01010059010100c301010058010007010001050a07010001050202020103020205030100
-00cb0101008101010059010100c301010058010007010001050a07010001050202020103
-02020503010000cb0101008101010059010100c301010058010007010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a070100010502020201030202050301ff01ff01ce07010001050a0701000105020202
-01030202050301ff01ff01ce07010001050a0701000105020202010302020503010000cb
-0101008101010059010100c301010058010007010001050a070100010502020201030202
-0503010000cb0101008101010059010100c301010058010007010001050a070100010502
-0202010302020503010000cb010100810101000c0100002a0100001f010100c301010058
-010007010001050a070100010502020201030202050301000010010200090100000d0102
-009b010100810101000b010000040101000b010000050100000c010100020100001e0101
-0010010200090100000d010200930101000a0101004b010007010001050a070100010502
-020201030202050301000012010000090100000f0100009b010100810101000a01000004
-0100000101000009010100040101000b01000001010000020100001d0101001201000009
-0100000f0100009301010009010000010100004a010007010001050a0701000105020202
-010302020503010000090101000001000004010000030102000201000000010100030102
-000501000009010000000101000301020002010100000100000301020003010200710101
-0081010100090100000501000001010000080100000001000003010000000100000b0100
-0001010000030100001c0101000901010000010000040100000301020002010000000101
-0003010200050100000901000000010100030102000201010000010000030102000a0102
-0003010200020100000001010002010000020100000201020002010000000101003f0101
-0009010000010100004a010007010001050a070100010502020201030202050301000008
-010000010101000401000002010000020100000101010001010000010100000201000004
-010000090101000101000001010000020100000101000000010000000100000101000002
-010000010100000201000070010100810101000801000006010000010100000a01000005
-0100000b01000001010000040100001b0101000801000001010100040100000201000002
-010000010101000101000001010000020100000401000009010100010100000101000002
-010000010100000001000000010000010100000201000008010000020100000101000002
-01000001010100010100000101000002010000010100000201000001010100010100003e
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000801000002010000040100000201000002010000010100000201000005010000040100
-000901000002010000050100000101000000010000000100000101000002010000010100
-0074010100810101000701000007010000010100000a010000050100000b010000010100
-00050100001a010100080100000201000004010000020100000201000001010000020100
-000501000004010000090100000201000005010000010100000001000000010000010100
-000201000008010000050100000201000001010000050100000201000001010000020100
-00010100004201010009010000010100004a010007010001050a07010001050202020103
-020205030100000801000002010000040100000201000002010000010100000201000002
-010300040100000901000002010000020103000101000000010000000100000101040002
-01020071010100810101000801000006010000010100000a010000050100000b01000001
-010000040100001b01010008010000020100000401000002010000020100000101000002
-010000020103000401000009010000020100000201030001010000000100000001000001
-010400090102000201040001010000060100000001000002010400010100004201010009
-010000010100004a010007010001050a0701000105020202010302020503010000080100
-000201000004010000020100000201000001010000020100000101000002010000040100
-000901000002010000010100000201000001010000000100000001000001010000090100
-0070010100810101000901000005010000010100000a010000050100000b010000010100
-00030100001c010100080100000201000004010000020100000201000001010000020100
-000101000002010000040100000901000002010000010100000201000001010000000100
-000001000001010000100100000101000005010000060100000001000002010000050100
-004201010009010000010100004a010007010001050a0701000105020202010302020503
-010000080100000101010004010000020100000201000001010100010100000101000002
-010000040100000901000002010000010100000201000001010000000100000001000001
-01000002010000010100000201000070010100810101000a010000040100000101000003
-0101000401000005010000050101000301000001010000020100001d0101000801000001
-010100040100000201000002010000010101000101000001010000020100000401000009
-010000020100000101000002010000010100000001000000010000010100000201000008
-010000020100000101000002010000010100000701000003010000020100000101000042
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000901010000010000040100000301020002010000000101000301030004010000090100
-000201000002010300010100000001000000010000020102000301020071010100810101
-000b010000040101000401010002010400010104000301010004010100020100001e0101
-000901010000010000040100000301020002010000000101000301030004010000090100
-000201000002010300010100000001000000010000020102000a01020003010200020100
-00070100000401020002010000420101000a0101004b010007010001050a070100010502
-02020103020205030100000c0100002301050093010100810101000c0100002a0100001f
-0101000c010000230105001c0105006801010058010007010001050a0701000105020202
-0103020205030100000801000002010000bd010100810101005901010008010000020100
-00b501010058010007010001050a070100010502020201030202050301000009010200be
-010100810101005901010009010200b601010058010007010001050a0701000105020202
-010302020503010000cb0101008101010059010100c301010058010007010001050a0701
-000105020202010302020503010000cb0101008101010059010100c30101005801000701
-0001050a0701000105020202010302020503010000cb0101008101010059010100c30101
-0058010007010001050a0701000105020202010302020503010000cb0101008101010059
-010100c301010058010007010001050a070100010502020201030202050301ff01ff01ce
-07010001050a070100010502020201030202050301ff01ff01ce07010001050a07010001
-05020202010302020503010000cb0101008101010059010100c301010058010007010001
-050a0701000105020202010302020503010000cb0101008101010059010100c301010058
-010007010001050a0701000105020202010302020503010000cb010100810101000c0100
-002a0100001f010100c301010058010007010001050a0701000105020202010302020503
-01000010010200090100000d0102004301000056010100810101000b010000040101000b
-010000050100000c010100020100001e01010010010200090100000d010200930101000a
-0101004b010007010001050a070100010502020201030202050301000012010000090100
-000f0100004301000056010100810101000a010000040100000101000009010100040101
-000b01000001010000020100001d01010012010000090100000f01000093010100090100
-00010100004a010007010001050a07010001050202020103020205030100000901010000
-010000040100000301020002010000000101000301020005010000090100000001010003
-010200020101000001000003010200030102000a01020002010000020100000101040054
-01010081010100090100000501000001010000080100000001000003010000000100000b
-01000001010000030100001c010100090101000001000004010000030102000201000000
-01010003010200050100000901000000010100030102000201010000010000030102000a
-01020003010200020100000001010002010000020100000201020002010000000101003f
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000801000001010100040100000201000002010000010101000101000001010000020100
-000401000009010100010100000101000002010000010100000001000000010000010100
-000201000001010000020100000801000002010000010100000201000003010000560101
-00810101000801000006010000010100000a010000050100000b01000001010000040100
-001b01010008010000010101000401000002010000020100000101010001010000010100
-000201000004010000090101000101000001010000020100000101000000010000000100
-000101000002010000080100000201000001010000020100000101010001010000010100
-0002010000010100000201000001010100010100003e01010009010000010100004a0100
-07010001050a070100010502020201030202050301000008010000020100000401000002
-010000020100000101000002010000050100000401000009010000020100000501000001
-01000000010000000100000101000002010000010100000c010000020100000201000000
-0100000401000056010100810101000701000007010000010100000a010000050100000b
-01000001010000050100001a010100080100000201000004010000020100000201000001
-010000020100000501000004010000090100000201000005010000010100000001000000
-010000010100000201000008010000050100000201000001010000050100000201000001
-01000002010000010100004201010009010000010100004a010007010001050a07010001
-050202020103020205030100000801000002010000040100000201000002010000010100
-000201000002010300040100000901000002010000020103000101000000010000000100
-000101040002010200090104000301000005010000560101008101010008010000060100
-00010100000a010000050100000b01000001010000040100001b01010008010000020100
-000401000002010000020100000101000002010000020103000401000009010000020100
-000201030001010000000100000001000001010400090102000201040001010000060100
-000001000002010400010100004201010009010000010100004a010007010001050a0701
-000105020202010302020503010000080100000201000004010000020100000201000001
-010000020100000101000002010000040100000901000002010000010100000201000001
-010000000100000001000001010000090100000801000006010000000100000401000056
-010100810101000901000005010000010100000a010000050100000b0100000101000003
-0100001c0101000801000002010000040100000201000002010000010100000201000001
-010000020100000401000009010000020100000101000002010000010100000001000000
-010000010100001001000001010000050100000601000000010000020100000501000042
-01010009010000010100004a010007010001050a07010001050202020103020205030100
-000801000001010100040100000201000002010000010101000101000001010000020100
-000401000009010000020100000101000002010000010100000001000000010000010100
-000201000001010000020100000801000002010000010100000201000003010000560101
-00810101000a010000040100000101000003010100040100000501000005010100030100
-0001010000020100001d0101000801000001010100040100000201000002010000010101
-000101000001010000020100000401000009010000020100000101000002010000010100
-000001000000010000010100000201000008010000020100000101000002010000010100
-00070100000301000002010000010100004201010009010000010100004a010007010001
-050a07010001050202020103020205030100000901010000010000040100000301020002
-010000000101000301030004010000090100000201000002010300010100000001000000
-01000002010200030102000a01020002010000020100000401010054010100810101000b
-010000040101000401010002010400010104000301010004010100020100001e01010009
-010100000100000401000003010200020100000001010003010300040100000901000002
-01000002010300010100000001000000010000020102000a010200030102000201000007
-0100000401020002010000420101000a0101004b010007010001050a0701000105020202
-0103020205030100000c010000230105002301050069010100810101000c0100002a0100
-001f0101000c010000230105001c0105006801010058010007010001050a070100010502
-02020103020205030100000801000002010000bd01010081010100590101000801000002
-010000b501010058010007010001050a0701000105020202010302020503010000090102
-00be010100810101005901010009010200b601010058010007010001050a070100010502
-0202010302020503010000cb0101008101010059010100c301010058010007010001050a
-0701000105020202010302020503010000cb0101008101010059010100c3010100580100
-07010001050a0701000105020202010302020503010000cb0101008101010059010100c3
-01010058010007010001050a0701000105020202010302020503010000cb010100810101
-0059010100c301010058010007010001050a070100010502020201030202050301ff01ff
-01ce07010001050a070100010502020201030202050308cd01ff01ff010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100000b0101004e
-0101002201010059010100c301010058010007010001050a070100010502020201030202
-0503080000cb08000100000a0100001c0100002a01000008010000210101000c0100002a
-0100001f010100c301010058010007010001050a07010001050202020103020205030800
-00cb08000100000a01000005010000040102000c010000040101000d010000020102000b
-0101000201000007010000210101000b010000040101000d010000020102000b01010002
-0100001e0101002001010018010000150100006f01010009010200020104004301000701
-0001050a0701000105020202010302020503080000cb08000100000a0100000401010003
-010000020100000a01000004010000010100000b01010001010000020100000901000001
-0100000201000006010000210101000a01000004010000010100000b0101000101000002
-0100000901000001010000020100001d0101001f0100001a010000150100006f01010008
-010000020100000101000047010007010001050a07010001050202020103020205030800
-000908010000080000020802000908000000080100030802000208010000080000030802
-00030802008d08000100000a010000030100000001000007010000090100000501000001
-0100000a0100000001000005010000090100000101000003010000050100002101010009
-01000005010000010100000a01000000010000050100000901000001010000030100001c
-0101000901010000010000020102000b0100000301000000010100030102000201000000
-0101000201040002010200020100000001010003010100000100006f0101000801000002
-0100000101000047010007010001050a0701000105020202010302020503080000080800
-000108010001080000020800000808010001080000010800000208000001080000000800
-0000080000010800000208000001080000020800008c08000100000a0100000501000007
-010000080100000601000001010000090100000101000005010000090100000101000004
-010000040100002101010008010000060100000101000009010000010100000501000009
-01000001010000040100001b010100080100000101010001010000020100000801040001
-010100010100000101000002010000010101000101000003010000030100000201000001
-0101000101000001010000010101006f0101000801000002010000010103004401000701
-0001050a07010001050202020103020205030800000808000002080000010800000c0800
-000208000005080000010800000008000000080000010800000208000001080000900800
-010000080101000601000006010000080100000701000001010000080100000201000003
-0101000a0100000101000005010000040101001f01010007010000070100000101000008
-01000002010000030101000a01000001010000050100001a010100080100000201000001
-0100000e0100000301000005010000020100000101000002010000030100000301000002
-010000010100000201000001010000020100006f01010009010200060100004301000701
-0001050a0701000105020202010302020503080000080800000208000002080200090800
-00020800000208030001080000000800000008000001080400020802008d08000100000a
-01000005010000050100000a010000060100000101000008010000020100000501000009
-010000010100000401000004010000210101000801000006010000010100000801000002
-010000050100000901000001010000040100001b0101000801000002010000020102000b
-010000030100000501000002010000010100000201000003010000030104000101000002
-01000001010000020100006f01010008010000020100000501000043010007010001050a
-070100010502020201030202050308000008080000020800000508000008080000020800
-00010800000208000001080000000800000008000001080000090800008c08000100000a
-01000005010000040100000c010000050100000101000008010500040100000901000001
-010000030100000501000021010100090100000501000001010000080105000401000009
-01000001010000030100001c0101000801000002010000050100000a0100000301000005
-010000020100000101000002010000030100000301000005010000020100000101000002
-0100006f0101000801000002010000010100000201000043010007010001050a07010001
-050202020103020205030800000808000001080100010800000208000008080000020800
-000108000002080000010800000008000000080000010800000208000001080000020800
-008c08000100000a01000005010000030100000701010004010000040100000101000003
-010100060100000101000002010000030101000301000001010000020100000601000021
-0101000a0100000401000001010000030101000601000001010000020100000301010003
-01000001010000020100001d010100080100000101010001010000020100000a01000003
-010000050100000201000001010000020100000301000003010000020100000101000002
-01000001010000010101006f010100080100000201000001010000020100004301000701
-0001050a0701000105020202010302020503080000090801000008000002080200090800
-00020800000208030001080000000800000008000002080200030802008d08000100000a
-010000030104000101040003010100050100000401010004010100060100000201020004
-010100040101000201000007010000210101000b01000004010100040101000601000002
-0102000401010004010100020100001e0101000901010000010000020102000b01000003
-010000060102000201000002010000040101000201020002010000020100000201010000
-0100006f010100090102000301020044010007010001050a070100010502020201030202
-05030800000c08000007080500af08000100000a01000014010000060100002a01000008
-010000210101000c0100002a0100001f0101000c01000007010500a70101005801000701
-0001050a07010001050202020103020205030800000808000002080000bd08000100000b
-010100100101003b01010022010100590101000801000002010000b50101005801000701
-0001050a070100010502020201030202050308000009080200be08000100008101010059
-01010009010200b601010058010007010001050a07010001050202020103020205030800
-00cb08000100008101010059010100c301010058010007010001050a0701000105020202
-010302020503080000cb08000100008101010059010100c301010058010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100008101010059
-010100c301010058010007010001050a070100010502020201030202050308cd01ff01ff
-010007010001050a070100010502020201030202050308cd01ff01ff010007010001050a
-0701000105020202010302020503080000cb08000100008101010059010100c301010058
-010007010001050a0701000105020202010302020503080000cb08000100000b0101004e
-0101002201010059010100c301010058010007010001050a070100010502020201030202
-0503080000cb08000100000a0100001c0100002a01000008010000210101000c0100002a
-0100001f010100c301010058010007010001050a07010001050202020103020205030800
-00110800000308000010080000010800009e08000100000a01000005010000040102000c
-010000040101000d010000050100000a0101000201000007010000210101000b01000004
-0101000d010000050100000a010100020100001e010100c30101000a0100000401020044
-010007010001050a07010001050202020103020205030800001108000003080000100800
-00010800009e08000100000a0100000401010003010000020100000a0100000401000001
-0100000b0101000401010009010000010100000201000006010000210101000a01000004
-010000010100000b010100040101000901000001010000020100001d010100c301010009
-010100030100000201000043010007010001050a07010001050202020103020205030800
-0009080100000800000108040001080000010800000a0801000008000001080000000801
-009b08000100000a0100000301000000010000070100000901000005010000010100000a
-010000000100000301000000010000090100000101000003010000050100002101010009
-01000005010000010100000a010000000100000301000000010000090100000101000003
-0100001c010100c30101000801000000010000030100000201000043010007010001050a
-070100010502020201030202050308000008080000010801000308000003080000000800
-000a0800000108010001080100010800009a08000100000a010000050100000701000008
-010000060100000101000009010000010100000201000001010000090100000101000004
-010000040100002101010008010000060100000101000009010000010100000201000001
-0100000901000001010000040100001b010100c30101000a010000030100000201000043
-010007010001050a07010001050202020103020205030800000808000002080000030800
-00030801000b0800000208000001080000020800009a0800010000080101000601000005
-010100080100000701000001010000080100000201000001010000020100000901000001
-01000005010000040101001f010100070100000701000001010000080100000201000001
-010000020100000901000001010000050100001a010100c30101000a0100000401030043
-010007010001050a07010001050202020103020205030800000808000002080000030800
-00030801000b0800000208000001080000020800009a08000100000a0100000501000007
-010000080100000601000001010000080100000201000001010000020100000901000001
-010000040100000401000021010100080100000601000001010000080100000201000001
-010000020100000901000001010000040100001b010100c30101000a0100000701000043
-010007010001050a07010001050202020103020205030800000808000002080000030800
-0003080000000800000a0800000208000001080000020800009a08000100000a01000005
-010000070100000901000005010000010100000801050000010500080100000101000003
-010000050100002101010009010000050100000101000008010500000105000801000001
-010000030100001c010100c30101000a0100000701000043010007010001050a07010001
-050202020103020205030800000808000001080100030800000308000001080000090800
-000108010001080100010800009a08000100000a01000005010000030100000201000003
-010100040100000401000001010000030101000601000005010000030101000301000001
-0100000201000006010000210101000a0100000401000001010000030101000601000005
-010000030101000301000001010000020100001d010100c30101000a0100000301000002
-01000043010007010001050a070100010502020201030202050308000009080100000800
-00040801000108000002080000090801000008000001080000000801009b08000100000a
-010000030104000201020004010100050100000401010004010100060100000501000003
-010100040101000201000007010000210101000b01000004010100040101000601000005
-0100000301010004010100020100001e010100c301010008010400020102004401000701
-0001050a07010001050202020103020205030800000c0800000e080500a808000100000a
-01000014010000060100002a01000008010000210101000c0100002a0100001f010100c3
-01010058010007010001050a070100010502020201030202050308000008080000020800
-00bd08000100000b010100100101003b0101002201010059010100c30101005801000701
-0001050a070100010502020201030202050308000009080200be08000100008101010059
-010100c301010058010007010001070c000105020202010302020503080000cb08000100
-008101010059010100c301010058010007010000070d0001050202020103020205030800
-00cb08000100008101010059010100c30101005801000701030e00010502020201030202
-0503080000cb08000100008101010059010100c30101005801000701030e000105020202
-010302020503080000cb08000100008101010059010100c30101005801000701030e0001
-0502020201030202050308cd01ff01ff01000701030e00010502020201030202050308cd
-01ff01ff01000701030e000105020202010302020503080000cb08000100008101010059
-010100c30101005801000701030e000105020202010302020503080000cb08000100000b
-0101004e0101002201010059010100c30101005801000701030e00010502020201030202
-0503080000cb08000100000a0100001c0100002a01000008010000210101000c0100002a
-0100001f010100c30101005801000701030e000105020202010302020503080000110800
-000308000010080000010800009e08000100000a01000005010000070100000b01000004
-0101000d010000050100000a0101000201000007010000210101000b010000040101000d
-010000050100000a010100020100001e010100c301010008010400020102004401000701
-030e000105020202010302020503080000110800000308000010080000010800009e0800
-0100000a01000004010100060101000a01000004010000010100000b0101000401010009
-010000010100000201000006010000210101000a01000004010000010100000b01010004
-0101000901000001010000020100001d010100c301010008010000050100000201000043
-01000701030e000105020202010302020503080000090801000008000001080400010800
-00010800000a0801000008000001080000000801009b08000100000a0100000301000000
-01000005010000000100000901000005010000010100000a010000000100000301000000
-01000009010000010100000301000005010000210101000901000005010000010100000a
-0100000001000003010000000100000901000001010000030100001c010100c301010008
-01000005010000020100004301000701030e000105020202010302020503080000080800
-00010801000308000003080000000800000a0800000108010001080100010800009a0800
-0100000a0100000501000004010000010100000801000006010000010100000901000001
-010000020100000101000009010000010100000401000004010000210101000801000006
-01000001010000090100000101000002010000010100000901000001010000040100001b
-010100c30101000801030002010000020100004301000701030e00010502020201030202
-0503080000080800000208000003080000030801000b0800000208000001080000020800
-009a08000100000801010006010000030100000201000007010000070100000101000008
-010000020100000101000002010000090100000101000005010000040101001f01010007
-010000070100000101000008010000020100000101000002010000090100000101000005
-0100001a010100c30101000c010000020102004401000701030e00010502020201030202
-0503080000080800000208000003080000030801000b0800000208000001080000020800
-009a08000100000a01000005010000030100000201000008010000060100000101000008
-010000020100000101000002010000090100000101000004010000040100002101010008
-010000060100000101000008010000020100000101000002010000090100000101000004
-0100001b010100c30101000c01000001010000020100004301000701030e000105020202
-01030202050308000008080000020800000308000003080000000800000a080000020800
-0001080000020800009a08000100000a0100000501000003010500080100000501000001
-010000080105000001050008010000010100000301000005010000210101000901000005
-0100000101000008010500000105000801000001010000030100001c010100c301010008
-0100000201000001010000020100004301000701030e0001050202020103020205030800
-000808000001080100030800000308000001080000090800000108010001080100010800
-009a08000100000a01000005010000070100000301010004010000040100000101000003
-01010006010000050100000301010003010000010100000201000006010000210101000a
-010000040100000101000003010100060100000501000003010100030100000101000002
-0100001d010100c3010100080100000201000001010000020100004301000701030e0001
-050202020103020205030800000908010000080000040801000108000002080000090801
-000008000001080000000801009b08000100000a01000003010400050100000301010005
-010000040101000401010006010000050100000301010004010100020100000701000021
-0101000b010000040101000401010006010000050100000301010004010100020100001e
-010100c301010009010200030102004401000701030e0001050202020103020205030800
-000c0800000e080500a808000100000a01000014010000060100002a0100000801000021
-0101000c0100002a0100001f010100c30101005801000701030e00010502020201030202
-05030800000808000002080000bd08000100000b010100100101003b0101002201010059
-010100c30101005801000701030e00010502020201030202050308000009080200be0800
-0100008101010059010100c30101005801000701030e0001050202020103020205030800
-00cb08000100008101010059010100c30101005801000701030e00010502020201030202
-0503080000cb08000100008101010059010100c30101005801000701030e000105020202
-010302020503080000cb08000100008101010059010100c30101005801000701030e0001
-05020202010302020503080000cb08000100008101010059010100c30101005801000701
-030e00010502020201030202050308cd01ff01ff01000701030e00010502020201030202
-050308cd01ff01ff01000701030e000105020202010302020503080000cb080001000081
-01010059010100c30101005801000701030e000105020202010302020503080000cb0800
-0100000b0101004e0101002201010059010100c30101005801000701030e000105020202
-010302020503080000cb08000100000a0100001c0100002a01000008010000210101000c
-0100002a0100001f010100c30101005801000701030e0001050202020103020205030800
-00110800000308000010080000010800009e08000100000a01000005010000030104000b
-010000040101000d010000050100000a0101000201000007010000210101000b01000004
-0101000d010000050100000a010100020100001e010100c3010100090102000301020044
-01000701030e000105020202010302020503080000110800000308000010080000010800
-009e08000100000a01000004010100030100000e01000004010000010100000b01010004
-01010009010000010100000201000006010000210101000a01000004010000010100000b
-010100040101000901000001010000020100001d010100c3010100080100000201000001
-010000020100004301000701030e00010502020201030202050308000009080100000800
-000108040001080000010800000a0801000008000001080000000801009b08000100000a
-0100000301000000010000030100000d01000005010000010100000a0100000001000003
-010000000100000901000001010000030100000501000021010100090100000501000001
-0100000a0100000001000003010000000100000901000001010000030100001c010100c3
-0101000c010000050100004301000701030e000105020202010302020503080000080800
-00010801000308000003080000000800000a0800000108010001080100010800009a0800
-0100000a0100000501000003010300090100000601000001010000090100000101000002
-010000010100000901000001010000040100000401000021010100080100000601000001
-010000090100000101000002010000010100000901000001010000040100001b010100c3
-0101000c010000050100004301000701030e000105020202010302020503080000080800
-000208000003080000030801000b0800000208000001080000020800009a080001000008
-010100060100000701000007010000070100000101000008010000020100000101000002
-010000090100000101000005010000040101001f01010007010000070100000101000008
-0100000201000001010000020100000901000001010000050100001a010100c30101000a
-010100040101004401000701030e00010502020201030202050308000008080000020800
-0003080000030801000b0800000208000001080000020800009a08000100000a01000005
-010000070100000801000006010000010100000801000002010000010100000201000009
-010000010100000401000004010000210101000801000006010000010100000801000002
-01000001010000020100000901000001010000040100001b010100c30101000c01000005
-0100004301000701030e0001050202020103020205030800000808000002080000030800
-0003080000000800000a0800000208000001080000020800009a08000100000a01000005
-010000030100000201000009010000050100000101000008010500000105000801000001
-010000030100000501000021010100090100000501000001010000080105000001050008
-01000001010000030100001c010100c30101000c010000050100004301000701030e0001
-050202020103020205030800000808000001080100030800000308000001080000090800
-000108010001080100010800009a08000100000a01000005010000030100000201000003
-010100040100000401000001010000030101000601000005010000030101000301000001
-0100000201000006010000210101000a0100000401000001010000030101000601000005
-010000030101000301000001010000020100001d010100c3010100080100000201000001
-010000020100004301000701030e00010502020201030202050308000009080100000800
-00040801000108000002080000090801000008000001080000000801009b08000100000a
-010000030104000201020004010100050100000401010004010100060100000501000003
-010100040101000201000007010000210101000b01000004010100040101000601000005
-0100000301010004010100020100001e010100c301010009010200030102004401000701
-030e0001050202020103020205030800000c0800000e080500a808000100000a01000014
-010000060100002a01000008010000210101000c0100002a0100001f010100c301010058
-01000701030e0001050202020103020205030800000808000002080000bd08000100000b
-010100100101003b0101002201010059010100c30101005801000701030e000105020202
-01030202050308000009080200be08000100008101010059010100c30101005801000701
-030e000105020202010302020503080000cb08000100008101010059010100c301010058
-01000701030e000105020202010302020503080000cb08000100008101010059010100c3
-0101005801000701030e000105020202010302020503080000cb08000100008101010059
-010100c30101005801000701030e000105020202010302020503080000cb080001000081
-01010059010100c30101005801000701030e00010502020201030202050308cd01ff01ff
-01000701030e00010502020201030202050308cd01ff01ff01000701030e000105020202
-010302020503080000cb08000100008101010059010100c30101005801000701030e0001
-05020202010302020503080000cb08000100000b0101004e0101002201010059010100c3
-0101005801000701030e000105020202010302020503080000cb08000100000a0100001c
-0100002a01000008010000210101000c0100002a0100001f010100c30101005801000701
-030e000105020202010302020503080000110800000308000010080000010800009e0800
-0100000a01000005010000040102000c010000040101000d010000050100000a01010002
-01000007010000210101000b010000040101000d010000050100000a010100020100001e
-010100c30101000a0101004b01000701030e000105020202010302020503080000110800
-000308000010080000010800009e08000100000a0100000401010003010000020100000a
-01000004010000010100000b010100040101000901000001010000020100000601000021
-0101000a01000004010000010100000b010100040101000901000001010000020100001d
-010100c301010009010000010100004a01000701030e0001050202020103020205030800
-0009080100000800000108040001080000010800000a0801000008000001080000000801
-009b08000100000a0100000301000000010000030100000d01000005010000010100000a
-010000000100000301000000010000090100000101000003010000050100002101010009
-01000005010000010100000a010000000100000301000000010000090100000101000003
-0100001c010100c301010009010000010100004a01000701030e00010502020201030202
-050308000008080000010801000308000003080000000800000a08000001080100010801
-00010800009a08000100000a01000005010000030100000c010000060100000101000009
-010000010100000201000001010000090100000101000004010000040100002101010008
-010000060100000101000009010000010100000201000001010000090100000101000004
-0100001b010100c301010009010000010100004a01000701030e00010502020201030202
-0503080000080800000208000003080000030801000b0800000208000001080000020800
-009a08000100000801010006010000030103000801000007010000010100000801000002
-0100000101000002010000090100000101000005010000040101001f0101000701000007
-01000001010000080100000201000001010000020100000901000001010000050100001a
-010100c301010009010000010100004a01000701030e0001050202020103020205030800
-00080800000208000003080000030801000b0800000208000001080000020800009a0800
-0100000a0100000501000003010000020100000801000006010000010100000801000002
-010000010100000201000009010000010100000401000004010000210101000801000006
-01000001010000080100000201000001010000020100000901000001010000040100001b
-010100c301010009010000010100004a01000701030e0001050202020103020205030800
-0008080000020800000308000003080000000800000a0800000208000001080000020800
-009a08000100000a01000005010000030100000201000009010000050100000101000008
-010500000105000801000001010000030100000501000021010100090100000501000001
-01000008010500000105000801000001010000030100001c010100c30101000901000001
-0100004a01000701030e0001050202020103020205030800000808000001080100030800
-000308000001080000090800000108010001080100010800009a08000100000a01000005
-010000030100000201000003010100040100000401000001010000030101000601000005
-0100000301010003010000010100000201000006010000210101000a0100000401000001
-010000030101000601000005010000030101000301000001010000020100001d010100c3
-01010009010000010100004a01000701030e000105020202010302020503080000090801
-0000080000040801000108000002080000090801000008000001080000000801009b0800
-0100000a0100000301040002010200040101000501000004010100040101000601000005
-01000003010100040101000201000007010000210101000b010000040101000401010006
-010000050100000301010004010100020100001e010100c30101000a0101004b01000701
-030e0001050202020103020205030800000c0800000e080500a808000100000a01000014
-010000060100002a01000008010000210101000c0100002a0100001f010100c301010058
-01000701030e0001050202020103020205030800000808000002080000bd08000100000b
-010100100101003b0101002201010059010100c30101005801000701030e000105020202
-01030202050308000009080200be08000100008101010059010100c30101005801000701
-030e000105020202010302020503080000cb08000100008101010059010100c301010058
-01000701030e000105020202010302020503080000cb08000100008101010059010100c3
-0101005801000701030e000105020202010302020503080000cb08000100008101010059
-010100c30101005801000701030e000105020202010302020503080000cb080001000081
-01010059010100c30101005801000701030e00010502020201030202050308cd01ff01ff
-01000701030e00010502020201030202050308cd01ff01ff01000701030e000105020202
-010302020503080000cb08000100008101010059010100c30101005801000701030e0001
-05020202010302020503080000cb08000100000b0101004e0101002201010059010100c3
-0101005801000701030e000105020202010302020503080000cb08000100000a0100001c
-0100002a01000008010000210101000c0100002a0100001f010100c30101005801000701
-030e000105020202010302020503080000110800000308000010080000010800009e0800
-0100000a01000005010000030104000b010000040101000d010000050100000a01010002
-01000007010000210101000b010000040101000d010000050100000a010100020100001e
-010100c30101000a01000003010400030101003d01000701030e00010502020201030202
-0503080000110800000308000010080000010800009e08000100000a0100000401010003
-010000020100000a01000004010000010100000b01010004010100090100000101000002
-01000006010000210101000a01000004010000010100000b010100040101000901000001
-010000020100001d010100c3010100090101000301000006010000010100003c01000701
-030e00010502020201030202050308000009080100000800000108040001080000010800
-000a0801000008000001080000000801009b08000100000a010000030100000001000007
-0100000901000005010000010100000a0100000001000003010000000100000901000001
-0100000301000005010000210101000901000005010000010100000a0100000001000003
-010000000100000901000001010000030100001c010100c3010100080100000001000003
-01000006010000010100003c01000701030e000105020202010302020503080000080800
-00010801000308000003080000000800000a0800000108010001080100010800009a0800
-0100000a0100000501000006010000090100000601000001010000090100000101000002
-010000010100000901000001010000040100000401000021010100080100000601000001
-010000090100000101000002010000010100000901000001010000040100001b010100c3
-0101000a0100000301030003010000010100003c01000701030e00010502020201030202
-0503080000080800000208000003080000030801000b0800000208000001080000020800
-009a08000100000801010006010000060100000801000007010000010100000801000002
-0100000101000002010000090100000101000005010000040101001f0101000701000007
-01000001010000080100000201000001010000020100000901000001010000050100001a
-010100c30101000a0100000701000002010000010100003c01000701030e000105020202
-010302020503080000080800000208000003080000030801000b08000002080000010800
-00020800009a08000100000a010000050100000601000009010000060100000101000008
-010000020100000101000002010000090100000101000004010000040100002101010008
-010000060100000101000008010000020100000101000002010000090100000101000004
-0100001b010100c30101000a0100000701000002010000010100003c01000701030e0001
-0502020201030202050308000008080000020800000308000003080000000800000a0800
-000208000001080000020800009a08000100000a01000005010000050100000b01000005
-010000010100000801050000010500080100000101000003010000050100002101010009
-010000050100000101000008010500000105000801000001010000030100001c010100c3
-0101000a010000030100000201000002010000010100003c01000701030e000105020202
-010302020503080000080800000108010003080000030800000108000009080000010801
-0001080100010800009a08000100000a0100000501000005010000050101000401000004
-010000010100000301010006010000050100000301010003010000010100000201000006
-010000210101000a01000004010000010100000301010006010000050100000301010003
-01000001010000020100001d010100c30101000a01000003010000020100000201000001
-0100003c01000701030e0001050202020103020205030800000908010000080000040801
-000108000002080000090801000008000001080000000801009b08000100000a01000003
-010400030100000501010005010000040101000401010006010000050100000301010004
-0101000201000007010000210101000b0100000401010004010100060100000501000003
-01010004010100020100001e010100c30101000801040002010200040101003d01000701
-030e0001050202020103020205030800000c0800000e080500a808000100000a01000014
-010000060100002a01000008010000210101000c0100002a0100001f010100c301010058
-01000701030e0001050202020103020205030800000808000002080000bd08000100000b
-010100100101003b0101002201010059010100c30101005801000701030e000105020202
-01030202050308000009080200be08000100008101010059010100c30101005801000701
-030e000105020202010302020503080000cb08000100008101010059010100c301010058
-01000701030e000105020202010302020503080000cb08000100008101010059010100c3
-0101005801000701030e000105020202010302020503080000cb08000100008101010059
-010100c30101005801000701030e000105020202010302020503080000cb080001000081
-01010059010100c30101005801000701030e00010502020201030202050308cd01ff01ff
-01000701030e00010502020201030202050308cd01ff01ff010007010010050202020103
-02020503080000cb08000100008101010059010100c301010058010007010300000c0700
-000105020202010302020503080000cb08000100000b0101004e01010022010100590101
-00c3010100580100070103000001050807010300000105020202010302020503080000cb
-08000100000a0100001c0100002a01000008010000210101000c0100002a0100001f0101
-00c301010058010007010301000105070701030000010502020201030202050308000011
-0800000308000010080000010800009e08000100000a01000005010000040102000c0100
-00040101000d010000050100000a0101000201000007010000210101000b010000040101
-000d010000050100000a010100020100001e010100c30101000801040001010400430100
-070103010001050607010301000105020202010302020503080000110800000308000010
-080000010800009e08000100000a0100000401010003010000020100000a010000040100
-00010100000b0101000401010009010000010100000201000006010000210101000a0100
-0004010000010100000b010100040101000901000001010000020100001d010100c30101
-000801000002010000010100000201000043010007010302000105050701030100010502
-020201030202050308000009080100000800000108040001080000010800000a08010000
-08000001080000000801009b08000100000a010000030100000001000003010000020100
-000901000005010000010100000a01000000010000030100000001000009010000010100
-000301000005010000210101000901000005010000010100000a01000000010000030100
-00000100000901000001010000030100001c010100c30101000c01000005010000430100
-070103020001050407010302000105020202010302020503080000080800000108010003
-08000003080000000800000a0800000108010001080100010800009a08000100000a0100
-000501000003010000020100000801000006010000010100000901000001010000020100
-000101000009010000010100000401000004010000210101000801000006010000010100
-00090100000101000002010000010100000901000001010000040100001b010100c30101
-000b01000005010000440100070103030001050307010302000105020202010302020503
-080000080800000208000003080000030801000b0800000208000001080000020800009a
-080001000008010100060100000401020008010000070100000101000008010000020100
-000101000002010000090100000101000005010000040101001f01010007010000070100
-0001010000080100000201000001010000020100000901000001010000050100001a0101
-00c30101000b010000050100004401000701030300010502070103030001050202020103
-02020503080000080800000208000003080000030801000b080000020800000108000002
-0800009a08000100000a0100000501000003010000020100000801000006010000010100
-000801000002010000010100000201000009010000010100000401000004010000210101
-000801000006010000010100000801000002010000010100000201000009010000010100
-00040100001b010100c30101000b01000005010000440100070103040001050107010303
-00010502020201030202050308000008080000020800000308000003080000000800000a
-0800000208000001080000020800009a08000100000a0100000501000003010000020100
-000901000005010000010100000801050000010500080100000101000003010000050100
-002101010009010000050100000101000008010500000105000801000001010000030100
-001c010100c30101000a0100000501000045010007010304000105000701030400010502
-020201030202050308000008080000010801000308000003080000010800000908000001
-08010001080100010800009a08000100000a010000050100000301000002010000030101
-000401000004010000010100000301010006010000050100000301010003010000010100
-000201000006010000210101000a01000004010000010100000301010006010000050100
-00030101000301000001010000020100001d010100c30101000a01000005010000450100
-070103050000070203040001050202020103020205030800000908010000080000040801
-000108000002080000090801000008000001080000000801009b08000100000a01000003
-010400020102000401010005010000040101000401010006010000050100000301010004
-0101000201000007010000210101000b0100000401010004010100060100000501000003
-01010004010100020100001e010100c30101000a01000005010000450100070103050000
-070103050001050202020103020205030800000c0800000e080500a808000100000a0100
-0014010000060100002a01000008010000210101000c0100002a0100001f010100c30101
-0058010007010306070103050001050202020103020205030800000808000002080000bd
-08000100000b010100100101003b0101002201010059010100c301010058010007010306
-0700030600010502020201030202050308000009080200be080001000081010100590101
-00c30101005801000701001005020202010302020503080000cb08000100008101010059
-010100c3010100580100070000110502020201030202050207ff07ff07d3051102020103
-0202050207ff07ff07d20000051102020103020205020701030d0000030000ff00ff00af
-03000001030c0001051102020103020205020701030b00010700030000ff00ff00ae0700
-03000003030a00010511020201030202050207010309000207010300000105ff05ff05ab
-0701030000050308000105110202010302020502070103070003050007010300000105ff
-05ff05ab0701030000010501000303060001051102020103020205020701030500030502
-07010300000105ff05ff05ab070103000001050300030304000105110202010302020502
-070103030003050407010300000105ff05ff05ab07010300000105050003030200010511
-0202010302020502070103010003050607010300000105ff05ff05ab0701030000010507
-000303000001051102020103020205020705050807010300000105ff05ff05ab07010300
-000105080703000105110202010302020502070103010703050607010300000105ff05ff
-05ab07010300000105070703030000010511020201030202050207010303070305040701
-0300000105ff05ff05ab0701030000010505070303020001051102020103020205020701
-03050703050207010300000105ff05ff05ab070103000001050307030304000105110202
-010302020502070103070703050007010300000105ff05ff05ab07010300000105010703
-03060001051102020103020205020701030907040300000105ff05ff05ab070103000001
-070303080001051102020103020205020701030b07020300000107ff07ff07ad03000001
-0701030a0001051102020101000405020701030d07000300000007ff07ff07ae03000000
-0700030c000105110005020204000502070100ff00ff00d1051100000202040000000202
-04000502070000ff00ff00d2051100000202040000000202040005ff05ff05e800000202
-040000000202040005ff05ff05e800000202040000000202040005ff05ff05e800000202
-0400000002020400000502ff02ff02dc00060202040000000208040002ff02ff02dc0000
-0208040000000208040002ff02ff02dc00000208040000000208040001ff01ff01dc0000
-020804000000040901ff01ff01dc00000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 377 205
-%%EOF
diff --git a/lib/tv/doc/src/tv_table_browser.gif b/lib/tv/doc/src/tv_table_browser.gif
deleted file mode 100644
index 9c7cb042ff..0000000000
--- a/lib/tv/doc/src/tv_table_browser.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_table_browser.ps b/lib/tv/doc/src/tv_table_browser.ps
deleted file mode 100644
index e2b195a2e5..0000000000
--- a/lib/tv/doc/src/tv_table_browser.ps
+++ /dev/null
@@ -1,2024 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_table_browser.eps)
-%%CreationDate: (Mon Mar 19 17:15:30 2001)
-%%BoundingBox: 0 0 380 315
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 380 315
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-380.000000 315.000000
-12
-760 630
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-ff0000
-990000
-7f7f7f
-999999
-ff7f7f
-000000
-000000
-000000
-000000
-000a01ff01ff01e1000b0208040001ff01ff01e100000208040000000208040002ff02ff
-02e1000002080400000002080400020000ff00ff00de0400020000000208040000000202
-04060200000004ff04ff04de020000000405020204000000020204000209000d02ff02ff
-02d500000202040000000202040002080000020d04000289010302110103023201020258
-0102020c010102010101021e010102290101020601010208010102310101022a01010230
-0101029600000202040000000202040002080000020d0400028901010202010702000101
-0203010102010101020e01050200010702010103020d0101020401010204010302030103
-020e010302060103020301030203010302060103020b0101020a01010202010102190100
-02030101021c0100020b01010206010102090101021b010202020100020d0101022a0101
-020c0104021e0101029600000202040000000202040002080000020d0400028901010205
-0101020301010203010102010101020e0101020701010203010102010101020c01010202
-010302030101020101010201010102010101020801010201010102010101020401010201
-01010201010102010101020101010201010102040101020101010201010102060101020a
-0101020201010218010102210101020b01010206010102090101021b010202020100020d
-01010238010102020101021d010102960000020204000000020204000208000002020406
-020304000289010102050101020301010203010102010101020e01010207010102030101
-020501010209010102030101020701010201010102010101020601020202010102010101
-020801010201010102010101020101010201010102040101020101010202010202030101
-020a01010203010102020103020301030202010302010104020101010202010302030101
-02000101020a0104020101030203010102000101020301010202010302030101021a0100
-020001010201010002020103020301040202010302020101020901010200010102010101
-020301030203010102020101020001010202010102010103020201010200010102010101
-020301030202010102000101020101010202010302020101020201010285000002020400
-000004030208000002020400030400000203040002890101020501010204010102020100
-02020101020e0101020701010203010202040101020a0100020301010207010102010101
-020101010205010102040101020101010208010102010101020101010201010102010101
-02040101020101010204010102020100020b010102030101020101010201010102010101
-020101010200010102010101020101010203010102010101020101010202010202000101
-020a01010202010102010101020201020200010102020101020101010201010102020101
-021a01000200010102010100020101010201010102010101020101010201010102010101
-020101010209010202000102020001010201010102010101020201010202010202000101
-020101010200010102000101020201020200010202000101020101010201010102010101
-0200010102010101020101010201010102010101020201010285000004030101020b0000
-0203040003020000020404000289010102050101020401010201010102020101020e0104
-0204010102040103020d0101020401010205010202020101020101010204010102050101
-020101010207010102020101020101010202010402040101020101010205010102020101
-020901010203010102010101020101010201010102080101020101010203010102010101
-020101010202010102010101020a01010206010102020101020101010202010102010101
-0201010102020101021a0100020001020200010002010101020101010201010102010101
-0201010102010101020d0101020101010201010102050101020201010202010102010101
-020101010200010102000101020201010201010102010101020501010201010202030101
-0201010102010101020101010202010002890103020b0000020304000302000002040400
-0289010102050101020501010200010002030101020e01010207010102060102020e0100
-020301010207010102010101020101010205010102040101020101010206010102030101
-020101010205010102040101020101010204010102020100020b01010203010102010101
-020101010201010102050104020101010203010102010101020101010202010102010101
-020a0101020301040202010102010101020201010201010502020101021a010002010101
-020001000201010102010101020101010201010102010105020d01010201010102010101
-020201040202010102020101020101010201010102000101020001010202010102010101
-0201010102020104020101010204010102010105020201010200010102890103020b0000
-02040400030000000205040002890101020501010205010302030101020e010102070101
-02070101020d010102030101020701010201010102010101020601020202010102010101
-0205010102040101020101010205010102040101020101010202010202030101020a0101
-020301010201010102010101020101010204010102010101020101010203010102010101
-020101010202010102010101020a01010202010102010101020201010201010102020101
-0201010102060101021a0100020201020201010102010101020101010201010102010101
-021101010201010102010101020101010201010102020101020201010201010102010101
-020101010200010102010101020101010201010102010101020101010201010102040101
-020101010206010102000100028a0103020b000002040400030000000205040002890101
-020501010206010102040101020e01010207010102030101020101010201010102080101
-020401010203010102010101020101010201010102010101020401010201010102010101
-020101010200010502010101020101010201010102010101020101010200010102010101
-0201010102060101020a0101020201010201010102010101020101010202010002000101
-02010101020101010203010102010101020101010202010102010101020a010102020101
-02010101020201010201010102020101020101010202010002010101021b010002020102
-020101010201010102010101020001020201010102020100020101010209010102010101
-020101010201010102010101020201010202010102010101020201010207010102010101
-0201010102010101020101010201010102040101020101010202010002030102028a0103
-020b0000020500000206040002890101020501010206010102040101020e010502030101
-020401030202010102080101020401010204010302030103020201010209010302020101
-0200010502020103020301030202010102010103020b0101020a01010202010102020103
-0203010302020102020001010201010202010101020201030203010102010101020b0102
-020101020200010102010104020301010202010302020101021b01000203010102020103
-020301010200010102020103020201010209010102010101020101010202010202000101
-020101010202010102010101020301050202010102010101020101010202010202000101
-02000101020401010202010302040101028b0103020b0000020d04000289010302110103
-0232010202190100023d0102020c01010237010602230101029e0101028c0103020b0000
-020d040002f2010002ff02540101028c0103020b0000020d040002ff02ff02d70103020c
-040d02ff02ff02d8010302ff02ff02f3010302ff02ff02f30103020200ff00ff00ec0400
-020201030202000004ff04ff04ec0202010302ff02ff02f3010302020500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000202010302020000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000202010302020500000005ff05ff05ea01000202010302020000
-05ff05ff05ea010005000202010302020500000005ff05ff05ea01000202010302020000
-05ff05ff05ea010005000202010302020500000005ff05ff05ea01000202010302020000
-050c06040504060005030602051f06040505060005040600050406000519060005020600
-0504060005270602050b06000506060005ff05ff05080600050206000509060205130100
-050002020103020205000000050b0600050f0600051f060005090600050a060005190600
-05020600052c060005020600050a060005ff05ff0510060005020600050b060005140100
-0202010302020000050c0600050606020505060005030602051806000506060105000600
-050206020502060405170600050206000502060205030602050206000502060005170600
-050206000501060005000601050206040502060205030602050206000500060105030602
-05ff05f306000502060005020602050506000502060005000601050c0100050002020103
-020205000000050b06000508060005050600050206000502060005170600050506000501
-06010504060005040600051a060005000600050506000502060005020600050106000502
-060005170600050206000501060105010600050306000506060005020600050206000501
-060105010600050106000502060005ff05f2060005020600050106000502060005040600
-0502060105010600050c01000202010302020000050c0603050506000505060005020600
-050206000517060305020600050206000504060005040600051a06000500060005050600
-050206000502060005010600050006000500060005170600050206000501060005020600
-0503060005060600050206000502060005010600050206000501060005ff05f606040501
-060005020600050406000502060005020600050b0100050002020103020205000000050b
-06000508060005050600050206040517060005050600050206000504060005040600051a
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05f306000502060005010604050406000502060005020600050c01000202010302020000
-050c0600050806000505060005020600051b060005050600050206000504060005040600
-051b06000506060005020600050506000500060005000600051706000502060005010600
-050206000503060005060600050206000502060005010600050206000505060005ff05f2
-06000502060005010600050806000502060005020600050b010005000202010302020500
-0000050b0600050806000505060005020600050206000517060005050600050106010504
-060005040600051b06000506060005020600050206000501060005000600050006000517
-060005020600050106010501060005030600050606000502060005020600050106000502
-0600050106000502060005ff05f206000502060005010600050206000504060005020601
-05010600050c01000202010302020000050c060005080600050506000503060205180604
-050206010500060005040600050506010519060005060600050306020503060005000600
-051906020502060005000601050506010504060005030602050206000502060005020602
-05ff05f306000502060005020602050506000502060005000601050c0100050002020103
-02020500000005a8060005ff05ff052e0600051001000202010302020000050b0606052a
-0606052a0606052a06060500060005ff05ff05180606050e0600050f0100050002020103
-020205000000050a0606052a0606052a0606052a06060500060005ff05ff05180606050e
-060005100100020201030202000005ff05ff05ea010005000202010302020500000005ff
-05ff05ea0100020201030202000005ff05ff05ea01000500020201030202050000000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100020201030202000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050002020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-020201030202053600000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000051a00000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050100000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050100000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000051a00000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000051a00000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000051a00000500000005000000050000000500000005000000050000000500
-00000500000005000000050000000500000005ff05a50202010302020535000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500010005180000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000100000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050001000518000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500010005180000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000100051800000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000500010005ff05a402020103
-02020536000005140100051a00000514010005010000051401000501000005140100051a
-000005140100051a000005140100051a00000514010005ff05a502020103020205350000
-051601000518000005160100000005160100000005160100051800000516010005180000
-05160100051800000516010005ff05a40202010302020536000005140100051a00000514
-010005010000051401000501000005140100051a000005140100051a000005140100051a
-00000514010005ff05a50202010302020535000005050602050306020506010005180000
-051601000000051601000000051601000518000005160100051800000516010005180000
-0516010005ff05a402020103020205360000050406020503060205050100051a00000514
-010005010000051401000501000005140100051a00000506060405080100051a00000508
-060105090100051a0000050806030507010005ff05a50202010302020535000005040604
-050106040505010005180000051006000504010000000510060005040100000005040600
-051001000518000005050608050701000518000005080603050901000518000005070607
-0506010005ff05a402020103020205360000050306000501060105010600050106010504
-0100051a0000050f06000503010005010000050f0600050301000501000005030600050f
-0100051a00000503060a05050100051a00000507060305080100051a0000050506030501
-06030504010005ff05a5020201030202053500000503060d0504010005180000050d0600
-0501060005040100000005040600050a06000504010000000504060005010600050d0100
-051800000504060305020603050601000518000005090601050a01000518000005060602
-050306020505010005ff05a4020201030202053600000501060005000603050006020500
-060405020100051a0000050c060005010600050301000501000005030600050a06000503
-0100050100000503060005010600050c0100051a0000050206030504060305040100051a
-000005140100051a000005050602050306020504010005ff05a502020103020205350000
-050206000500060305000602050006040503010005180000050a06000501060005010600
-050401000000050406000504060005040600050401000000050406000501060005010600
-050a01000518000005030602050306070503010005180000050706040509010005180000
-05070601050206020506010005ff05a40202010302020536000005010600050006030500
-06020500060405020100051a000005090600050106000501060005030100050100000503
-06000504060005040600050301000501000005030600050106000501060005090100051a
-0000050206020504060505030100051a00000507060305080100051a0000050a06020506
-010005ff05a5020201030202053500000502060005000603050006020500060405030100
-051800000507060005010600050106000501060005040100000005040600050406000501
-060005010600050401000000050406000501060005010600050106000507010005180000
-05030602050506030505010005180000050906020509010005180000050a060205080100
-05ff05a40202010302020536000005010600050006070500060405020100051a00000506
-060005010600050106000501060005030100050100000503060005040600050106000501
-060005030100050100000503060005010600050106000501060005060100051a00000502
-06030505060105050100051a00000508060205080100051a0000050806020508010005ff
-05a502020103020205350000050206000500060405010600050006040503010005180000
-050406000501060005010600050106000501060005040100000005040600050106000501
-060005010600050106000504010000000504060005010600050106000501060005010600
-050401000518000005040603050d01000518000005090602050901000518000005090602
-0509010005ff05a402020103020205360000050106060501060605020100051a00000503
-060005010600050106000501060005010600050301000501000005030600050106000501
-060005010600050106000503010005010000050306000501060005010600050106000501
-060005030100051a00000503060905060100051a00000508060205080100051a00000514
-010005ff05a5020201030202053500000502060005000602050506000500060205030100
-051800000504060005010600050106000501060005010600050401000000050406000501
-060005010600050106000501060005040100000005040600050106000501060005010600
-050106000504010005180000050506070508010005180000050806040508010005180000
-050906020509010005ff05a4020201030202053600000501060005000602050506000500
-060205020100051a00000503060005010600050106000501060005010600050301000501
-000005030600050106000501060005010600050106000503010005010000050306000501
-060005010600050106000501060005030100051a00000506060405080100051a00000506
-060605060100051a0000050806020508010005ff05a50202010302020535000005020604
-050506040503010005180000051601000000051601000000051601000518000005160100
-0518000005160100051800000516010005ff05a40202010302020536000005140100051a
-00000514010005010000051401000501000005140100051a000005140100051a00000514
-0100051a00000514010005ff05a502020103020205350000051601000518000005160100
-000005160100000005160100051800000516010005180000051601000518000005160100
-05ff05a40202010302020536000005140100051a00000514010005010000051401000501
-000005140100051a000005140100051a000005140100051a00000514010005ff05a50202
-010302020535000005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005180000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000518000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005180000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100051800000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005ff05a402020103020205360100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100051a0100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005010100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005010100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100051a0100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100051a0100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100051a0100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005ff05a5020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed020201030202050301ff01ff01e505030202
-01030202050301ff01ff01d1050000000500000005000000050000000500000005000000
-050000000500000005000000050001000503020201030202050301ff01ff01d100000500
-000005000000050000000500000005000000050000000500000005000000050001010503
-020201030202050301020aff0aff0acb010205000000050e010005000100050302020103
-0202050301020aff0aff0aca000001020000051001010503020201030202050301020a01
-00ff00ff00c9010205000000050e0100050001000503020201030202050301020a0100ff
-00ff00c901020000051001010503020201030202050301020a0100ff00ff00c901020500
-0000050e0100050001000503020201030202050301020a0100ff00ff00c9010200000510
-01010503020201030202050301020a0100ff00ff00c9010205000000050e010005000100
-0503020201030202050301020a0100ff00ff00c9010200000502010a0502010105030202
-01030202050301020a0100ff00ff00c90102050000000502010805020100050001000503
-020201030202050301020a0100ff00ff00c9010200000504010605040101050302020103
-0202050301020a0100ff00ff00c901020500000005040104050401000500010005030202
-01030202050301020a0100ff00ff00c90102000005060102050601010503020201030202
-050301020a0100ff00ff00c9010205000000050601000506010005000100050302020103
-0202050301020a0100ff00ff00c901020000051001010503020201030202050301020a01
-00ff00ff00c9010205000000050e0100050001000503020201030202050301020a0100ff
-00ff00c901020000051001010503020201030202050301020a0100ff00ff00c901020500
-0000050e0100050001000503020201030202050301020a0100ff00ff00c9010200000510
-01010503020201030202050301020a0100ff00ff00c9010205000000050e010005000100
-0503020201030202050301020a0000ff00ff00ca01020000051001010503020201030202
-050301ff01ff01d105000000050001000500010005000100050001000500010005000100
-0500010005000100050001000503020201030202050301ff01ff01d10000050001000500
-010005000100050001000500010005000100050001000500010005000101050302020103
-0202050301ff01ff01e5050302020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-020201030202050301ff01ff01e505030202010302020503010005ff05ff05970100054a
-01000503020201030202050301000563010505ff05ff052d0100054a0100050302020103
-0202050301000562010705ff05ff052c0100054a01000503020201030202050301000561
-01020503010205ff05ff052b0100054a0100050302020103020205030100056101010505
-010105ff05ff052b0100054a0100050302020103020205030100056101020503010205ff
-05ff052b0100054a01000503020201030202050301000562010705ff05ff052c0100054a
-01000503020201030202050301000563010505ff05ff052d0100054a0100050302020103
-0202050301000565010105ff05ff052f0100054a01000503020201030202050301000565
-010105ff05ff052f0100054a01000503020201030202050301000565010105ff05ff052f
-0100054a01000503020201030202050301000565010105ff05ff052f0100054a01000503
-020201030202050301000565010105ff05ff052f0100054a010005030202010302020503
-01000565010105ff05ff052f0100054a0100050302020103020205030100056101010500
-010205ff05ff052f0100054a0100050302020103020205030100056101010500010205ff
-05ff052f0100054a01000503020201030202050301000561010505ff05ff052f0100054a
-01000503020201030202050301000561010505ff05ff052f0100054a0100050302020103
-020205030100056101020500010105ff05ff052f0100054a010005030202010302020503
-010005ff05ff05970100054a01000503020201030202050301ff01ff0199054a01000503
-020201030202050301000536000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000009040500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000904050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000090405000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000009040500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000904050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000904050000000100050c0100
-050001000500010005000100050001000500010005000100050001000500010005000100
-052a01000503020201030202050301000535000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000903
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050009030100000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500090301000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000903010000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050009030100000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-05000000050009030100000005000100050d010005000100050001000500010005000100
-05000100050001000500010005000100052b010005030202010302020503010005360000
-055e01000901010205000000055c01000901010205000000055c01000901010205000000
-055c01000901010205000000055c01000901010205000000055c01000901010205000000
-0100050c0100050000000500000005000000050000000500000005000000050000000500
-000005000000052a010005030202010302020503010005350000052d0100052f01000500
-090101020000052b0102052d01000500090101020000052b0102052d0100050009010102
-0000052d0100052d01000500090101020000052a0104052c01000500090101020000052c
-0102052c0100050009010102000005000100050d01000500000005000000050000000500
-000005000000050000000500000005000000052b01000503020201030202050301000536
-0000052a01020530010009010102050000000529010005020100052d0100090101020500
-00000529010005020100052d01000901010205000000052b0101052e0100090101020500
-000005290100053101000901010205000000052a01000530010009010102050000000100
-050c010005000000050c010005000000052a010005030202010302020503010005350000
-052d0100052f01000500090101020000052a010005020100052c01000500090101020000
-052e0100052c01000500090101020000052b010005000100052d01000500090101020000
-052a0100053001000500090101020000052a010005300100050009010102000005000100
-050d010005000000050a010005000000052b010005030202010302020503010005360000
-052c01000530010009010102050000000529010005020100052d01000901010205000000
-052d0100052d01000901010205000000052a010005000100052e01000901010205000000
-05290100053101000901010205000000052901000531010009010102050000000100050c
-010005000000050c010005000000052a010005030202010302020503010005350000052d
-0100052f01000500090101020000052d0100052d01000500090101020000052c0101052d
-01000500090101020000052a010005010100052d01000500090101020000052a0103052d
-01000500090101020000052a0103052d0100050009010102000005000100050d01000500
-0000050a010005000000052b010005030202010302020503010005360000052c01000530
-01000901010205000000052b0100052f01000901010205000000052d0100052d01000901
-0102050000000528010005020100052e01000901010205000000052d0100052d01000901
-0102050000000529010005020100052d010009010102050000000100050c010005000000
-050c010005000000052a010005030202010302020503010005350000052d0100052f0100
-0500090101020000052b0100052f01000500090101020000052e0100052c010005000901
-0102000005290105052c01000500090101020000052e0100052c01000500090101020000
-052a010005020100052c0100050009010102000005000100050d010005000000050a0100
-05000000052b010005030202010302020503010005360000052c01000530010009010102
-050000000529010005020100052d010009010102050000000529010005020100052d0100
-0901010205000000052c0100052e010009010102050000000528010005030100052d0100
-09010102050000000529010005020100052d010009010102050000000100050c01000500
-0000050c010005000000052a010005030202010302020503010005350000052b0104052d
-01000500090101020000052a0104052c01000500090101020000052b0102052d01000500
-090101020000052c0102052c01000500090101020000052a0103052d0100050009010102
-0000052b0102052d0100050009010102000005000100050d010005000000050a01000500
-0000052b010005030202010302020503010005360000055e01000901010205000000055c
-01000901010205000000055c01000901010205000000055c01000901010205000000055c
-01000901010205000000055c010009010102050000000100050c010005000000050c0100
-05000000052a010005030202010302020503010005350000055e01000500090101020000
-055c01000500090101020000055c01000500090101020000055c01000500090101020000
-055c01000500090101020000055c0100050009010102000005000100050d010005000000
-050a010005000000052b010005030202010302020503010005360000055e010009010102
-05000000055c01000901010205000000055c01000901010205000000055c010009010102
-05000000055c01000901010205000000055c010009010102050000000100050701000503
-010005000000050c010005000000052a010005030202010302020503010005350000055e
-01000500090101020000055c01000500090101020000055c01000500090101020000055c
-01000500090101020000055c01000500090101020000055c010005000901010200000500
-0100050601010504010005000000050a010005000000052b010005030202010302020503
-010005360000055e01000901010205000000055c01000901010205000000055c01000901
-010205000000055c01000901010205000000055c01000901010205000000055c01000901
-010205000000010005050100050001000503010005000000050001000500010005000100
-0500010005000100050001000500010005000000052a0100050302020103020205030100
-05350000055e01000500090101020000055c01000500090101020000055c010005000901
-01020000055c01000500090101020000055c01000500090101020000055c010005000901
-010200000500010005070100050401000500000005000000050000000500000005000000
-050000000500000005000000052b01000503020201030202050301000536000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010009010102050000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100090101020500000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000901010205000000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010009010102050000000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-090101020500000005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000901010205000000010005070100050301000500
-0000050c010005000000052a010005030202010302020503010005350000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050009000103000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500090001030000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000900010300000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050009000103000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-090001030000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000900010300000500010005070100050401000500
-0000050a010005000000052b01000503020201030202050301000b360063010000630100
-0063010000630100006301000063010000020100050701000503010005000000050c0100
-05000000052a01000503020201030202050301000b350800006301000063010000630100
-00630100006301000063010000020100050701000504010005000000050a010005000000
-052b01000503020201030202050301000b01073208010063010000630100006301000063
-0100006301000063010000020100050501040501010005000000050c010005000000052a
-01000503020201030202050301000b010732080100630100006301000063010000630100
-006301000063010000020100050d010005000000050a010005000000052b010005030202
-01030202050301000b010717010007190801006301000063010000630100006301000063
-01000063010000020100050c010005000000050c010005000000052a0100050302020103
-0202050301000b010715010207190801000f010200030102004901000007010000230100
-000b010200030102001f01000063010000630100006301000063010000020100050d0100
-05000000050a010005000000052b01000503020201030202050301000b01071701000719
-08010011010000050100004901000007010000230100000d010000050100001f01000063
-010000630100006301000063010000020100050c010005000000050c010005000000052a
-01000503020201030202050301000b010717010007190801000801020005010000050100
-000301020042010000070100000001010003010200020100000001010002010000000101
-000301020002010400010100000201000004010000050100001f01000063010000630100
-006301000063010000020100050d010005000000050a010005000000052b010005030202
-01030202050301000b010717010007190801000701000002010000040100000501000002
-010000020100004101000007010100010100000101000002010000010101000101000001
-01010001010000010100000201000003010000030100000201000004010000050100001f
-01000063010000630100006301000063010000020100050c010005000000050c01000500
-0000052a01000503020201030202050301000b0107170100071908010007010000020100
-000401000005010000020100000201000041010000070100000201000001010000020100
-000101000005010000020100000101000007010000030100000201000004010000050100
-001f01000063010000630100006301000063010000020100050d010005000000050a0100
-05000000052b01000503020201030202050301000b010717010007190801000701000002
-010000040100000501000002010400410100000701000002010000010100000201000001
-01000005010000020100000201020004010000030100000201000004010000050100001f
-01000063010000630100006301000063010000020100050c010005000000050001000500
-0100050001000500010005000100050001000500010005000000052a0100050302020103
-0202050301000b0107170100071908010007010000020100000401000005010000020100
-004501000007010000020100000101000002010000010100000501000002010000050100
-0003010000030100000201000004010000050100001f0100006301000063010000630100
-0063010000020100050d0100050001000500010005000100050001000500010005000100
-0500010005000000052b01000503020201030202050301000b0107150104071708010007
-010000020100000401000005010000020100000201000041010000070100000201000001
-010000020100000101000005010000020100000101000002010000030100000301000001
-01010004010000050100001f01000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010732080100080102
-000501000005010000030102004201000007010000020100000201020002010000050100
-00020100000201020005010100020101000001000004010000050100001f010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-00630100006301000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b01073208010063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-0202050301000b0107320801006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01073208010063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0108340063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-01000b00083501ff01ff0161050c01000500030e05000000052a01000503020201030202
-050301000b3600630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000b35080000630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01073208010063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010732
-080100630100006301000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b01071601020718080100630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b01071501000702010007170801001f0100000301020003
-010200340100000f0102005001000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010715010007020100
-071708010026010000050100003401000011010000500100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010715
-010007020100071708010008010100000100000101000002010000010100000001010003
-0102000501000005010000030102002d0100000801020005010000020100000201000002
-010200030102000301020002010000000101002d01000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-071801000718080100070100000101010001010000020100000101010001010000040100
-00050100000501000002010000020100002c010000070100000201000004010000020100
-000201000001010000020100000101000002010000010100000201000001010100010100
-002c01000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107170100071908010007010000020100000101000002
-0100000101000002010000040100000501000005010000060100002c0100000701000008
-01000002010000020100000101000005010000050100000201000001010000020100002c
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b0107160100071a0801000701000002010000010100
-00020100000101000002010000040100000501000005010000030103002c010000080102
-0005010000020100000201000002010200030102000201040001010000020100002c0100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010715010007020100071708010007010000020100000101000002
-010000010100000201000004010000050100000501000002010000020100002c0100000b
-01000004010000020100000201000005010000050100000101000005010000020100002c
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010715010407170801000701000001010100010100
-0001010100010100000201000004010000050100000501000002010000020100002c0100
-000701000002010000040100000201000001010100010100000201000001010000020100
-00010100000201000001010000020100002c010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01073208010008
-010100000100000201010000010000010100000201000004010000050100000501000003
-0103002c0100000801020005010000030101000001000002010200030102000301020002
-010000020100002c01000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b0107320801000b010000560100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107320801000701000002010000560100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01073208010008010200570100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010732080100630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0108340063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-0b00083501ff01ff0161050d0100030e0000052b01000503020201030202050301000b36
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a01000503020201030202050301000b350800006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-00630100006301000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b01071601020718080100630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b010715010007020100071708010063010000070100005a0100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b0107190100071708010063010000070100005a0100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-0202050301000b0107190100071708010008010200020100000001010002010000000101
-000301020042010000070100000001010002010000000101000301020002010100000100
-000201010000010000030102003401000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107170101071808010007
-010000020100000101010001010000010101000101000001010000020100004101000007
-010100010100000101010001010000010100000201000001010000000100000001000001
-010000000100000001000001010000020100003301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-0719010007170801000b0100000101000002010000010100000201000005010000410100
-000701000002010000010100000501000002010000010100000001000000010000010100
-000001000000010000050100003301000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107190100071708010008
-010300010100000201000001010000020100000201030041010000070100000201000001
-010000050100000201000001010000000100000001000001010000000100000001000002
-0103003301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107150100070201000717080100070100
-000201000001010000020100000101000002010000010100000201000041010000070100
-000201000001010000050100000201000001010000000100000001000001010000000100
-000001000001010000020100003301000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107160102071808010007
-010000020100000101000002010000010100000201000001010000020100004101000007
-010100010100000101000005010000020100000101000000010000000100000101000000
-010000000100000101000002010000330100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-000801030001010000020100000101000002010000020103004101000007010000000101
-000201000006010200020100000001000000010000010100000001000000010000020103
-003301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107320801006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b010732080100630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107320801006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010732080100630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010834006301000063
-01000063010000630100006301000063010000020100050d0100030e0000052b01000503
-020201030202050301000b00083501ff01ff0161050c01000500030e05000000052a0100
-0503020201030202050301000b3600630100006301000063010000630100006301000063
-010000020100050d0100030e0000052b01000503020201030202050301000b3508000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107320801006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107180100
-0718080100630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b010717010107180801001001000006
-010000490100000e0100001c0100000b010200030102001f010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b010716010007000100071808010010010000510100000e0100001c0100000d0100
-00050100001f01000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b01071601000700010007180801000801020002
-010400020102000201000000010100030102003b01000008010200020100000101000003
-01020002010000000101000301020002010400010100000201000004010000050100001f
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010715010007010100071808010007010000020100
-000301000006010000020101000101000001010000020100003a01000007010000020100
-000101000000010000030100000201000001010100010100000101000002010000030100
-00030100000201000004010000050100001f010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01071401000702
-010007180801000701000007010000060100000201000002010000050100003a01000007
-010000050101000801000001010000020100000101000007010000030100000201000004
-010000050100001f01000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b01071401050717080100080102
-0004010000060100000201000002010000020103003a0100000801020002010100050103
-0001010000020100000201020004010000030100000201000004010000050100001f0100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010718010007180801000b01000003010000060100000201000002
-01000001010000020100003a0100000b0100000101000000010000030100000201000001
-010000020100000501000003010000030100000201000004010000050100001f01000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01071701020717080100070100000201000003010000060100
-00020100000201000001010000020100003a010000070100000201000001010000010100
-000201000002010000010100000201000001010000020100000301000003010000010101
-0004010000050100001f01000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b010732080100080102000501010004
-0100000201000002010000020103003a0100000801020002010000020100000201030001
-010000020100000201020005010100020101000001000004010000050100001f01000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01073208010063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010732
-080100630100006301000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b01073208010063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010732080100630100006301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-0732080100630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b010834006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-01030202050301000b00083501ff01ff0161050d0100030e0000052b0100050302020103
-0202050301000b3600630100006301000063010000630100006301000063010000020100
-050c01000500030e05000000052a01000503020201030202050301000b35080000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107320801006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b010732080100630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107150104071708010063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107150100071b080100070100000e0100
-0014010000340100002b0102003401000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107150100071b08010007
-0100000e0100004a0100002d010000340100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107150100
-071b08010007010000010100000301020002010400020102000201000000010100030102
-000201000000010100030102002601000007010000020100000101000000010100020100
-0000010100030102000301020005010000030102002d0100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010715
-010307180801000701000000010000030100000201000003010000030100000201000001
-010100010100000401000002010100010100000101000002010000250100000701000002
-010000010101000101000001010100010100000101000002010000010100000201000004
-01000002010000020100002c01000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010719010007170801
-000701010008010000030100000701000001010000080100000201000002010000050100
-002501000007010000020100000101000002010000010100000201000001010000090100
-0004010000060100002c01000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b010719010007170801000701010005
-010300030100000401030001010000080100000201000002010000020103002501000007
-010000020100000101000002010000010100000201000002010200030103000401000003
-0103002c01000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107140100070301000717080100070100
-000001000003010000020100000301000003010000020100000101000008010000020100
-000201000001010000020100002501000007010000020100000101000002010000010100
-00020100000501000001010000020100000401000002010000020100002c010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01071501030718080100070100000101000002010000020100000301000003
-010000020100000101000008010000020100000201000001010000020100002501000007
-010000010101000101010001010000010101000101000001010000020100000101000002
-0100000401000002010000020100002c0100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-000701000002010000020103000401010002010300010100000801000002010000020100
-000201030025010000080101000001000001010000000101000201000000010100030102
-000301030004010000030103002c01000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b010732080100630100000e
-010000050100004c01000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b010732080100630100000e0100
-00050100004c01000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b010732080100630100000e010000050100004c
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010732080100630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010834006301000063
-01000063010000630100006301000063010000020100050d0100030e0000052b01000503
-020201030202050301000b00083501ff01ff0161050c01000500030e05000000052a0100
-0503020201030202050301000b3600630100006301000063010000630100006301000063
-010000020100050d0100030e0000052b01000503020201030202050301000b3508000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107320801006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107170102
-0717080100630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b0107160100071a0801000a0100001a
-01010004010000340100000f0102000c010000020100003e010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b0107150100071b080100250100003c01000011010000100100003e010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b0107150100071b080100080102000301020003010200030102000401000004
-010200020100000001010003010200260100000801020005010000020100000201000002
-01020002010000010100003b01000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010715010307180801
-000a01000002010000020100000101000002010000010100000201000001010400040100
-000201010001010000010100000201000025010000070100000201000004010000020100
-00020100000401000002010000000100003c010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01071501000702
-010007170801000a01000002010000020100000101000005010000020100000301000006
-01000002010000020100000101000002010000250100000b010000040100000201000002
-01000004010000020101003d01000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010715010007020100
-07170801000a010000020100000201000002010200020104000301000006010000020100
-000201000001010400250100000801030004010000030100000001000005010000020101
-003d01000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b01071501000702010007170801000a0100000201000002
-010000050100000101000007010000060100000201000002010000010100002901000007
-010000020100000401000003010000000100000501000002010000000100003c01000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b010716010207180801000a0100000201000002010000010100
-000201000001010000020100000301000006010000020100000201000001010000020100
-0025010000070100000201000004010000040100000601000002010000010100003b0100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b0107320801000a0100000301020003010200030102000401000006
-010000020100000201000002010200260100000801030004010000040100000601000002
-010000020100003a01000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b0107320801000a010000570100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107320801000701000001010000570100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01073208010008010100580100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010732080100630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0108340063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-0b00083501ff01ff0161050d0100030e0000052b01000503020201030202050301000b36
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a01000503020201030202050301000b350800006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-00630100006301000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b01071501040717080100630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01071501000702010007170801000a010100130100000b0100
-000201000030010000250100000b01020003010200260100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010718
-0100071808010009010000150100000f01000030010000250100000d0100000501000026
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010718010007180801000901000003010000000101
-0003010200030101000001000001010000000101000301020002010000010100002d0100
-000701000000010100030102000201000000010100020100000001010002010400010100
-000201000004010000050100002601000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107180100071808010007
-010400010101000101000001010000020100000101000001010100010101000101000004
-01000002010000000100002e010000070101000101000001010000020100000101010001
-010000010101000101000003010000030100000201000004010000050100002601000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01071801000718080100090100000301000005010000020100
-0001010000020100000101000008010000020101002f0100000701000002010000010100
-000201000001010000050100000701000003010000020100000401000005010000260100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010717010007190801000901000003010000050104000101000002
-0100000101000008010000020101002f0100000701000002010000010100000201000001
-010000050100000701000003010000020100000401000005010000260100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-0202050301000b0107170100071908010009010000030100000501000005010000020100
-00010100000801000002010000000100002e010000070100000201000001010000020100
-000101000005010000070100000301000002010000040100000501000026010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01071701000719080100090100000301000005010000020100000101000001
-010100010100000801000002010000010100002d01000007010000020100000101000002
-010000010100000501000007010000030100000101010004010000050100002601000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01073208010009010000030100000601020003010100000100
-00010100000801000002010000020100002c010000070100000201000002010200020100
-000501000008010100020101000001000004010000050100002601000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010732080100630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107320801006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b010732080100630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107320801006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010834006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000b00
-083501ff01ff0161050c01000500030e05000000052a0100050302020103020205030100
-0b3600630100006301000063010000630100006301000063010000020100050d0100030e
-0000052b01000503020201030202050301000b3508000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-0202050301000b0107320801006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01073208010063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107160102071808010063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010715010007020100071708010063010000070100000f0100000b
-01000006010000100100002201000063010000630100006301000063010000020100050c
-01000500030e05000000052a01000503020201030202050301000b010715010007020100
-071708010063010000070100001c01000018010000220100006301000063010000630100
-0063010000020100050d0100030e0000052b01000503020201030202050301000b010715
-010007020100071708010007010000000101000301020002010000000101004901000007
-010000010100000201000000010100030102000301020002010400020102000201000000
-010100030102000201000000010100030102000201000000010100030101000001000009
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010716010207180801000701010001010000010100
-000201000001010100010100004801000007010000000100000301010001010000040100
-000201000002010000030100000601000002010100010100000101000002010000010101
-000101000001010000020100000101010001010000010100000101010009010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01071501000702010007170801000701000002010000010100000201000001
-0100004c0100000701010004010000080100000201000007010000060100000201000002
-010000010100000201000001010000020100000101000002010000010100000501000002
-0100000901000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107150100070201000717080100070100
-000201000001010400010100004c01000007010100040100000801000003010200040100
-000601000002010000020100000101040001010000020100000101040001010000050100
-00020100000901000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000b01071501000702010007170801000701000002
-01000001010000050100004c010000070100000001000003010000080100000601000003
-010000060100000201000002010000010100000501000002010000010100000501000005
-010000020100000901000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000b01071601020718080100070101
-00010100000101000002010000010100004c010000070100000101000002010000080100
-000201000002010000030100000601000002010000020100000101000002010000010101
-000101000001010000020100000101000005010000010101000901000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b010732080100070100000001010003010200020100004c010000070100000201000001
-010000080100000301020005010100040100000201000002010000020102000201000000
-010100030102000201000006010100000100000901000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-0732080100070100005a0100005801000009010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01073208010007
-0100005a0100005401000002010000090100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-00070100005a010000550102000a01000063010000630100006301000063010000020100
-050d0100030e0000052b01000503020201030202050301000b0107320801006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b010732080100630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b01083400630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a01000503020201030202050301000b00083501ff01ff0161050d
-0100030e0000052b01000503020201030202050301000b36006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-01030202050301000b350800006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000b01073208010063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a01000503020201030202050301000b0107320801006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01071601020718080100630100006301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-071501000702010007170801001f01000042010000120100001701020034010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01071501000702010007170801006301000012010000190100003401000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01071501000702010007170801000701010000010000030102
-00020100000001010003010200030102003b010000080102000301010000010000020102
-000201000000010100020100000001010005010000030102000201000000010100260100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-01030202050301000b010715010007020100071708010007010000000100000001000001
-0100000201000001010100010100000401000002010000020100003a0100000701000002
-010000010100000101010001010000020100000101010001010000010101000101000004
-010000020100000201000001010100010100002501000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-071601030717080100070100000001000000010000050100000101000008010000060100
-003a01000007010000020100000101000002010000010100000201000001010000020100
-000101000002010000040100000601000001010000020100002501000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-0b0107190100071708010007010000000100000001000002010300010100000801000003
-0103003a0100000701000002010000010100000201000001010400010100000201000001
-010000020100000401000003010300010100000201000025010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-01000b010718010007180801000701000000010000000100000101000002010000010100
-000801000002010000020100003a01000007010000020100000101000002010000010100
-000501000002010000010100000201000004010000020100000201000001010000020100
-002501000063010000630100006301000063010000020100050d0100030e0000052b0100
-0503020201030202050301000b0107150102071908010007010000000100000001000001
-01000002010000010100000801000002010000020100003a010000070100000201000001
-010000010101000101000002010000010100000201000001010100010100000401000002
-010000020100000101000002010000250100006301000063010000630100006301000002
-0100050c01000500030e05000000052a01000503020201030202050301000b0107320801
-00070100000001000000010000020103000101000008010000030103003a010000080102
-000301010000010000020102000201000002010000010100000001010005010000030103
-0001010000020100002501000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b01073208010063010000230100003e
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-01000503020201030202050301000b01073208010063010000230100003e010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000b01073208010063010000230100003e01000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000b01
-0732080100630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b01000503020201030202050301000b010732080100630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000b01083400630100006301000063010000630100006301000063
-010000020100050d0100030e0000052b01000503020201030202050301000b00083501ff
-01ff0161050c01000500030e05000000052a010005030202010302020503010005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050001000063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-050000000532010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050c01000500030e05000000
-052a01000503020201030202050301000500000005130100050401020515010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000512010205030100050201000515010000630100
-006301000063010000630100006301000063010000020100050c01000500030e05000000
-052a01000503020201030202050301000500000005130100050301000502010005140100
-050000630100006301000063010000630100006301000063010000020100050d0100030e
-0000052b0100050302020103020205030100000005140100050301000502010005150100
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a010005030202010302020503010005000000051301000503010005020100
-05140100050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000051401000503010005020100
-0515010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000513010005030100
-050201000514010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000514010005030100
-050201000515010000630100006301000063010000630100006301000063010000020100
-050c01000500030e05000000052a01000503020201030202050301000500000005110104
-050201020515010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050c01000500030e05000000
-052a01000503020201030202050301000500000005320100050000630100006301000063
-010000630100006301000063010000020100050d0100030e0000052b0100050302020103
-020205030100000005340100006301000063010000630100006301000063010000630100
-00020100050c01000500030e05000000052a010005030202010302020503010005000000
-05320100050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000053401000063010000630100
-0063010000630100006301000063010000020100050c01000500030e05000000052a0100
-050302020103020205030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001ff01ff0161050d0100
-030e0000052b010005030202010302020503010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500010000630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a0100050302020103020205030100000005340100006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000500000005130100050501000516010005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005120102050301020517010000630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-050000000513010005050100051601000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000514010005050100051701000063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b010005030202010302020503010005000000
-051301000505010005160100050000630100006301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000000
-051401000505010005170100006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000500000005130100
-050501000516010005000063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a0100050302020103020205030100000005140100
-050501000517010000630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b0100050302020103020205030100050000000511010405010104
-05140100050000630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005340100006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000000053401000063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010000630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b010005030202010302020503010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001ff01ff0161050c01000500030e
-05000000052a010005030202010302020503010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000534010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005130100050401020515010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000512010205030100050201000515010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005130100050301000502010005140100050000630100006301000063
-010000630100006301000063010000020100050d0100030e0000052b0100050302020103
-020205030100000005140100050301000502010005150100006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-010302020503010005000000051301000506010005150100050000630100006301000063
-010000630100006301000063010000020100050d0100030e0000052b0100050302020103
-020205030100000005140100050501000517010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005130100050401000517010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000514010005030100050201000515010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005110104050101040514010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000534010000630100006301000063010000630100006301000063010000020100
-050c01000500030e05000000052a01000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100050d0100030e
-0000052b0100050302020103020205030100000005340100006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-0534010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001ff01ff0161050d0100030e0000052b010005030202010302020503010005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a0100050302020103020205030100000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500010000630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-050000000532010005000063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a0100050302020103020205030100000005340100
-00630100006301000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000500000005130100050401020515010005000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a0100050302020103020205030100000005120102050301000502010005150100
-00630100006301000063010000630100006301000063010000020100050d0100030e0000
-052b01000503020201030202050301000500000005130100050701000514010005000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a0100050302020103020205030100000005140100050701000515010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000513010005050101051501000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000514010005070100051501000063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-010302020503010005000000051301000507010005140100050000630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000000051401000503010005020100051501000063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-010302020503010005000000051101040502010205150100050000630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000000053401000063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b010005030202010302020503010005000000
-05320100050000630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005340100006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001ff01ff0161050c01000500030e05000000052a01000503020201030202
-050301000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-05000000050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000100006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-0534010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000513010005060100
-05150100050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000051201020505010105160100
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a010005030202010302020503010005000000051301000504010005000100
-05150100050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000051401000504010005000100
-0516010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000513010005030100
-050101000515010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000514010005020100
-050201000516010000630100006301000063010000630100006301000063010000020100
-050c01000500030e05000000052a01000503020201030202050301000500000005130100
-050201050514010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000514010005060100
-0516010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000511010405030102
-05140100050000630100006301000063010000630100006301000063010000020100050d
-0100030e0000052b01000503020201030202050301000000053401000063010000630100
-0063010000630100006301000063010000020100050c01000500030e05000000052a0100
-050302020103020205030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000534010000630100006301000063010000630100006301000063010000020100
-050c01000500030e05000000052a01000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100050d0100030e
-0000052b0100050302020103020205030100000005340100006301000063010000630100
-00630100006301000063010000020100050c01000500030e05000000052a010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a010005030202010302020503010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001ff01ff0161050d0100030e0000
-052b01000503020201030202050301000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500010000630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b010005030202010302020503010005000000053201000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000534010000630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-050000000513010005030104051401000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000512010205030100051901000063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b010005030202010302020503010005000000
-051301000503010005180100050000630100006301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000000
-051401000503010005190100006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000500000005130100
-050301030515010005000063010000630100006301000063010000630100006301000002
-0100050c01000500030e05000000052a0100050302020103020205030100000005140100
-050701000515010000630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b0100050302020103020205030100050000000513010005070100
-05140100050000630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a010005030202010302020503010000000514010005020100
-050301000515010000630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b0100050302020103020205030100050000000511010405010103
-05150100050000630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005340100006301000063010000630100006301000063010000630100
-00020100050d0100030e0000052b01000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100050c01000500
-030e05000000052a01000503020201030202050301000000053401000063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010000630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b010005030202010302020503010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001ff01ff0161050c01000500030e
-05000000052a010005030202010302020503010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000534010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005130100050501020514010005000063010000630100006301000063
-0100006301000063010000020100050d0100030e0000052b010005030202010302020503
-010000000512010205040100051801000063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-050000000513010005030100051801000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-051401000503010005190100006301000063010000630100006301000063010000630100
-00020100050c01000500030e05000000052a010005030202010302020503010005000000
-051301000503010305150100050000630100006301000063010000630100006301000063
-010000020100050d0100030e0000052b0100050302020103020205030100000005140100
-050301000502010005150100006301000063010000630100006301000063010000630100
-00020100050c01000500030e05000000052a010005030202010302020503010005000000
-051301000503010005020100051401000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-051401000503010005020100051501000063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-050000000511010405020102051501000500006301000063010000630100006301000063
-01000063010000020100050d0100030e0000052b01000503020201030202050301000000
-0534010000630100006301000063010000630100006301000063010000020100050c0100
-0500030e05000000052a0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000534010000630100006301000063010000630100
-006301000063010000020100050c01000500030e05000000052a01000503020201030202
-050301000500000005320100050000630100006301000063010000630100006301000063
-010000020100050d0100030e0000052b0100050302020103020205030100000005340100
-00630100006301000063010000630100006301000063010000020100050c01000500030e
-05000000052a010005030202010302020503010005000000053201000500006301000063
-01000063010000630100006301000063010000020100050d0100030e0000052b01000503
-020201030202050301000000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100006301000063010000630100006301000063010000630100
-00020100050c01000500030e05000000052a010005030202010302020503010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000500010005000100050001ff
-01ff0161050d0100030e0000052b01000503020201030202050301000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050001000063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b010005030202010302020503010005000000
-05320100050000630100006301000063010000630100006301000063010000020100050c
-01000500030e05000000052a010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000513010005030104051401000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000512010205030100050201000515010000630100
-006301000063010000630100006301000063010000020100050d0100030e0000052b0100
-050302020103020205030100050000000513010005060100051501000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000514010005060100051601000063010000630100
-0063010000630100006301000063010000020100050d0100030e0000052b010005030202
-010302020503010005000000051301000506010005150100050000630100006301000063
-010000630100006301000063010000020100050c01000500030e05000000052a01000503
-020201030202050301000000051401000506010005160100006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000500000005130100050501000516010005000063010000630100006301000063
-0100006301000063010000020100050c01000500030e05000000052a0100050302020103
-020205030100000005140100050501000517010000630100006301000063010000630100
-006301000063010000020100050d0100030e0000052b0100050302020103020205030100
-050000000511010405030100051601000500006301000063010000630100006301000063
-01000063010000020100050c01000500030e05000000052a010005030202010302020503
-010000000534010000630100006301000063010000630100006301000063010000020100
-050d0100030e0000052b0100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100050c01000500030e0500
-0000052a0100050302020103020205030100000005340100006301000063010000630100
-00630100006301000063010000020100050d0100030e0000052b01000503020201030202
-050301000500000005320100050000630100006301000063010000630100006301000063
-010000020100050c01000500030e05000000052a01000503020201030202050301000000
-0534010000630100006301000063010000630100006301000063010000020100050d0100
-030e0000052b010005030202010302020503010005000000053201000500006301000063
-01000063010000630100006301000063010000020100050c01000500030e05000000052a
-010005030202010302020503010000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000063010000630100006301000063010000630100
-0063010000020100050d0100030e0000052b010005030202010302020503010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000500010005000100050001ff
-01ff0161050c01000500030e05000000052a010005030202010302020503010005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050001000063010000630100006301000063010000630100
-0063010000020100050c01000500030e05000000052a0100050302020103020205030100
-050000000532010005000063010000630100006301000063010000630100006301000002
-0100050d0100030e0000052b010005030202010302020503010000000534010000630100
-006301000063010000630100006301000063010000020100050c01000500030e05000000
-052a01000503020201030202050301000500000005130100050401020515010005000063
-0100006301000063010000630100006301000063010000020100050d0100030e0000052b
-010005030202010302020503010000000512010205030100050201000515010000630100
-006301000063010000630100006301000063010000020100050c01000500000005000000
-05000000050000000500000005000000050000000500000005000000052a010005030202
-01030202050301ff01ff0199050d00000500000005000000050000000500000005000000
-050000000500000005000000052b010005030202010302020503010005ff05ff05e30100
-05030202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff
-05e3010005030202010302020503010005ff05ff05e30100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-0503010005ff05ff05e3010005030202010302020503010005ff05ff05e3010005030202
-01030202050301000549010005ff05ff0598010005030202010302020503010005480101
-05ff05ff05980100050302020103020205030100054701000500010005ff05ff05980100
-0503020201030202050301000549010005ff05ff05980100050302020103020205030100
-0549010005ff05ff059801000503020201030202050301000549010005ff05ff05980100
-0503020201030202050301000549010005ff05ff05980100050302020103020205030100
-0549010005ff05ff059801000503020201030202050301000547010405ff05ff05960100
-05030202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff
-05e3010005030202010302020503010005ff05ff05e30100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-050301000538010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000500010005000100054b0100
-050302020103020205030100053701000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000000054a0100050302020103020205030100053801000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000003ff03ff033e0000054b01000503020201030202
-050301000537010005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000500000005000000050003ff
-03ff033e05000000054a01000503020201030202050301000538010005000000050c0000
-050c010003ff03ff033e0000054b01000503020201030202050301000537010005000000
-050c0100050c0100050003ff03ff033e05000000054a0100050302020103020205030100
-0538010005000000050c0000050c010003ff03ff033e0000054b01000503020201030202
-050301000537010005000000050c0100050c0100050003ff03ff033e05000000054a0100
-0503020201030202050301000538010005000000050c0000050c010003ff03ff033e0000
-054b01000503020201030202050301000537010005000000050c0100050c0100050003ff
-03ff033e05000000054a01000503020201030202050301000538010005000000050c0000
-050c010003ff03ff033e0000054b01000503020201030202050301000537010005000000
-050c0100050c0100050003ff03ff033e05000000054a0100050302020103020205030100
-0538010005000000050c0000050c010003ff03ff033e0000054b01000503020201030202
-050301000537010005000000050c0100050c0100050003ff03ff033e05000000054a0100
-0503020201030202050301000538010005000000050c0000050c010003ff03ff033e0000
-054b01000503020201030202050301000537010005000000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050003ff03ff033e05000000054a0100050302020103020205030100
-053801000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000500010003ff03ff033e0000
-054b01000503020201030202050301000537010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000054a01000503020201030202050301000538000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000054b0100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-0503010005ff05ff05e3010005030202010302020503010005ff05ff05e3010005030202
-010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e30100
-05030202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff
-05e3010005030202010302020503010005ff05ff05e30100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-0503010005ff05ff05e3010005030202010302020503010005ff05ff05e3010005030202
-010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e30100
-05030202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff
-05e3010005030202010302020503010005ff05ff05e30100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-0503010005ff05ff05e3010005030202010302020503010005ff05ff05e3010005030202
-010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e30100
-05030202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff
-05e3010005030202010302020503010005ff05ff05e30100050302020103020205030100
-05ff05ff05e3010005030202010302020503010005ff05ff05e301000503020201030202
-0503010005ff05ff05e3010005030202010302020503010005ff05ff05e3010005030202
-010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e30100
-05030202010100040503010005ff05ff05e301000503000502020400050301ff01ff01e5
-050300000202040000000202040005ff05ff05ed00000202040000000202040005ff05ff
-05ed00000202040000000202040005ff05ff05ed00000202040000000202040005ff05ff
-05ed000002020400000002020400000502ff02ff02e100060202040000000208040002ff
-02ff02e100000208040000000208040002ff02ff02e100000208040000000208040001ff
-01ff01e10000020804000000040901ff01ff01e100000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 380 315
-%%EOF
diff --git a/lib/tv/doc/src/tv_table_browser_updated.gif b/lib/tv/doc/src/tv_table_browser_updated.gif
deleted file mode 100644
index 547497487d..0000000000
--- a/lib/tv/doc/src/tv_table_browser_updated.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_table_browser_updated.ps b/lib/tv/doc/src/tv_table_browser_updated.ps
deleted file mode 100644
index 0a944565e8..0000000000
--- a/lib/tv/doc/src/tv_table_browser_updated.ps
+++ /dev/null
@@ -1,2124 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_table_browser_updated.eps)
-%%CreationDate: (Mon Mar 19 17:15:32 2001)
-%%BoundingBox: 0 0 380 315
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 380 315
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-380.000000 315.000000
-12
-760 630
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-d9d9d9
-b22222
-00ff00
-ff0000
-990000
-7f7f7f
-999999
-ff7f7f
-009900
-7fff7f
-000000
-000a01ff01ff01e1000b0208040001ff01ff01e100000208040000000208040002ff02ff
-02e1000002080400000002080400020000ff00ff00de0400020000000208040000000202
-04060200000004ff04ff04de020000000405020204000000020204000209000d02ff02ff
-02d500000202040000000202040002080000020d04000289010302110103023201020258
-0102020c010102010101021e010102290101020601010208010102310101022a01010230
-0101029600000202040000000202040002080000020d0400028901010202010702000101
-0203010102010101020e01050200010702010103020d0101020401010204010302030103
-020e010302060103020301030203010302060103020b0101020a01010202010102190100
-02030101021c0100020b01010206010102090101021b010202020100020d0101022a0101
-020c0104021e0101029600000202040000000202040002080000020d0400028901010205
-0101020301010203010102010101020e0101020701010203010102010101020c01010202
-010302030101020101010201010102010101020801010201010102010101020401010201
-01010201010102010101020101010201010102040101020101010201010102060101020a
-0101020201010218010102210101020b01010206010102090101021b010202020100020d
-01010238010102020101021d010102960000020204000000020204000208000002020406
-020304000289010102050101020301010203010102010101020e01010207010102030101
-020501010209010102030101020701010201010102010101020601020202010102010101
-020801010201010102010101020101010201010102040101020101010202010202030101
-020a01010203010102020103020301030202010302010104020101010202010302030101
-02000101020a0104020101030203010102000101020301010202010302030101021a0100
-020001010201010002020103020301040202010302020101020901010200010102010101
-020301030203010102020101020001010202010102010103020201010200010102010101
-020301030202010102000101020101010202010302020101020201010285000002020400
-000004030208000002020400030400000203040002890101020501010204010102020100
-02020101020e0101020701010203010202040101020a0100020301010207010102010101
-020101010205010102040101020101010208010102010101020101010201010102010101
-02040101020101010204010102020100020b010102030101020101010201010102010101
-020101010200010102010101020101010203010102010101020101010202010202000101
-020a01010202010102010101020201020200010102020101020101010201010102020101
-021a01000200010102010100020101010201010102010101020101010201010102010101
-020101010209010202000102020001010201010102010101020201010202010202000101
-020101010200010102000101020201020200010202000101020101010201010102010101
-0200010102010101020101010201010102010101020201010285000004030101020b0000
-0203040003020000020404000289010102050101020401010201010102020101020e0104
-0204010102040103020d0101020401010205010202020101020101010204010102050101
-020101010207010102020101020101010202010402040101020101010205010102020101
-020901010203010102010101020101010201010102080101020101010203010102010101
-020101010202010102010101020a01010206010102020101020101010202010102010101
-0201010102020101021a0100020001020200010002010101020101010201010102010101
-0201010102010101020d0101020101010201010102050101020201010202010102010101
-020101010200010102000101020201010201010102010101020501010201010202030101
-0201010102010101020101010202010002890103020b0000020304000302000002040400
-0289010102050101020501010200010002030101020e01010207010102060102020e0100
-020301010207010102010101020101010205010102040101020101010206010102030101
-020101010205010102040101020101010204010102020100020b01010203010102010101
-020101010201010102050104020101010203010102010101020101010202010102010101
-020a0101020301040202010102010101020201010201010502020101021a010002010101
-020001000201010102010101020101010201010102010105020d01010201010102010101
-020201040202010102020101020101010201010102000101020001010202010102010101
-0201010102020104020101010204010102010105020201010200010102890103020b0000
-02040400030000000205040002890101020501010205010302030101020e010102070101
-02070101020d010102030101020701010201010102010101020601020202010102010101
-0205010102040101020101010205010102040101020101010202010202030101020a0101
-020301010201010102010101020101010204010102010101020101010203010102010101
-020101010202010102010101020a01010202010102010101020201010201010102020101
-0201010102060101021a0100020201020201010102010101020101010201010102010101
-021101010201010102010101020101010201010102020101020201010201010102010101
-020101010200010102010101020101010201010102010101020101010201010102040101
-020101010206010102000100028a0103020b000002040400030000000205040002890101
-020501010206010102040101020e01010207010102030101020101010201010102080101
-020401010203010102010101020101010201010102010101020401010201010102010101
-020101010200010502010101020101010201010102010101020101010200010102010101
-0201010102060101020a0101020201010201010102010101020101010202010002000101
-02010101020101010203010102010101020101010202010102010101020a010102020101
-02010101020201010201010102020101020101010202010002010101021b010002020102
-020101010201010102010101020001020201010102020100020101010209010102010101
-020101010201010102010101020201010202010102010101020201010207010102010101
-0201010102010101020101010201010102040101020101010202010002030102028a0103
-020b0000020500000206040002890101020501010206010102040101020e010502030101
-020401030202010102080101020401010204010302030103020201010209010302020101
-0200010502020103020301030202010102010103020b0101020a01010202010102020103
-0203010302020102020001010201010202010101020201030203010102010101020b0102
-020101020200010102010104020301010202010302020101021b01000203010102020103
-020301010200010102020103020201010209010102010101020101010202010202000101
-020101010202010102010101020301050202010102010101020101010202010202000101
-02000101020401010202010302040101028b0103020b0000020d04000289010302110103
-0232010202190100023d0102020c01010237010602230101029e0101028c0103020b0000
-020d040002f2010002ff02540101028c0103020b0000020d040002ff02ff02d70103020c
-040d02ff02ff02d8010302ff02ff02f3010302ff02ff02f30103020200ff00ff00ec0400
-020201030202000004ff04ff04ec0202010302ff02ff02f3010302020500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000202010302020000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000202010302020500000005ff05ff05ea01000202010302020000
-05ff05ff05ea010005000202010302020500000005ff05ff05ea01000202010302020000
-05ff05ff05ea010005000202010302020500000005ff05ff05ea01000202010302020000
-050c06040504060005030602051f06040505060005040600050406000519060005020600
-0504060005270602050b06000506060005ff05ff05080600050206000509060205130100
-050002020103020205000000050b0600050f0600051f060005090600050a060005190600
-05020600052c060005020600050a060005ff05ff0510060005020600050b060005140100
-0202010302020000050c0600050606020505060005030602051806000506060105000600
-050206020502060405170600050206000502060205030602050206000502060005170600
-050206000501060005000601050206040502060205030602050206000500060105030602
-05ff05f306000502060005020602050506000502060005000601050c0100050002020103
-020205000000050b06000508060005050600050206000502060005170600050506000501
-06010504060005040600051a060005000600050506000502060005020600050106000502
-060005170600050206000501060105010600050306000506060005020600050206000501
-060105010600050106000502060005ff05f2060005020600050106000502060005040600
-0502060105010600050c01000202010302020000050c0603050506000505060005020600
-050206000517060305020600050206000504060005040600051a06000500060005050600
-050206000502060005010600050006000500060005170600050206000501060005020600
-0503060005060600050206000502060005010600050206000501060005ff05f606040501
-060005020600050406000502060005020600050b0100050002020103020205000000050b
-06000508060005050600050206040517060005050600050206000504060005040600051a
-060005000600050506000502060405010600050006000500060005170600050206000501
-0600050206000503060005060600050206000502060005010600050206000502060205ff
-05f306000502060005010604050406000502060005020600050c01000202010302020000
-050c0600050806000505060005020600051b060005050600050206000504060005040600
-051b06000506060005020600050506000500060005000600051706000502060005010600
-050206000503060005060600050206000502060005010600050206000505060005ff05f2
-06000502060005010600050806000502060005020600050b010005000202010302020500
-0000050b0600050806000505060005020600050206000517060005050600050106010504
-060005040600051b06000506060005020600050206000501060005000600050006000517
-060005020600050106010501060005030600050606000502060005020600050106000502
-0600050106000502060005ff05f206000502060005010600050206000504060005020601
-05010600050c01000202010302020000050c060005080600050506000503060205180604
-050206010500060005040600050506010519060005060600050306020503060005000600
-051906020502060005000601050506010504060005030602050206000502060005020602
-05ff05f306000502060005020602050506000502060005000601050c0100050002020103
-02020500000005a8060005ff05ff052e0600051001000202010302020000050b0606052a
-0606052a0606052a06060500060005ff05ff05180606050e0600050f0100050002020103
-020205000000050a0606052a0606052a0606052a06060500060005ff05ff05180606050e
-060005100100020201030202000005ff05ff05ea010005000202010302020500000005ff
-05ff05ea0100020201030202000005ff05ff05ea01000500020201030202050000000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100020201030202000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050002020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-020201030202053600000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000051a00000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050100000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050100000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000051a00000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000051a00000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000051a00000500000005000000050000000500000005000000050000000500
-00000500000005000000050000000500000005ff05a50202010302020535000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500010005180000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000100000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-010000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050001000518000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500010005180000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000100051800000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000500010005ff05a402020103
-02020536000005140100051a00000514010005010000051401000501000005140100051a
-000005140100051a000005140100051a00000514010005ff05a502020103020205350000
-051601000518000005160100000005160100000005160100051800000516010005180000
-05160100051800000516010005ff05a40202010302020536000005140100051a00000514
-010005010000051401000501000005140100051a000005140100051a000005140100051a
-00000514010005ff05a50202010302020535000005050602050306020506010005180000
-051601000000051601000000051601000518000005160100051800000516010005180000
-0516010005ff05a402020103020205360000050406020503060205050100051a00000514
-010005010000051401000501000005140100051a00000506060405080100051a00000508
-060105090100051a0000050806030507010005ff05a50202010302020535000005040604
-050106040505010005180000051006000504010000000510060005040100000005040600
-051001000518000005050608050701000518000005080603050901000518000005070607
-0506010005ff05a402020103020205360000050306000501060105010600050106010504
-0100051a0000050f06000503010005010000050f0600050301000501000005030600050f
-0100051a00000503060a05050100051a00000507060305080100051a0000050506030501
-06030504010005ff05a5020201030202053500000503060d0504010005180000050d0600
-0501060005040100000005040600050a06000504010000000504060005010600050d0100
-051800000504060305020603050601000518000005090601050a01000518000005060602
-050306020505010005ff05a4020201030202053600000501060005000603050006020500
-060405020100051a0000050c060005010600050301000501000005030600050a06000503
-0100050100000503060005010600050c0100051a0000050206030504060305040100051a
-000005140100051a000005050602050306020504010005ff05a502020103020205350000
-050206000500060305000602050006040503010005180000050a06000501060005010600
-050401000000050406000504060005040600050401000000050406000501060005010600
-050a01000518000005030602050306070503010005180000050706040509010005180000
-05070601050206020506010005ff05a40202010302020536000005010600050006030500
-06020500060405020100051a000005090600050106000501060005030100050100000503
-06000504060005040600050301000501000005030600050106000501060005090100051a
-0000050206020504060505030100051a00000507060305080100051a0000050a06020506
-010005ff05a5020201030202053500000502060005000603050006020500060405030100
-051800000507060005010600050106000501060005040100000005040600050406000501
-060005010600050401000000050406000501060005010600050106000507010005180000
-05030602050506030505010005180000050906020509010005180000050a060205080100
-05ff05a40202010302020536000005010600050006070500060405020100051a00000506
-060005010600050106000501060005030100050100000503060005040600050106000501
-060005030100050100000503060005010600050106000501060005060100051a00000502
-06030505060105050100051a00000508060205080100051a0000050806020508010005ff
-05a502020103020205350000050206000500060405010600050006040503010005180000
-050406000501060005010600050106000501060005040100000005040600050106000501
-060005010600050106000504010000000504060005010600050106000501060005010600
-050401000518000005040603050d01000518000005090602050901000518000005090602
-0509010005ff05a402020103020205360000050106060501060605020100051a00000503
-060005010600050106000501060005010600050301000501000005030600050106000501
-060005010600050106000503010005010000050306000501060005010600050106000501
-060005030100051a00000503060905060100051a00000508060205080100051a00000514
-010005ff05a5020201030202053500000502060005000602050506000500060205030100
-051800000504060005010600050106000501060005010600050401000000050406000501
-060005010600050106000501060005040100000005040600050106000501060005010600
-050106000504010005180000050506070508010005180000050806040508010005180000
-050906020509010005ff05a4020201030202053600000501060005000602050506000500
-060205020100051a00000503060005010600050106000501060005010600050301000501
-000005030600050106000501060005010600050106000503010005010000050306000501
-060005010600050106000501060005030100051a00000506060405080100051a00000506
-060605060100051a0000050806020508010005ff05a50202010302020535000005020604
-050506040503010005180000051601000000051601000000051601000518000005160100
-0518000005160100051800000516010005ff05a40202010302020536000005140100051a
-00000514010005010000051401000501000005140100051a000005140100051a00000514
-0100051a00000514010005ff05a502020103020205350000051601000518000005160100
-000005160100000005160100051800000516010005180000051601000518000005160100
-05ff05a40202010302020536000005140100051a00000514010005010000051401000501
-000005140100051a000005140100051a000005140100051a00000514010005ff05a50202
-010302020535000005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005180000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000518000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005180000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100051800000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005ff05a402020103020205360100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100051a0100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005010100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005010100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100051a0100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100051a0100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100051a0100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005ff05a5020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed020201030202
-05ff05ff05ed02020103020205ff05ff05ed020201030202050301ff01ff01e505030202
-01030202050301ff01ff01d1050000000500000005000000050000000500000005000000
-050000000500000005000000050001000503020201030202050301ff01ff01d100000500
-000005000000050000000500000005000000050000000500000005000000050001010503
-020201030202050301020bff0bff0bcb010205000000050e010005000100050302020103
-0202050301020bff0bff0bca000001020000051001010503020201030202050301020b01
-00ff00ff00c9010205000000050e0100050001000503020201030202050301020b0100ff
-00ff00c901020000051001010503020201030202050301020b0100ff00ff00c901020500
-0000050e0100050001000503020201030202050301020b0100ff00ff00c9010200000510
-01010503020201030202050301020b0100ff00ff00c9010205000000050e010005000100
-0503020201030202050301020b0100ff00ff00c9010200000502010a0502010105030202
-01030202050301020b0100ff00ff00c90102050000000502010805020100050001000503
-020201030202050301020b0100ff00ff00c9010200000504010605040101050302020103
-0202050301020b0100ff00ff00c901020500000005040104050401000500010005030202
-01030202050301020b0100ff00ff00c90102000005060102050601010503020201030202
-050301020b0100ff00ff00c9010205000000050601000506010005000100050302020103
-0202050301020b0100ff00ff00c901020000051001010503020201030202050301020b01
-00ff00ff00c9010205000000050e0100050001000503020201030202050301020b0100ff
-00ff00c901020000051001010503020201030202050301020b0100ff00ff00c901020500
-0000050e0100050001000503020201030202050301020b0100ff00ff00c9010200000510
-01010503020201030202050301020b0100ff00ff00c9010205000000050e010005000100
-0503020201030202050301020b0000ff00ff00ca01020000051001010503020201030202
-050301ff01ff01d105000000050001000500010005000100050001000500010005000100
-0500010005000100050001000503020201030202050301ff01ff01d10000050001000500
-010005000100050001000500010005000100050001000500010005000101050302020103
-0202050301ff01ff01e5050302020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-02020103020205ff05ff05ed02020103020205ff05ff05ed02020103020205ff05ff05ed
-020201030202050301ff01ff01e505030202010302020503010005ff05ff05970100054a
-01000503020201030202050301000563010505ff05ff052d0100054a0100050302020103
-0202050301000562010705ff05ff052c0100054a01000503020201030202050301000561
-01020503010205ff05ff052b0100054a0100050302020103020205030100056101010505
-010105ff05ff052b0100054a0100050302020103020205030100056101020503010205ff
-05ff052b0100054a01000503020201030202050301000562010705ff05ff052c0100054a
-01000503020201030202050301000563010505ff05ff052d0100054a0100050302020103
-0202050301000565010105ff05ff052f0100054a01000503020201030202050301000565
-010105ff05ff052f0100054a01000503020201030202050301000565010105ff05ff052f
-0100054a01000503020201030202050301000565010105ff05ff052f0100054a01000503
-020201030202050301000565010105ff05ff052f0100054a010005030202010302020503
-01000565010105ff05ff052f0100054a0100050302020103020205030100056101010500
-010205ff05ff052f0100054a0100050302020103020205030100056101010500010205ff
-05ff052f0100054a01000503020201030202050301000561010505ff05ff052f0100054a
-01000503020201030202050301000561010505ff05ff052f0100054a0100050302020103
-020205030100056101020500010105ff05ff052f0100054a010005030202010302020503
-010005ff05ff05970100054a01000503020201030202050301ff01ff0199054a01000503
-020201030202050301000536000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-00000500000005000000050000000500000005000000050000000a040500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000a04050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-0000050000000500000005000000050000000a0405000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-05000000050000000500000005000000050000000500000005000000050000000a040500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000a04050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000a0405000000010005140100
-050001000500010005000100050001000500010005000100050001000500010005240100
-050302020103020205030100053500000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000000050000000500000005000000050000000500000005000a0301000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000a03010000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-05000000050000000500000005000000050000000500000005000a030100000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-0500000005000a0301000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000a03010000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-05000a030100000005000100051301000500010005000100050001000500010005000100
-050001000500010005000100050000000523010005030202010302020503010005360000
-055e01000a01010205000000055c01000a01010205000000055c01000a01010205000000
-055c01000a01010205000000055c01000a01010205000000055c01000a01010205000000
-010005140100050000000500000005000000050000000500000005000000050000000500
-00000524010005030202010302020503010005350000052d0100052f010005000a010102
-0000052b0102052d010005000a0101020000052b0102052d010005000a0101020000052d
-0100052d010005000a0101020000052a0104052c010005000a0101020000052c0102052c
-010005000a01010200000500010005130100050000000500000005000000050000000500
-000005000000050000000500010005000000052301000503020201030202050301000536
-0000052a0102053001000a010102050000000529010005020100052d01000a0101020500
-00000529010005020100052d01000a01010205000000052b0101052e01000a0101020500
-000005290100053101000a01010205000000052a0100053001000a010102050000000100
-0514010005000000050a0100050000000524010005030202010302020503010005350000
-052d0100052f010005000a0101020000052a010005020100052c010005000a0101020000
-052e0100052c010005000a0101020000052b010005000100052d010005000a0101020000
-052a01000530010005000a0101020000052a01000530010005000a010102000005000100
-0513010005000000050c0100050000000523010005030202010302020503010005360000
-052c0100053001000a010102050000000529010005020100052d01000a01010205000000
-052d0100052d01000a01010205000000052a010005000100052e01000a01010205000000
-05290100053101000a0101020500000005290100053101000a0101020500000001000514
-010005000000050a0100050000000524010005030202010302020503010005350000052d
-0100052f010005000a0101020000052d0100052d010005000a0101020000052c0101052d
-010005000a0101020000052a010005010100052d010005000a0101020000052a0103052d
-010005000a0101020000052a0103052d010005000a010102000005000100051301000500
-0000050c0100050000000523010005030202010302020503010005360000052c01000530
-01000a01010205000000052b0100052f01000a01010205000000052d0100052d01000a01
-0102050000000528010005020100052e01000a01010205000000052d0100052d01000a01
-0102050000000529010005020100052d01000a0101020500000001000514010005000000
-050a0100050000000524010005030202010302020503010005350000052d0100052f0100
-05000a0101020000052b0100052f010005000a0101020000052e0100052c010005000a01
-0102000005290105052c010005000a0101020000052e0100052c010005000a0101020000
-052a010005020100052c010005000a0101020000050001000513010005000000050c0100
-050000000523010005030202010302020503010005360000052c0100053001000a010102
-050000000529010005020100052d01000a010102050000000529010005020100052d0100
-0a01010205000000052c0100052e01000a010102050000000528010005030100052d0100
-0a010102050000000529010005020100052d01000a010102050000000100051401000500
-0000050a0100050000000524010005030202010302020503010005350000052b0104052d
-010005000a0101020000052a0104052c010005000a0101020000052b0102052d01000500
-0a0101020000052c0102052c010005000a0101020000052a0103052d010005000a010102
-0000052b0102052d010005000a0101020000050001000513010005000000050c01000500
-00000523010005030202010302020503010005360000055e01000a01010205000000055c
-01000a01010205000000055c01000a01010205000000055c01000a01010205000000055c
-01000a01010205000000055c01000a0101020500000001000514010005000000050a0100
-050000000524010005030202010302020503010005350000055e010005000a0101020000
-055c010005000a0101020000055c010005000a0101020000055c010005000a0101020000
-055c010005000a0101020000055c010005000a0101020000050001000513010005000000
-050c0100050000000523010005030202010302020503010005360000055e01000a010102
-05000000055c01000a01010205000000055c01000a01010205000000055c01000a010102
-05000000055c01000a01010205000000055c01000a010102050000000100050e01000504
-010005000000050a0100050000000524010005030202010302020503010005350000055e
-010005000a0101020000055c010005000a0101020000055c010005000a0101020000055c
-010005000a0101020000055c010005000a0101020000055c010005000a01010200000500
-0100050d01010503010005000000050c0100050000000523010005030202010302020503
-010005360000055e01000a01010205000000055c01000a01010205000000055c01000a01
-010205000000055c01000a01010205000000055c01000a01010205000000055c01000a01
-0102050000000100050c0100050001000504010005000000050001000500010005000100
-050001000500010005000100050000000524010005030202010302020503010005350000
-055e010005000a0101020000055c010005000a0101020000055c010005000a0101020000
-055c010005000a0101020000055c010005000a0101020000055c010005000a0101020000
-05000100050e010005030100050000000500000005000000050000000500000005000000
-050000000500010005000000052301000503020201030202050301000536000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001000a010102050000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001000a0101020500000005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000a01010205000000050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001000500010005000100050001000a010102050000000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0a0101020500000005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000a010102050000000100050e0100050401000500
-0000050a0100050000000524010005030202010302020503010005350000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000a000103000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000a0001030000050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000a00010300000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050001000500010005000a000103000005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0a0001030000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000a000103000005000100050e0100050301000500
-0000050c0100050000000523010005030202010302020503010005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000063010000630100
-0063010000630100006301000063010000020100050e01000504010005000000050a0100
-050000000524010005030202010302020503010000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050001000063010000630100006301000063
-0100006301000063010000020100050e01000503010005000000050c0100050000000523
-010005030202010302020503010005000000053201000500006301000063010000630100
-00630100006301000063010000020100050c01040502010005000000050a010005000000
-052401000503020201030202050301000000053401000063010000630100006301000063
-01000063010000630100000201000513010005000000050c010005000000052301000503
-020201030202050301000500000005170100051901000500006301000063010000630100
-006301000063010000630100000201000514010005000000050a01000500000005240100
-050302020103020205030100000005160102051a0100000f010200030102004901000007
-010000230100000b010200030102001f0100006301000063010000630100006301000002
-01000513010005000000050c010005000000052301000503020201030202050301000500
-0000051701000519010005000011010000050100004901000007010000230100000d0100
-00050100001f010000630100006301000063010000630100000201000514010005000000
-050a01000500000005240100050302020103020205030100000005180100051a01000008
-010200050100000501000003010200420100000701000000010100030102000201000000
-01010002010000000101000301020002010400010100000201000004010000050100001f
-010000630100006301000063010000630100000201000513010005000000050c01000500
-000005230100050302020103020205030100050000000517010005190100050000070100
-000201000004010000050100000201000002010000410100000701010001010000010100
-000201000001010100010100000101010001010000010100000201000003010000030100
-000201000004010000050100001f01000063010000630100006301000063010000020100
-0514010005000000050a0100050000000524010005030202010302020503010000000518
-0100051a0100000701000002010000040100000501000002010000020100004101000007
-010000020100000101000002010000010100000501000002010000010100000701000003
-0100000201000004010000050100001f0100006301000063010000630100006301000002
-01000513010005000000050c010005000000052301000503020201030202050301000500
-000005170100051901000500000701000002010000040100000501000002010400410100
-000701000002010000010100000201000001010000050100000201000002010200040100
-00030100000201000004010000050100001f010000630100006301000063010000630100
-000201000514010005000000050001000500010005000100050001000500010005000100
-0500000005240100050302020103020205030100000005180100051a0100000701000002
-010000040100000501000002010000450100000701000002010000010100000201000001
-01000005010000020100000501000003010000030100000201000004010000050100001f
-010000630100006301000063010000630100000201000513010005000000050001000500
-010005000100050001000500010005000100050001000500000005230100050302020103
-020205030100050000000515010405170100050000070100000201000004010000050100
-000201000002010000410100000701000002010000010100000201000001010000050100
-0002010000010100000201000003010000030100000101010004010000050100001f0100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000534010000080102000501000005010000030102004201000007
-010000020100000201020002010000050100000201000002010200050101000201010000
-01000004010000050100001f010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000053201000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000053401000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000534
-010000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005320100050000630100
-00630100006301000063010000630100006301000002010005140100030e000005240100
-050302020103020205030100000005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01ff01ff016105140100030e000005240100050302020103020205030100050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000630100
-006301000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000100006301000063010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000500
-000005320100050000630100006301000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000000053401000063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010005000000051601020518010005000063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-0503020201030202050301000000051601000502010005180100001f0100000301020003
-010200340100000f01020050010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005150100050201000517
-010005000026010000050100003401000011010000500100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005160100050201000518010000080101000001000001010000020100000101000000
-010100030102000501000005010000030102002d01000008010200050100000201000002
-01000002010200030102000301020002010000000101002d010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000500
-000005180100051801000500000701000001010100010100000201000001010100010100
-0004010000050100000501000002010000020100002c0100000701000002010000040100
-000201000002010000010100000201000001010000020100000101000002010000010101
-00010100002c01000063010000630100006301000063010000020100051301000500030e
-0500000005230100050302020103020205030100000005180100051a0100000701000002
-01000001010000020100000101000002010000040100000501000005010000060100002c
-010000070100000801000002010000020100000101000005010000050100000201000001
-010000020100002c0100006301000063010000630100006301000002010005140100030e
-0000052401000503020201030202050301000500000005160100051a0100050000070100
-000201000001010000020100000101000002010000040100000501000005010000030103
-002c01000008010200050100000201000002010000020102000301020002010400010100
-00020100002c01000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000516010005020100051801000007
-010000020100000101000002010000010100000201000004010000050100000501000002
-010000020100002c0100000b010000040100000201000002010000050100000501000001
-01000005010000020100002c010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005150104051701000500
-000701000001010100010100000101010001010000020100000401000005010000050100
-0002010000020100002c0100000701000002010000040100000201000001010100010100
-00020100000101000002010000010100000201000001010000020100002c010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000534010000080101000001000002010100000100000101000002
-010000040100000501000005010000030103002c01000008010200050100000301010000
-01000002010200030102000301020002010000020100002c010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000500
-0000053201000500000b0100005601000063010000630100006301000063010000630100
-00020100051301000500030e050000000523010005030202010302020503010000000534
-010000070100000201000056010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000053201000500
-000801020057010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005340100006301000063
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005320100050000630100006301000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000500010005000100050001000500010005000100050001ff01ff0161051301000500
-030e05000000052301000503020201030202050301000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000100006301000063010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000053201000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000053401000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000516010205180100050000630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-00000516010005020100051801000063010000070100005a010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000000051901000517010005000063010000070100005a01000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0000051a0100051801000008010200020100000001010002010000000101000301020042
-010000070100000001010002010000000101000301020002010100000100000201010000
-010000030102003401000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005170101051801000500
-000701000002010000010101000101000001010100010100000101000002010000410100
-000701010001010000010101000101000001010000020100000101000000010000000100
-000101000000010000000100000101000002010000330100006301000063010000630100
-006301000002010005140100030e0000052401000503020201030202050301000000051a
-010005180100000b01000001010000020100000101000002010000050100004101000007
-010000020100000101000005010000020100000101000000010000000100000101000000
-010000000100000501000033010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000051901000517
-010005000008010300010100000201000001010000020100000201030041010000070100
-000201000001010000050100000201000001010000000100000001000001010000000100
-000001000002010300330100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000516010005020100051801000007
-010000020100000101000002010000010100000201000001010000020100004101000007
-010000020100000101000005010000020100000101000000010000000100000101000000
-010000000100000101000002010000330100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000516
-010205180100050000070100000201000001010000020100000101000002010000010100
-000201000041010000070101000101000001010000050100000201000001010000000100
-000001000001010000000100000001000001010000020100003301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005340100000801030001010000020100000101000002010000020103004101000007
-010000000101000201000006010200020100000001000000010000010100000001000000
-010000020103003301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005320100050000630100
-00630100006301000063010000630100006301000002010005140100030e000005240100
-050302020103020205030100000005340100006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000000053201000500006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000053401000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000532010005000063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000063010000630100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001ff01ff
-016105140100030e00000524010005030202010302020503010005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-050302020103020205030100000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500010000630100006301000063010000630100006301000063
-01000002010005140100030e000005240100050302020103020205030100050000000532
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005340100006301000063
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005180100051801000500006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000518010105190100001001000006010000490100000e0100001c
-0100000b010200030102001f010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005160100050001000518
-010005000010010000510100000e0100001c0100000d010000050100001f010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000517010005000100051901000008010200020104000201020002
-01000000010100030102003b010000080102000201000001010000030102000201000000
-0101000301020002010400010100000201000004010000050100001f0100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-010005000000051501000501010005180100050000070100000201000003010000060100
-00020101000101000001010000020100003a010000070100000201000001010000000100
-000301000002010000010101000101000001010000020100000301000003010000020100
-0004010000050100001f0100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005150100050201000519
-0100000701000007010000060100000201000002010000050100003a0100000701000005
-010100080100000101000002010000010100000701000003010000020100000401000005
-0100001f0100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010005000000051401050517010005000008010200040100
-00060100000201000002010000020103003a010000080102000201010005010300010100
-00020100000201020004010000030100000201000004010000050100001f010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000519010005190100000b01000003010000060100000201000002
-01000001010000020100003a0100000b0100000101000000010000030100000201000001
-010000020100000501000003010000030100000201000004010000050100001f01000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000517010205170100050000070100000201000003010000060100
-00020100000201000001010000020100003a010000070100000201000001010000010100
-000201000002010000010100000201000001010000020100000301000003010000010101
-0004010000050100001f0100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005340100000801020005
-010100040100000201000002010000020103003a01000008010200020100000201000002
-01030001010000020100000201020005010100020101000001000004010000050100001f
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005320100050000630100006301000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000000053401000063010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000053201000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000534010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001ff01ff0161051301000500030e0500
-0000052301000503020201030202050301000a3600630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0a3501000063010000630100006301000063010000630100006301000002010005130100
-0500030e05000000052301000503020201030202050301000a0101340063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000a010134006301000063010000630100006301000063010000630100
-00020100051301000500030e05000000052301000503020201030202050301000a010115
-000401190063010000630100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000a0101150000011d00070100000e0100
-0014010000340100002b0102003401000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000a0101150000011d
-00070100000e0100004a0100002d01000034010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000a0101150000011d
-000701000001010000030102000201040002010200020100000001010003010200020100
-000001010003010200260100000701000002010000010100000001010002010000000101
-00030102000301020005010000030102002d010000630100006301000063010000630100
-00020100051301000500030e05000000052301000503020201030202050301000a010115
-0003011a0007010000000100000301000002010000030100000301000002010000010101
-000101000004010000020101000101000001010000020100002501000007010000020100
-000101010001010000010101000101000001010000020100000101000002010000040100
-0002010000020100002c0100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000a010119000001190007010100080100
-000301000007010000010100000801000002010000020100000501000025010000070100
-000201000001010000020100000101000002010000010100000901000004010000060100
-002c01000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000a01011900000119000701010005010300030100
-000401030001010000080100000201000002010000020103002501000007010000020100
-0001010000020100000101000002010000020102000301030004010000030103002c0100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000a010114000001030000011900070100000001000003010000020100
-000301000003010000020100000101000008010000020100000201000001010000020100
-002501000007010000020100000101000002010000010100000201000005010000010100
-00020100000401000002010000020100002c010000630100006301000063010000630100
-00020100051301000500030e05000000052301000503020201030202050301000a010115
-0003011a0007010000010100000201000002010000030100000301000002010000010100
-000801000002010000020100000101000002010000250100000701000001010100010101
-000101000001010100010100000101000002010000010100000201000004010000020100
-00020100002c0100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000a01013400070100000201000002010300040101
-000201030001010000080100000201000002010000020103002501000008010100000100
-0001010000000101000201000000010100030102000301030004010000030103002c0100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-0503020201030202050301000a01013400630100000e010000050100004c010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000a01013400630100000e010000050100004c0100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-0a01013400630100000e010000050100004c010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000a01013400630100
-006301000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000a01013400630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0a0101340063010000630100006301000063010000630100006301000002010005130100
-0500030e05000000052301000503020201030202050301000a0001ff01ff019705140100
-030e00000524010005030202010302020503010005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500010000630100006301000063010000630100006301000063010000020100
-05140100030e000005240100050302020103020205030100050000000532010005000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100000005340100006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000500000005170102051701000500006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-0100000005170100051b0100000a0100001a01010004010000340100000f0102000c0100
-00020100003e0100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000500000005150100051b0100050000250100003c
-01000011010000100100003e010000630100006301000063010000630100000201000513
-01000500030e0500000005230100050302020103020205030100000005160100051c0100
-000801020003010200030102000301020004010000040102000201000000010100030102
-0026010000080102000501000002010000020100000201020002010000010100003b0100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000500000005150103051801000500000a010000020100000201000001
-010000020100000101000002010000010104000401000002010100010100000101000002
-010000250100000701000002010000040100000201000002010000040100000201000000
-0100003c01000063010000630100006301000063010000020100051301000500030e0500
-0000052301000503020201030202050301000000051601000502010005180100000a0100
-000201000002010000010100000501000002010000030100000601000002010000020100
-000101000002010000250100000b01000004010000020100000201000004010000020101
-003d0100006301000063010000630100006301000002010005140100030e000005240100
-050302020103020205030100050000000515010005020100051701000500000a01000002
-010000020100000201020002010400030100000601000002010000020100000101040025
-0100000801030004010000030100000001000005010000020101003d0100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-0202050301000000051601000502010005180100000a0100000201000002010000050100
-000101000007010000060100000201000002010000010100002901000007010000020100
-000401000003010000000100000501000002010000000100003c01000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0500000005160102051801000500000a0100000201000002010000010100000201000001
-010000020100000301000006010000020100000201000001010000020100002501000007
-0100000201000004010000040100000601000002010000010100003b0100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100000005340100000a01000003010200030102000301020004010000060100
-000201000002010000020102002601000008010300040100000401000006010000020100
-00020100003a0100006301000063010000630100006301000002010005140100030e0000
-0524010005030202010302020503010005000000053201000500000a0100005701000063
-01000063010000630100006301000063010000020100051301000500030e050000000523
-010005030202010302020503010000000534010000070100000101000057010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010005000000053201000500000801010058010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100000005340100006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000500000005320100
-050000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000000050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-05000100050001ff01ff0161051301000500030e05000000052301000503020201030202
-050301000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000100006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000000
-053401000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100050000000515010405170100
-05000063010000630100006301000063010000630100006301000002010005140100030e
-0000052401000503020201030202050301000000051601000502010005180100000a0101
-00130100000b0100000201000030010000250100000b0102000301020026010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010005000000051801000518010005000009010000150100000f01000030
-010000250100000d01000005010000260100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010000000519010005190100
-000901000003010000000101000301020003010100000100000101000000010100030102
-0002010000010100002d0100000701000000010100030102000201000000010100020100
-000001010002010400010100000201000004010000050100002601000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000500000005180100051801000500000701040001010100010100000101000002
-010000010100000101010001010100010100000401000002010000000100002e01000007
-010100010100000101000002010000010101000101000001010100010100000301000003
-010000020100000401000005010000260100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010000000519010005190100
-000901000003010000050100000201000001010000020100000101000008010000020101
-002f01000007010000020100000101000002010000010100000501000007010000030100
-000201000004010000050100002601000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000500000005170100
-051901000500000901000003010000050104000101000002010000010100000801000002
-0101002f0100000701000002010000010100000201000001010000050100000701000003
-010000020100000401000005010000260100006301000063010000630100006301000002
-010005140100030e000005240100050302020103020205030100000005180100051a0100
-000901000003010000050100000501000002010000010100000801000002010000000100
-002e01000007010000020100000101000002010000010100000501000007010000030100
-000201000004010000050100002601000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000500000005170100
-051901000500000901000003010000050100000201000001010000010101000101000008
-01000002010000010100002d010000070100000201000001010000020100000101000005
-010000070100000301000001010100040100000501000026010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000000
-053401000009010000030100000601020003010100000100000101000008010000020100
-00020100002c010000070100000201000002010200020100000501000008010100020101
-000001000004010000050100002601000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000500000005320100
-05000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100000005340100006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010005000000053201000500006301000063010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000000
-053401000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100050000000532010005000063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010000000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001ff01ff016105140100030e0000052401000503020201030202050301000e360063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-0000052301000503020201030202050301000e350d000063010000630100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-01000e0107320d0100630100006301000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000e0107320d010063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-01000503020201030202050301000e010716010207180d01006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-01030202050301000e01071501000702010007170d01006301000010010000200102002d
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000e01071501000702010007170d01006301000010010000220100
-002d01000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000e01071501000702010007170d01000701000000
-010100030102000201000000010100490100000801020002010400010100000201000001
-01000000010100030102000201000000010100050100000301020002010000000101001f
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000e010716010207180d0100070101000101000001010000020100
-000101010001010000480100000701000002010000030100000301000002010000010101
-000101000001010000020100000101010001010000040100000201000002010000010101
-00010100001e01000063010000630100006301000063010000020100051301000500030e
-05000000052301000503020201030202050301000e01071501000702010007170d010007
-010000020100000101000002010000010100004c01000007010000070100000301000002
-010000010100000501000002010000010100000201000004010000060100000101000002
-0100001e0100006301000063010000630100006301000002010005140100030e00000524
-01000503020201030202050301000e01071501000702010007170d010007010000020100
-0001010400010100004c0100000801020004010000030100000201000001010000050104
-000101000002010000040100000301030001010000020100001e01000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000e01071501000702010007170d0100070100000201000001010000050100004c
-0100000b0100000301000003010000020100000101000005010000050100000201000004
-010000020100000201000001010000020100001e01000063010000630100006301000063
-01000002010005140100030e0000052401000503020201030202050301000e0107160102
-07180d010007010100010100000101000002010000010100004c01000007010000020100
-000301000003010000010101000101000005010000020100000101010001010000040100
-00020100000201000001010000020100001e010000630100006301000063010000630100
-00020100051301000500030e05000000052301000503020201030202050301000e010732
-0d0100070100000001010003010200020100004c01000008010200050101000201010000
-01000001010000060102000201000000010100050100000301030001010000020100001e
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000e0107320d0100070100005a0100002a01000037010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-01030202050301000e0107320d0100070100005a0100002a010000370100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-01000e0107320d0100070100005a0100002a010000370100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-0e0107320d01006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000e0107320d010063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-0503020201030202050301000e010d340063010000630100006301000063010000630100
-006301000002010005140100030e0000052401000503020201030202050301000e000d35
-01ff01ff0161051301000500030e05000000052301000503020201030202050301000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000100006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000000053201000500006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000053401000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000516010205180100050000630100
-00630100006301000063010000630100006301000002010005140100030e000005240100
-0503020201030202050301000000051601000502010005180100001f0100004201000012
-010000170102003401000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005150100050201000517
-010005000063010000120100001901000034010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000051601000502
-01000518010000070101000001000003010200020100000001010003010200030102003b
-010000080102000301010000010000020102000201000000010100020100000001010005
-010000030102000201000000010100260100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000515
-010005020100051701000500000701000000010000000100000101000002010000010101
-00010100000401000002010000020100003a010000070100000201000001010000010101
-000101000002010000010101000101000001010100010100000401000002010000020100
-000101010001010000250100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000517010305180100000701000000
-01000000010000050100000101000008010000060100003a010000070100000201000001
-010000020100000101000002010000010100000201000001010000020100000401000006
-010000010100000201000025010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000051901000517
-0100050000070100000001000000010000020103000101000008010000030103003a0100
-000701000002010000010100000201000001010400010100000201000001010000020100
-000401000003010300010100000201000025010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000051901000519
-010000070100000001000000010000010100000201000001010000080100000201000002
-0100003a0100000701000002010000010100000201000001010000050100000201000001
-010000020100000401000002010000020100000101000002010000250100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000515010205190100050000070100000001000000010000010100
-0002010000010100000801000002010000020100003a0100000701000002010000010100
-000101010001010000020100000101000002010000010101000101000004010000020100
-000201000001010000020100002501000063010000630100006301000063010000020100
-05140100030e000005240100050302020103020205030100000005340100000701000000
-01000000010000020103000101000008010000030103003a010000080102000301010000
-010000020102000201000002010000010100000001010005010000030103000101000002
-0100002501000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000532010005000063010000230100
-003e0100006301000063010000630100006301000002010005140100030e000005240100
-0503020201030202050301000000053401000063010000230100003e0100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000532010005000063010000230100003e01000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005340100006301000063010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000053201000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001ff01ff016105140100030e0000052401000503020201030202050301000c36
-00630100006301000063010000630100006301000063010000020100051301000500030e
-05000000052301000503020201030202050301000c350900006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000c01083209010063010000630100006301000063010000630100006301000002
-0100051301000500030e05000000052301000503020201030202050301000c0108320901
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000c01081301000804010208150901006301000063
-01000063010000630100006301000063010000020100051301000500030e050000000523
-01000503020201030202050301000c010811010208030100080201000814090100070100
-0016010000420100000701000006010200100100000c0100003001000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0c010813010008030100080201000814090100070100005a010000070100000801000010
-0100000c0100003001000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000c01081301000803010008020100
-081409010007010000010100000301020002010000000101000301020002010000000101
-003b01000007010000000101000501000003010200030102000201000001010000030102
-000201000000010100030102000201000000010100030101000001000017010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000c01081301000803010008020100081409010007010000000100000301000002
-01000001010100010100000401000002010100010100003a010000070101000101000004
-010000020100000201000001010000020100000101000000010000030100000201000001
-010100010100000101000002010000010101000101000001010000010101001701000063
-010000630100006301000063010000020100051301000500030e05000000052301000503
-020201030202050301000c01081301000803010008020100081409010007010100080100
-00010100000801000002010000020100003a010000070100000201000004010000060100
-000101000005010100040100000201000001010000020100000101000002010000010100
-000501000002010000170100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000c010813010008030100080201000814
-0901000701010005010300010100000801000002010000020100003a0100000701000002
-010000040100000301030001010000050101000401040001010000020100000101040001
-010000050100000201000017010000630100006301000063010000630100000201000513
-01000500030e05000000052301000503020201030202050301000c010813010008030100
-080201000814090100070100000001000003010000020100000101000008010000020100
-00020100003a010000070100000201000004010000020100000201000001010000050100
-000001000003010000050100000201000001010000050100000501000002010000170100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000c010811010408020102081509010007010000010100000201000002
-010000010100000801000002010000020100003a01000007010100010100000401000002
-010000020100000101000002010000010100000101000002010000020100000101010001
-010000010100000201000001010000050100000101010017010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-01000c010832090100070100000201000002010300010100000801000002010000020100
-003a01000007010000000101000501000003010300020102000201000002010000020102
-000201000000010100030102000201000006010100000100001701000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-0c010832090100630100004a010000170100006301000063010000630100006301000002
-0100051301000500030e05000000052301000503020201030202050301000c0108320901
-006301000046010000020100001701000063010000630100006301000063010000020100
-05140100030e0000052401000503020201030202050301000c0108320901006301000047
-0102001801000063010000630100006301000063010000020100051301000500030e0500
-0000052301000503020201030202050301000c0108320901006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000c01083209010063010000630100006301000063010000630100006301000002
-0100051301000500030e05000000052301000503020201030202050301000c0109340063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-01000503020201030202050301000c00093501ff01ff0161051301000500030e05000000
-052301000503020201030202050301000c36006301000063010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000c35
-090000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000c01083209010063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000c010832090100630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000c01
-081301000805010008160901006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000c01081101020803
-01020816090100170100004a010000070100003001020026010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-01000c0108130100080501000816090100170100004a0100000701000032010000260100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-01030202050301000c010813010008050100081609010007010100000100000301020002
-010400020102004201000007010000000101000201000000010100030102000201010000
-010000020101000001000003010200020100000001010005010000030102000201000000
-0101001801000063010000630100006301000063010000020100051301000500030e0500
-0000052301000503020201030202050301000c0108130100080501000816090100070100
-000001000000010000010100000201000003010000030100000201000041010000070101
-000101000001010100010100000101000002010000010100000001000000010000010100
-000001000000010000010100000201000001010100010100000401000002010000020100
-000101010001010000170100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000c010813010008050100081609010007
-010000000100000001000005010000030100000301000045010000070100000201000001
-010000050100000201000001010000000100000001000001010000000100000001000005
-010000010100000201000004010000060100000101000002010000170100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-0202050301000c0108130100080501000816090100070100000001000000010000020103
-000301000004010200420100000701000002010000010100000501000002010000010100
-000001000000010000010100000001000000010000020103000101000002010000040100
-000301030001010000020100001701000063010000630100006301000063010000020100
-05140100030e0000052401000503020201030202050301000c0108130100080501000816
-090100070100000001000000010000010100000201000003010000070100004101000007
-010000020100000101000005010000020100000101000000010000000100000101000000
-010000000100000101000002010000010100000201000004010000020100000201000001
-010000020100001701000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000c01081101040801010408140901
-000701000000010000000100000101000002010000030100000301000002010000410100
-000701010001010000010100000501000002010000010100000001000000010000010100
-000001000000010000010100000201000001010100010100000401000002010000020100
-000101000002010000170100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000c010832090100070100000001000000
-010000020103000401010002010200420100000701000000010100020100000601020002
-010000000100000001000001010000000100000001000002010300010100000001010005
-010000030103000101000002010000170100006301000063010000630100006301000002
-0100051301000500030e05000000052301000503020201030202050301000c0108320901
-006301000031010000300100006301000063010000630100006301000002010005140100
-030e0000052401000503020201030202050301000c010832090100630100003101000030
-01000063010000630100006301000063010000020100051301000500030e050000000523
-01000503020201030202050301000c010832090100630100003101000030010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000c01083209010063010000630100006301000063010000630100006301000002
-0100051301000500030e05000000052301000503020201030202050301000c0108320901
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000c01093400630100006301000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000c00093501ff01ff016105140100030e00000524010005030202010302020503
-010005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005340100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005130100050401020515
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005120102050301000502
-010005150100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005130100050301000502
-010005140100050000630100006301000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000000051401000503
-010005020100051501000063010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000051301000506
-010005150100050000630100006301000063010000630100006301000063010000020100
-051301000500030e05000000052301000503020201030202050301000000051401000505
-010005170100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005130100050401000517
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005140100050301000502
-010005150100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005110104050101040514
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005340100006301000063
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005320100050000630100006301000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000000053401000063010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000053201000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000534010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-01000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001ff01ff0161051301000500030e0500
-000005230100050302020103020205030100050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-010000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005320100050000630100
-00630100006301000063010000630100006301000002010005140100030e000005240100
-050302020103020205030100000005340100006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000000051301000504010205150100050000630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005120102050301000502010005150100006301000063010000630100006301000063
-01000063010000020100051301000500030e050000000523010005030202010302020503
-010005000000051301000507010005140100050000630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005140100050701000515010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-000005130100050501010515010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000514
-010005070100051501000063010000630100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000513
-010005070100051401000500006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000051401000503
-010005020100051501000063010000630100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000511
-010405020102051501000500006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000053401000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000532010005000063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000534010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-000005320100050000630100006301000063010000630100006301000063010000020100
-05140100030e000005240100050302020103020205030100000005340100006301000063
-01000063010000630100006301000063010000020100051301000500030e050000000523
-010005030202010302020503010005000000053201000500006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000000050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100006301000063010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100050001000500010005000100050001ff01ff01610514
-0100030e0000052401000503020201030202050301000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050001000063010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000053201000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000534010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000513010005060100051501000500006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000512010205050101051601000063010000630100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-010005000000051301000504010005000100051501000500006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000514010005040100050001000516010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000513010005030100050101000515010005000063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-050302020103020205030100000005140100050201000502010005160100006301000063
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005130100050201050514010005000063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-050302020103020205030100000005140100050601000516010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000511010405030102051401000500006301000063010000630100
-00630100006301000063010000020100051301000500030e050000000523010005030202
-010302020503010000000534010000630100006301000063010000630100006301000063
-01000002010005140100030e000005240100050302020103020205030100050000000532
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005340100006301000063
-0100006301000063010000630100006301000002010005140100030e0000052401000503
-020201030202050301000500000005320100050000630100006301000063010000630100
-006301000063010000020100051301000500030e05000000052301000503020201030202
-050301000000053401000063010000630100006301000063010000630100006301000002
-010005140100030e00000524010005030202010302020503010005000000053201000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000063010000630100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001ff01ff0161051301000500030e050000000523010005030202010302020503
-010005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000063010000630100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050001000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000534
-010000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005130100050301040514
-010005000063010000630100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000512010205030100051901000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000513010005030100051801000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000051401000503010005190100006301000063
-01000063010000630100006301000063010000020100051301000500030e050000000523
-010005030202010302020503010005000000051301000503010305150100050000630100
-00630100006301000063010000630100006301000002010005140100030e000005240100
-050302020103020205030100000005140100050701000515010000630100006301000063
-010000630100006301000063010000020100051301000500030e05000000052301000503
-020201030202050301000500000005130100050701000514010005000063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000514010005020100050301000515010000630100006301000063
-010000630100006301000063010000020100051301000500030e05000000052301000503
-020201030202050301000500000005110104050101030515010005000063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000534010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-000005320100050000630100006301000063010000630100006301000063010000020100
-05140100030e000005240100050302020103020205030100000005340100006301000063
-01000063010000630100006301000063010000020100051301000500030e050000000523
-010005030202010302020503010005000000053201000500006301000063010000630100
-0063010000630100006301000002010005140100030e0000052401000503020201030202
-050301000000053401000063010000630100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000532
-010005000063010000630100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001ff01ff016105140100030e00000524010005030202010302020503
-010005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005340100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005130100050501020514
-010005000063010000630100006301000063010000630100006301000002010005130100
-0500030e0500000005230100050302020103020205030100000005120102050401000518
-01000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100050000000513010005030100051801000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000514010005030100051901000063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010005000000051301000503010305150100050000630100
-006301000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000000051401000503010005020100051501000063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010005000000051301000503010005020100051401000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000514010005030100050201000515
-01000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100050000000511010405020102051501000500
-00630100006301000063010000630100006301000063010000020100051301000500030e
-050000000523010005030202010302020503010000000534010000630100006301000063
-01000063010000630100006301000002010005140100030e000005240100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005340100006301000063010000630100006301000063010000630100000201000514
-0100030e0000052401000503020201030202050301000500000005320100050000630100
-006301000063010000630100006301000063010000020100051301000500030e05000000
-052301000503020201030202050301000000053401000063010000630100006301000063
-010000630100006301000002010005140100030e00000524010005030202010302020503
-010005000000053201000500006301000063010000630100006301000063010000630100
-00020100051301000500030e050000000523010005030202010302020503010000000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000063
-010000630100006301000063010000630100006301000002010005140100030e00000524
-010005030202010302020503010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-0100050001000500010005000100050001ff01ff0161051301000500030e050000000523
-010005030202010302020503010005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050001000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050000000532010005000063010000630100
-006301000063010000630100006301000002010005140100030e00000524010005030202
-010302020503010000000534010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-000005130100050301040514010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000512
-010205030100050201000515010000630100006301000063010000630100006301000063
-010000020100051301000500030e05000000052301000503020201030202050301000500
-000005130100050601000515010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000514
-010005060100051601000063010000630100006301000063010000630100006301000002
-0100051301000500030e0500000005230100050302020103020205030100050000000513
-010005060100051501000500006301000063010000630100006301000063010000630100
-0002010005140100030e0000052401000503020201030202050301000000051401000506
-010005160100006301000063010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000051301000505
-010005160100050000630100006301000063010000630100006301000063010000020100
-05140100030e000005240100050302020103020205030100000005140100050501000517
-010000630100006301000063010000630100006301000063010000020100051301000500
-030e05000000052301000503020201030202050301000500000005110104050301000516
-010005000063010000630100006301000063010000630100006301000002010005140100
-030e00000524010005030202010302020503010000000534010000630100006301000063
-010000630100006301000063010000020100051301000500030e05000000052301000503
-020201030202050301000500000005320100050000630100006301000063010000630100
-00630100006301000002010005140100030e000005240100050302020103020205030100
-000005340100006301000063010000630100006301000063010000630100000201000513
-01000500030e050000000523010005030202010302020503010005000000053201000500
-0063010000630100006301000063010000630100006301000002010005140100030e0000
-052401000503020201030202050301000000053401000063010000630100006301000063
-0100006301000063010000020100051301000500030e0500000005230100050302020103
-020205030100050000000532010005000063010000630100006301000063010000630100
-006301000002010005140100030e00000524010005030202010302020503010000000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000063
-0100006301000063010000630100006301000063010000020100051301000500030e0500
-000005230100050302020103020205030100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001ff01ff016105140100030e00000524
-010005030202010302020503010005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-01000063010000630100006301000063010000630100006301000002010005140100030e
-000005240100050302020103020205030100050000000532010005000063010000630100
-0063010000630100006301000063010000020100051301000500030e0500000005230100
-050302020103020205030100000005340100006301000063010000630100006301000063
-0100006301000002010005140100030e0000052401000503020201030202050301000500
-000005130100050401020515010005000063010000630100006301000063010000630100
-0063010000020100051301000500030e0500000005230100050302020103020205030100
-000005120102050301000502010005150100006301000063010000630100006301000063
-010000630100000201000514010005000000050000000500000005000000050000000500
-00000500000005000000052401000503020201030202050301ff01ff0199051301000500
-000005000000050000000500000005000000050000000500000005000000050000000523
-010005030202010302020503010005ff05ff05e3010005030202010302020503010005ff
-05ff05e3010005030202010302020503010005ff05ff05e3010005030202010302020503
-010005ff05ff05e3010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005ff05ff05e301000503
-0202010302020503010005ff05ff05e301000503020201030202050301000549010005ff
-05ff059801000503020201030202050301000548010105ff05ff05980100050302020103
-020205030100054701000500010005ff05ff059801000503020201030202050301000549
-010005ff05ff059801000503020201030202050301000549010005ff05ff059801000503
-020201030202050301000549010005ff05ff059801000503020201030202050301000549
-010005ff05ff059801000503020201030202050301000549010005ff05ff059801000503
-020201030202050301000547010405ff05ff0596010005030202010302020503010005ff
-05ff05e3010005030202010302020503010005ff05ff05e3010005030202010302020503
-010005ff05ff05e3010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005380100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100054b01000503020201030202050301000537
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000000054a01000503
-020201030202050301000538010005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000003ff03ff033e0000054b010005030202010302020503010005370100050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050003ff03ff033e05000000054a01000503
-020201030202050301000538010005000000050c0000050c010003ff03ff033e0000054b
-01000503020201030202050301000537010005000000050c0100050c0100050003ff03ff
-033e05000000054a01000503020201030202050301000538010005000000050c0000050c
-010003ff03ff033e0000054b01000503020201030202050301000537010005000000050c
-0100050c0100050003ff03ff033e05000000054a01000503020201030202050301000538
-010005000000050c0000050c010003ff03ff033e0000054b010005030202010302020503
-01000537010005000000050c0100050c0100050003ff03ff033e05000000054a01000503
-020201030202050301000538010005000000050c0000050c010003ff03ff033e0000054b
-01000503020201030202050301000537010005000000050c0100050c0100050003ff03ff
-033e05000000054a01000503020201030202050301000538010005000000050c0000050c
-010003ff03ff033e0000054b01000503020201030202050301000537010005000000050c
-0100050c0100050003ff03ff033e05000000054a01000503020201030202050301000538
-010005000000050c0000050c010003ff03ff033e0000054b010005030202010302020503
-010005370100050000000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050003ff03ff
-033e05000000054a01000503020201030202050301000538010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010003ff03ff033e0000054b010005030202010302020503
-010005370100050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-00000500000005000000050000000500000005000000050000000500000005000000054a
-010005030202010302020503010005380000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000054b010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005ff05ff05e301000503
-0202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e3
-010005030202010302020503010005ff05ff05e3010005030202010302020503010005ff
-05ff05e3010005030202010302020503010005ff05ff05e3010005030202010302020503
-010005ff05ff05e3010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005ff05ff05e301000503
-0202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e3
-010005030202010302020503010005ff05ff05e3010005030202010302020503010005ff
-05ff05e3010005030202010302020503010005ff05ff05e3010005030202010302020503
-010005ff05ff05e3010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005ff05ff05e301000503
-0202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e3
-010005030202010302020503010005ff05ff05e3010005030202010302020503010005ff
-05ff05e3010005030202010302020503010005ff05ff05e3010005030202010302020503
-010005ff05ff05e3010005030202010302020503010005ff05ff05e30100050302020103
-02020503010005ff05ff05e3010005030202010302020503010005ff05ff05e301000503
-0202010302020503010005ff05ff05e3010005030202010302020503010005ff05ff05e3
-010005030202010302020503010005ff05ff05e3010005030202010100040503010005ff
-05ff05e301000503000502020400050301ff01ff01e50503000002020400000002020400
-05ff05ff05ed00000202040000000202040005ff05ff05ed000002020400000002020400
-05ff05ff05ed00000202040000000202040005ff05ff05ed000002020400000002020400
-000502ff02ff02e100060202040000000208040002ff02ff02e100000208040000000208
-040002ff02ff02e100000208040000000208040001ff01ff01e100000208040000000409
-01ff01ff01e100000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 380 315
-%%EOF
diff --git a/lib/tv/doc/src/tv_table_loaded.gif b/lib/tv/doc/src/tv_table_loaded.gif
deleted file mode 100644
index 1786426f4d..0000000000
--- a/lib/tv/doc/src/tv_table_loaded.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_table_loaded.ps b/lib/tv/doc/src/tv_table_loaded.ps
deleted file mode 100644
index 3f0cf9d707..0000000000
--- a/lib/tv/doc/src/tv_table_loaded.ps
+++ /dev/null
@@ -1,1430 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_table_loaded.eps)
-%%CreationDate: (Mon Mar 19 17:15:33 2001)
-%%BoundingBox: 0 0 532 441
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 532 441
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-532.000000 441.000000
-12
-760 630
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-ff0000
-d9d9d9
-b22222
-828282
-ff9155
-c3c3c3
-7f7f7f
-990000
-000000
-000000
-000000
-000a01ff01ff01e1000b0208040001ff01ff01e100000208040000000208040002ff02ff
-02e1000002080400000002080400020000ff00ff00de0400020000000208040000000202
-04060200000004ff04ff04de020000000405020204000000020204000209000d02ff02ff
-02d500000202040000000202040002080000020d040002a501010206010102150101021e
-0101022901010206010102430101022a010102260101023201010233010102ae00000202
-040000000202040002080000020d04000277010502000107020101030206010702090101
-02060101021501010219010002030101021c0100020b010102060101022e010202020100
-020d0101022a0101020c0104021401010232010102160100021b010102ae000002020400
-00000202040002080000020d04000277010102070101020301010201010102080101020c
-010102060101021501010218010102210101020b010102060101022e010202020100020d
-01010238010102020101024801010215010102cc00000202040000000202040002080000
-0202040602030400027701010207010102030101020c0101020401030203010102000101
-020301010202010302020101020901010202010302030103020201030201010402010101
-020201030203010102000101020a01040201010302030101020001010203010102020103
-022701000200010102010100020201030203010402020103020201010209010102000101
-020101010203010302030101020201010200010102020101020101030202010402020101
-020101010202010102020101020001010203010102000101020301030203010402020104
-020501040202010102010101020501030201010402000101020101010204010302020101
-020001010201010102020103020201040202010402020103020301010200010102060104
-020201030274000002020400000004030208000002020400030400000203040002770101
-0207010102030102020b0101020301010201010102020102020001010202010102010101
-020101010201010102090101020101010201010102010101020101010200010102010101
-020101010203010102010101020101010202010202000101020a01010202010102010101
-020201020200010102020101020101010201010102260100020001010201010002010101
-020101010201010102010101020101010201010102010101020901020200010202000101
-020101010201010102020101020201020200010102010101020001010200010102010101
-020101010202010102010101020201010202010202000101020201020200010102010101
-020101010201010102050101020801010201010102020101020101010204010102010101
-020101010202010102010101020301010201010102010101020001010201010102010101
-020101010200010102050101020501010201010102020102020001010204010102050101
-020101010273000004030101020b00000203040003020000020404000277010402040101
-0204010302090101020701010202010102010101020201010201010102010101020d0101
-020101010201010102010101020801010201010102030101020101010201010102020101
-02010101020a010102060101020201010201010102020101020101010201010102260100
-0200010202000100020101010201010102010101020101010201010102010101020d0101
-020101010201010102050101020201010202010102010101020101010200010102000101
-020101010201010102020101020101010202010102020101020101010202010102010101
-020101010201010102010102020401020207010102010101020201010201010102040101
-020101010201010102030101020001000204010102010101020101020203010102010101
-020401020204010202040101020101010202010102010101020401020204010102010101
-02760103020b000002030400030200000204040002770101020701010206010202080101
-0204010402020101020101010202010102010105020d0101020101010201010102010101
-02050104020101010203010102010101020101010202010102010101020a010102030104
-020201010201010102020101020101050226010002010101020001000201010102010101
-020101010201010102010105020d01010201010102010101020201040202010102020101
-020101010201010102000101020001010201010102010101020201010201010102020101
-020201010201010102020101020101010201010502020103020301030205010102010101
-020201010201010102040105020101010204010102050105020101010204010102010101
-020501030203010302020101020101010202010102010101020501030202010502760103
-020b00000204040003000000020504000277010102070101020701010208010102030101
-020101010202010102010101020201010201010102110101020101010201010102010101
-0204010102010101020101010203010102010101020101010202010102010101020a0101
-020201010201010102020101020101010202010102010101022a01000202010202010101
-020101010201010102010101020101010211010102010101020101010201010102010101
-020201010202010102010101020101010201010102000101020001010200010202020101
-020101010202010102020101020101010202010102010101020101010208010202040102
-020401010201010102020101020101010204010102050101020301000200010102040101
-020501010204010102010101020701020204010202010101020101010202010102010101
-0207010202010101027a0103020b00000204040003000000020504000277010102070101
-020301010201010102080101020301010201010102020101020101010202010102010101
-020201000201010102090101020101010201010102010101020201000200010102010101
-020101010203010102010101020101010202010102010101020a01010202010102010101
-020201010201010102020101020101010202010002260100020201020201010102010101
-020101010200010202010101020201000201010102090101020101010201010102010101
-020101010202010102020101020101010202010102070101020001010202010102000102
-020201010202010102010101020201010201010102010101020201000205010102050101
-020101010200010102000102020201010200010202010101020001010202010002010101
-020201010201010102000101020001010202010002010101020401010201010102020100
-020401010205010102010101020101010202010102010101020101010204010102010101
-0202010002760103020b0000020500000206040002770105020301010204010302090101
-020401020200010102010104020301010202010302020101020901010202010302030103
-02020102020001010201010202010101020201030203010102010101020b010202010102
-020001010201010402030101020201030227010002030101020201030203010102000101
-020201030202010102090101020101010201010102020102020001010201010102020101
-020101010203010502050101020301010200010102020101020201010201010102020101
-020101010202010302020104020201040202010102010101020001010203010102000101
-020101010201010302030102020001010201010102000101020101030202010102040101
-020201030201010402020104020301030203010102010101020101010200010402030103
-02770103020b0000020d040002fc010602a201010201010102ff022a0103020b0000020d
-040002ff02a7010302ff022b0103020b0000020d040002ff02ff02d70103020c040d02ff
-02ff02d8010302ff02ff02f3010302ff02ff02f30103020200ff00ff00ec040002020103
-0202000004ff04ff04ec0202010302ff02ff02f30103020200ff00ff00ed020201030202
-00ff00ff00ec0800020201030202000106ff06ff06e90801020201030202000106ff06ff
-06e90801020201030202000106ff06ff06e90801020201030202000106ff06ff06e90801
-020201030202000106ff06ff06e908010202010302020001060b07040604070006030702
-061f07040610070206200702060b070006060700062d0700060207000604070006ff06fa
-07000602070006090702061308010202010302020001060b0700060f0700062107000614
-0700061f070006020700060a0700063507000602070006ff06ff0600070006020700060b
-0700061308010202010302020001060b0700060607020605070006030702061a07000604
-070206030702060507000603070206180700060207000601070006000701060207040602
-070206030702060207000600070106030702061807000602070006020702060307020602
-07000602070006ff06eb07000602070006020702060507000602070006000701060c0801
-0202010302020001060b0700060807000605070006020700060207000619070006030700
-060207000601070006020700060407000602070006020700061707000602070006010701
-060107000603070006060700060207000602070006010701060107000601070006020700
-0618070006000700060507000602070006020700060107000602070006ff06eb07000602
-07000601070006020700060407000602070106010700060b08010202010302020001060b
-070306050700060507000602070006020700061907000603070006020700060107000602
-07000604070006020700061b070006020700060107000602070006030700060607000602
-070006020700060107000602070006010700061c07000600070006050700060207000602
-070006010700060007000600070006ff06eb070406010700060207000604070006020700
-06020700060b08010202010302020001060b070006080700060507000602070406190700
-060307000602070006010700060207000604070006030702061807000602070006010700
-060207000603070006060700060207000602070006010700060207000602070206190700
-06000700060507000602070406010700060007000600070006ff06eb0700060207000601
-0704060407000602070006020700060b08010202010302020001060b0700060807000605
-070006020700061d07000603070006020700060107000602070006040700060607000617
-070006020700060107000602070006030700060607000602070006020700060107000602
-07000605070006190700060607000602070006050700060007000600070006ff06eb0700
-0602070006010700060807000602070006020700060b08010202010302020001060b0700
-060807000605070006020700060207000619070006030700060207000601070006020700
-060407000602070006020700061707000602070006010701060107000603070006060700
-060207000602070006010700060207000601070006020700061907000606070006020700
-0602070006010700060007000600070006ff06eb07000602070006010700060207000604
-07000602070106010700060b08010202010302020001060b070006080700060507000603
-0702061a0700060407020603070206050700060307020619070206020700060007010605
-07010604070006030702060207000602070006020702061a070006060700060307020603
-07000600070006ff06ec07000602070006020702060507000602070006000701060c0801
-0202010302020001067d070006ff06ff06590700060f08010202010302020001060a0706
-062a07060631070606000700063d070606ff06fe0706060e0700060f0801020201030202
-0001060a0706062a07060631070606000700063d070606ff06fe0706060e0700060f0801
-020201030202000106ff06ff06e90801020201030202000106ff06ff06e9080102020103
-0202000106ff06ff06e90801020201030202000108ff08ff08eb020201030202000008ff
-08ff08ec02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202010302020603
-0016061600160616004406160016061600160616001606ff06be02020103020206030015
-080006160015080006160015080000150800001508000616001508000616001508000616
-0015080006ff06be02020103020206030001061208010616000106120801061600010612
-080100010612080100010612080106160001061208010616000106120801061600010612
-080106ff06be020201030202060300010612080106160001061208010616000106120801
-000106120801000106120801061600010612080106160001061208010616000106120801
-06ff06be0202010302020603000106120801061600010603070206030702060408010616
-000106120801000106120801000106120801061600010612080106160001061208010616
-00010612080106ff06be0202010302020603000106080702060608010616000106030702
-060307020604080106160001061208010001061208010001061208010616000106050704
-0607080106160001060707010608080106160001060707030606080106ff06be02020103
-020206030001060b0701060408010616000106020704060107040603080106160001060e
-0700060208010001060e070006020801000106020700060e080106160001060307080605
-080106160001060607030607080106160001060507070604080106ff06be020201030202
-06030001060d070006000700060108010616000106020700060107010601070006010701
-0603080106160001060e0700060208010001060e070006020801000106020700060e0801
-061600010602070a06040801061600010606070306070801061600010604070306010703
-0603080106ff06be02020103020206030001060207020608070106010801061600010601
-070d0602080106160001060b07000601070006020801000106020700060a070006020801
-00010602070006010700060b080106160001060207030602070306040801061600010607
-0701060808010616000106040702060307020603080106ff06be02020103020206030001
-060107080602070206010801061600010600070006000703060007020600070406010801
-06160001060b07000601070006020801000106020700060a070006020801000106020700
-06010700060b080106160001060107030604070306030801061600010612080106160001
-06040702060307020603080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106080700060107000601
-070006020801000106020700060407000604070006020801000106020700060107000601
-070006080801061600010601070206030707060108010616000106050704060708010616
-000106050701060207020604080106ff06be020201030202060300010601070906060801
-061600010600070006000703060007020600070406010801061600010608070006010700
-060107000602080100010602070006040700060407000602080100010602070006010700
-060107000608080106160001060107020604070506020801061600010606070306070801
-06160001060907020605080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106050700060107000601
-070006010700060208010001060207000604070006010700060107000602080100010602
-070006010700060107000601070006050801061600010601070206050703060308010616
-0001060707020607080106160001060807020606080106ff06be02020103020206030001
-0601070d0602080106160001060007000600070706000704060108010616000106050700
-060107000601070006010700060208010001060207000604070006010700060107000602
-080100010602070006010700060107000601070006050801061600010601070306050701
-0604080106160001060707020607080106160001060707020607080106ff06be02020103
-020206030001060107030607070006030801061600010600070006000704060107000600
-070406010801061600010602070006010700060107000601070006010700060208010001
-060207000601070006010700060107000601070006020801000106020700060107000601
-07000601070006010700060208010616000106020703060b080106160001060707020607
-080106160001060707020607080106ff06be020201030202060300010601070206070700
-060408010616000106000706060107060601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106020709
-06050801061600010607070206070801061600010612080106ff06be0202010302020603
-000106010701060707000605080106160001060007000600070206050700060007020601
-080106160001060207000601070006010700060107000601070006020801000106020700
-060107000601070006010700060107000602080100010602070006010700060107000601
-070006010700060208010616000106030707060608010616000106060704060608010616
-0001060707020607080106ff06be02020103020206030001060107090606080106160001
-060007000600070206050700060007020601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106050704
-0607080106160001060507060605080106160001060707020607080106ff06be02020103
-020206030001061208010616000106000704060507040601080106160001061208010001
-0612080100010612080106160001061208010616000106120801061600010612080106ff
-06be02020103020206030001061208010616000106120801061600010612080100010612
-080100010612080106160001061208010616000106120801061600010612080106ff06be
-020201030202060300010612080106160001061208010616000106120801000106120801
-00010612080106160001061208010616000106120801061600010612080106ff06be0202
-010302020603000108140616000108140616000108140001081400010814061600010814
-06160001081406160001081406ff06be0202010302020603000008150616000008150616
-00000815000008150000081506160000081506160000081506160000081506ff06be0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed020201030202060301ff01ff01e5
-06030202010302020603010000ff00ff00cf010000120100060302020103020206030100
-00ff00ff00cf010000110800010006030202010302020603010000ff00ff00cf01000001
-060e0801010006030202010302020603010000ff00ff00cf01000001060e080101000603
-0202010302020603010000ff00ff00cf01000001060e0801010006030202010302020603
-010000ff00ff00cf01000001060e0801010006030202010302020603010000ff00ff00cf
-01000001060e0801010006030202010302020603010000ff00ff00cf01000001060e0801
-010006030202010302020603010000ff00ff00cf01000001060e08010100060302020103
-02020603010000ff00ff00cf010000010601010a06010801010006030202010302020603
-010000ff00ff00cf010000010602010806020801010006030202010302020603010000ff
-00ff00cf010000010603010606030801010006030202010302020603010000ff00ff00cf
-010000010604010406040801010006030202010302020603010000ff00ff00cf01000001
-0605010206050801010006030202010302020603010000ff00ff00cf0100000106060100
-06060801010006030202010302020603010000ff00ff00cf01000001060e080101000603
-0202010302020603010000ff00ff00cf01000001060e0801010006030202010302020603
-010000ff00ff00cf01000001060e0801010006030202010302020603010000ff00ff00cf
-01000001060e0801010006030202010302020603010000ff00ff00cf01000001060e0801
-010006030202010302020603010000ff00ff00cf01000001060e08010100060302020103
-02020603010000ff00ff00cf01000001060e0801010006030202010302020603010000ff
-00ff00cf010000010810010006030202010302020603010000ff00ff00cf010000000811
-01000603020201030202060301ff01ff01e5060302020103020206ff06ff06ed02020103
-020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103
-020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103
-020206ff06ff06ed020201030202060301ff01ff01e506030202010302020603010006ff
-06ff06970100064a01000603020201030202060301000663010506ff06ff062d0100064a
-01000603020201030202060301000662010706ff06ff062c0100064a0100060302020103
-020206030100066101020603010206ff06ff062b0100064a010006030202010302020603
-0100066101010605010106ff06ff062b0100064a01000603020201030202060301000661
-01020603010206ff06ff062b0100064a01000603020201030202060301000662010706ff
-06ff062c0100064a01000603020201030202060301000663010506ff06ff062d0100064a
-01000603020201030202060301000665010106ff06ff062f0100064a0100060302020103
-0202060301000665010106ff06ff062f0100064a01000603020201030202060301000665
-010106ff06ff062f0100064a01000603020201030202060301000665010106ff06ff062f
-0100064a01000603020201030202060301000665010106ff06ff062f0100064a01000603
-020201030202060301000665010106ff06ff062f0100064a010006030202010302020603
-0100066101010600010206ff06ff062f0100064a01000603020201030202060301000661
-01010600010206ff06ff062f0100064a01000603020201030202060301000661010506ff
-06ff062f0100064a01000603020201030202060301000661010506ff06ff062f0100064a
-0100060302020103020206030100066101020600010106ff06ff062f0100064a01000603
-0202010302020603010006ff06ff06970100064a01000603020201030202060301ff01ff
-0199064a0100060302020103020206030100063500610b04005f0b04005f0b04005f0b04
-005f0b04005f0b0400010100060c0812062a010006030202010302020603010006350060
-08000b030100005e08000b030100005e08000b030100005e08000b030100005e08000b03
-0100005e08000b03010000010100060c08110000062a0100060302020103020206030100
-06350001065d08010b0101020001065b08010b0101020001065b08010b0101020001065b
-08010b0101020001065b08010b0101020001065b08010b01010200010100060c08010010
-062a010006030202010302020603010006350001062c0100062f08010b0101020001062a
-0102062d08010b0101020001062a0102062d08010b0101020001062c0100062d08010b01
-0102000106290104062c08010b0101020001062b0102062c08010b01010200010100060c
-0801000d08000001062a010006030202010302020603010006350001062a0102062f0801
-0b01010200010629010006020100062c08010b01010200010629010006020100062c0801
-0b0101020001062b0101062d08010b010102000106290100063008010b0101020001062a
-0100062f08010b01010200010100060c08010001060a08010001062a0100060302020103
-02020603010006350001062c0100062f08010b01010200010629010006020100062c0801
-0b0101020001062d0100062c08010b0101020001062a010006000100062d08010b010102
-000106290100063008010b010102000106290100063008010b01010200010100060c0801
-0001060a08010001062a010006030202010302020603010006350001062c0100062f0801
-0b01010200010629010006020100062c08010b0101020001062d0100062c08010b010102
-0001062a010006000100062d08010b010102000106290100063008010b01010200010629
-0100063008010b01010200010100060c08010001060a08010001062a0100060302020103
-02020603010006350001062c0100062f08010b0101020001062c0100062d08010b010102
-0001062b0101062d08010b01010200010629010006010100062d08010b01010200010629
-0103062d08010b010102000106290103062d08010b01010200010100060c08010001060a
-08010001062a010006030202010302020603010006350001062c0100062f08010b010102
-0001062b0100062e08010b0101020001062d0100062c08010b0101020001062801000602
-0100062d08010b0101020001062d0100062c08010b01010200010629010006020100062c
-08010b01010200010100060c08010001060a08010001062a010006030202010302020603
-010006350001062c0100062f08010b0101020001062a0100062f08010b0101020001062d
-0100062c08010b010102000106280105062c08010b0101020001062d0100062c08010b01
-010200010629010006020100062c08010b01010200010100060c08010001060a08010001
-062a010006030202010302020603010006350001062c0100062f08010b01010200010629
-010006020100062c08010b01010200010629010006020100062c08010b0101020001062c
-0100062d08010b01010200010628010006030100062c08010b0101020001062901000602
-0100062c08010b01010200010100060c08010001060a08010001062a0100060302020103
-02020603010006350001062a0104062d08010b010102000106290104062c08010b010102
-0001062a0102062d08010b0101020001062b0102062c08010b010102000106290103062d
-08010b0101020001062a0102062d08010b01010200010100060c08010001060a08010001
-062a010006030202010302020603010006350001065d08010b0101020001065b08010b01
-01020001065b08010b0101020001065b08010b0101020001065b08010b0101020001065b
-08010b01010200010100060c08010001060a08010001062a010006030202010302020603
-010006350001065d08010b0101020001065b08010b0101020001065b08010b0101020001
-065b08010b0101020001065b08010b0101020001065b08010b01010200010100060c0801
-0001060a08010001062a010006030202010302020603010006350001065d08010b010102
-0001065b08010b0101020001065b08010b0101020001065b08010b0101020001065b0801
-0b0101020001065b08010b0101020001010006070100060308010001060a08010001062a
-010006030202010302020603010006350001065d08010b0101020001065b08010b010102
-0001065b08010b0101020001065b08010b0101020001065b08010b0101020001065b0801
-0b0101020001010006060101060308010001060a08010001062a01000603020201030202
-0603010006350001065d08010b0101020001065b08010b0101020001065b08010b010102
-0001065b08010b0101020001065b08010b0101020001065b08010b010102000101000605
-010006000100060308010001080c0001062a010006030202010302020603010006350001
-065d08010b0101020001065b08010b0101020001065b08010b0101020001065b08010b01
-01020001065b08010b0101020001065b08010b010102000101000607010006030801000d
-08000001062a010006030202010302020603010006350001085f0b0101020001085d0b01
-01020001085d0b0101020001085d0b0101020001085d0b0101020001085d0b0101020001
-010006070100060308010001060a08010001062a01000603020201030202060301000635
-000008600b0001030000085e0b0001030000085e0b0001030000085e0b0001030000085e
-0b0001030000085e0b00010300000800010006070100060308010001060a08010001062a
-010006030202010302020603010009360063010000630100006301000063010000630100
-006301000002010006070100060308010001060a08010001062a01000603020201030202
-0603010009350c0000630100006301000063010000630100006301000063010000020100
-06070100060308010001060a08010001062a010006030202010302020603010009010532
-0c0100630100006301000063010000630100006301000063010000020100060501040601
-08010001060a08010001062a0100060302020103020206030100090105320c0100630100
-006301000063010000630100006301000063010000020100060c08010001060a08010001
-062a010006030202010302020603010009010517010005190c0100630100006301000063
-010000630100006301000063010000020100060c08010001060a08010001062a01000603
-0202010302020603010009010515010205190c01001601020003010200420100000e0100
-00230100000b010200030102001801000063010000630100006301000063010000020100
-060c08010001060a08010001062a01000603020201030202060301000901051701000519
-0c01001801000005010000420100000e010000230100000d010000050100001801000063
-010000630100006301000063010000020100060c08010001060a08010001062a01000603
-0202010302020603010009010517010005190c01000f0102000501000005010000030102
-003b0100000e010000000101000301020002010000000101000201000000010100030102
-000201040001010000020100000401000005010000180100006301000063010000630100
-0063010000020100060c08010001060a08010001062a0100060302020103020206030100
-09010517010005190c01000e01000002010000040100000501000002010000020100003a
-0100000e0101000101000001010000020100000101010001010000010101000101000001
-010000020100000301000003010000020100000401000005010000180100006301000063
-0100006301000063010000020100060c08010001060a08010001062a0100060302020103
-02020603010009010517010005190c01000e010000020100000401000005010000020100
-00020100003a0100000e0100000201000001010000020100000101000005010000020100
-000101000007010000030100000201000004010000050100001801000063010000630100
-006301000063010000020100060c08010001060a08010001062a01000603020201030202
-0603010009010517010005190c01000e010000020100000401000005010000020104003a
-0100000e0100000201000001010000020100000101000005010000020100000201020004
-010000030100000201000004010000050100001801000063010000630100006301000063
-010000020100060c08010001080c0001062a010006030202010302020603010009010517
-010005190c01000e010000020100000401000005010000020100003e0100000e01000002
-010000010100000201000001010000050100000201000005010000030100000301000002
-01000004010000050100001801000063010000630100006301000063010000020100060c
-08010000080d0001062a010006030202010302020603010009010515010405170c01000e
-01000002010000040100000501000002010000020100003a0100000e0100000201000001
-010000020100000101000005010000020100000101000002010000030100000301000001
-01010004010000050100001801000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c01000f010200050100
-0005010000030102003b0100000e01000002010000020102000201000005010000020100
-000201020005010100020101000001000004010000050100001801000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-090105320c0100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-0103020206030100090105320c0100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a0100060302020103020206030100090105320c010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010009010c3400630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a010006030202010302020603010009000c3501ff01ff0161060c0801
-0a0e0001062a010006030202010302020603010009360063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010009350c0000630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-0103020206030100090105320c0100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105160102
-05180c0100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a01000603020201030202060301000901051501000502010005170c010026
-01000003010200030102002d010000160102004901000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105150100
-0502010005170c01002d010000050100002d010000180100004901000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-0901051501000502010005170c01000f0101000001000001010000020100000101000000
-01010003010200050100000501000003010200260100000f010200050100000201000002
-010000020102000301020003010200020100000001010026010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-0518010005180c01000e0100000101010001010000020100000101010001010000040100
-0005010000050100000201000002010000250100000e0100000201000004010000020100
-000201000001010000020100000101000002010000010100000201000001010100010100
-002501000063010000630100006301000063010000020100060c08010a0e0001062a0100
-06030202010302020603010009010517010005190c01000e010000020100000101000002
-010000010100000201000004010000050100000501000006010000250100000e01000008
-010000020100000201000001010000050100000501000002010000010100000201000025
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-02020103020206030100090105160100051a0c01000e0100000201000001010000020100
-00010100000201000004010000050100000501000003010300250100000f010200050100
-000201000002010000020102000301020002010400010100000201000025010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000901051501000502010005170c01000e01000002010000010100000201000001
-010000020100000401000005010000050100000201000002010000250100001201000004
-010000020100000201000005010000050100000101000005010000020100002501000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-02020603010009010515010405170c01000e010000010101000101000001010100010100
-00020100000401000005010000050100000201000002010000250100000e010000020100
-000401000002010000010101000101000002010000010100000201000001010000020100
-0001010000020100002501000063010000630100006301000063010000020100060c0801
-0a0e0001062a0100060302020103020206030100090105320c01000f0101000001000002
-01010000010000010100000201000004010000050100000501000003010300250100000f
-010200050100000301010000010000020102000301020003010200020100000201000025
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-02020103020206030100090105320c0100120100004f0100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-090105320c01000e010000020100004f0100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-000f010200500100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a0100060302020103020206030100090105320c0100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100090105320c01006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a010006030202010302020603010009010c3400630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-06030202010302020603010009000c3501ff01ff0161060c08010a0e0001062a01000603
-020201030202060301000936006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a010006030202010302020603010009350c0000630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105320c01006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-05320c0100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010009010516010205180c01006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-020201030202060301000901051501000502010005170c0100630100000e010000530100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010009010519010005170c0100630100000e010000530100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010009010519010005170c01000f01020002010000000101000201000000010100030102
-003b0100000e010000000101000201000000010100030102000201010000010000020101
-0000010000030102002d01000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010009010517010105180c01000e01000002
-0100000101010001010000010101000101000001010000020100003a0100000e01010001
-010000010101000101000001010000020100000101000000010000000100000101000000
-0100000001000001010000020100002c0100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010519010005170c01
-001201000001010000020100000101000002010000050100003a0100000e010000020100
-000101000005010000020100000101000000010000000100000101000000010000000100
-00050100002c01000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010519010005170c01000f0103000101000002
-0100000101000002010000020103003a0100000e01000002010000010100000501000002
-010000010100000001000000010000010100000001000000010000020103002c01000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-0202060301000901051501000502010005170c01000e0100000201000001010000020100
-00010100000201000001010000020100003a0100000e0100000201000001010000050100
-000201000001010000000100000001000001010000000100000001000001010000020100
-002c01000063010000630100006301000063010000020100060c08010a0e0001062a0100
-06030202010302020603010009010516010205180c01000e010000020100000101000002
-010000010100000201000001010000020100003a0100000e010100010100000101000005
-010000020100000101000000010000000100000101000000010000000100000101000002
-0100002c01000063010000630100006301000063010000020100060c08010a0e0001062a
-0100060302020103020206030100090105320c01000f0103000101000002010000010100
-0002010000020103003a0100000e01000000010100020100000601020002010000000100
-0000010000010100000001000000010000020103002c0100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010532
-0c0100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105320c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105320c010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a0100060302020103020206030100090105320c0100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105320c01006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-0c3400630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a010006030202010302020603010009000c3501ff01ff0161060c08010a0e0001
-062a01000603020201030202060301000936006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000935
-0c0000630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105320c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105320c010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010518010005180c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010517010105180c0100170100000601000042
-010000150100001c0100000b010200030102001801000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105160100
-0500010005180c0100170100004a010000150100001c0100000d01000005010000180100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-01030202060301000901051601000500010005180c01000f010200020104000201020002
-0100000001010003010200340100000f0102000201000001010000030102000201000000
-010100030102000201040001010000020100000401000005010000180100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-01000901051501000501010005180c01000e010000020100000301000006010000020101
-00010100000101000002010000330100000e010000020100000101000000010000030100
-000201000001010100010100000101000002010000030100000301000002010000040100
-00050100001801000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000901051401000502010005180c01000e01000007
-01000006010000020100000201000005010000330100000e010000050101000801000001
-010000020100000101000007010000030100000201000004010000050100001801000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-02020603010009010514010505170c01000f010200040100000601000002010000020100
-0002010300330100000f0102000201010005010300010100000201000002010200040100
-000301000002010000040100000501000018010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000901051801000518
-0c0100120100000301000006010000020100000201000001010000020100003301000012
-010000010100000001000003010000020100000101000002010000050100000301000003
-010000020100000401000005010000180100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010517010205170c01
-000e01000002010000030100000601000002010000020100000101000002010000330100
-000e01000002010000010100000101000002010000020100000101000002010000010100
-000201000003010000030100000101010004010000050100001801000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-090105320c01000f0102000501010004010000020100000201000002010300330100000f
-010200020100000201000002010300010100000201000002010200050101000201010000
-01000004010000050100001801000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-0103020206030100090105320c0100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a0100060302020103020206030100090105320c010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-0100090105320c0100630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a010006030202010302020603010009010c340063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010009000c3501ff01ff0161060c08010a0e0001062a0100060302020103
-020206030100093600630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a010006030202010302020603010009350c000063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-0103020206030100090105320c0100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010515010405170c0100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100090105150100051b0c01000e0100000e010000140100002d010000320102
-002d01000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105150100051b0c01000e0100000e0100004301000034
-0100002d01000063010000630100006301000063010000020100060c08010a0e0001062a
-0100060302020103020206030100090105150100051b0c01000e01000001010000030102
-0002010400020102000201000000010100030102000201000000010100030102001f0100
-000e01000002010000010100000001010002010000000101000301020003010200050100
-00030102002601000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010515010305180c01000e0100000001000003
-010000020100000301000003010000020100000101010001010000040100000201010001
-01000001010000020100001e0100000e0100000201000001010100010100000101010001
-010000010100000201000001010000020100000401000002010000020100002501000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-02020603010009010519010005170c01000e010100080100000301000007010000010100
-00080100000201000002010000050100001e0100000e0100000201000001010000020100
-000101000002010000010100000901000004010000060100002501000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-09010519010005170c01000e010100050103000301000004010300010100000801000002
-01000002010000020103001e0100000e0100000201000001010000020100000101000002
-010000020102000301030004010000030103002501000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105140100
-0503010005170c01000e0100000001000003010000020100000301000003010000020100
-000101000008010000020100000201000001010000020100001e0100000e010000020100
-000101000002010000010100000201000005010000010100000201000004010000020100
-00020100002501000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010515010305180c01000e0100000101000002
-010000020100000301000003010000020100000101000008010000020100000201000001
-010000020100001e0100000e010000010101000101010001010000010101000101000001
-010000020100000101000002010000040100000201000002010000250100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-0100090105320c01000e0100000201000002010300040101000201030001010000080100
-000201000002010000020103001e0100000f010100000100000101000000010100020100
-000001010003010200030103000401000003010300250100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010532
-0c0100630100001501000005010000450100006301000063010000630100006301000002
-0100060c08010a0e0001062a0100060302020103020206030100090105320c0100630100
-0015010000050100004501000063010000630100006301000063010000020100060c0801
-0a0e0001062a0100060302020103020206030100090105320c0100630100001501000005
-0100004501000063010000630100006301000063010000020100060c08010a0e0001062a
-0100060302020103020206030100090105320c0100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-090105320c0100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a010006030202010302020603010009010c3400630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-02020603010009000c3501ff01ff0161060c08010a0e0001062a01000603020201030202
-06030100093600630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a010006030202010302020603010009350c0000630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100090105320c01006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a0100060302020103020206030100090105320c010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010009010517010205170c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105160100051a0c0100110100001a010100040100002d010000160102000c
-010000020100003701000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105150100051b0c01002c010000350100
-0018010000100100003701000063010000630100006301000063010000020100060c0801
-0a0e0001062a0100060302020103020206030100090105150100051b0c01000f01020003
-010200030102000301020004010000040102000201000000010100030102001f0100000f
-010200050100000201000002010000020102000201000001010000340100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010009010515010305180c01001101000002010000020100000101000002010000010100
-00020100000101040004010000020101000101000001010000020100001e0100000e0100
-000201000004010000020100000201000004010000020100000001000035010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000901051501000502010005170c01001101000002010000020100000101000005
-010000020100000301000006010000020100000201000001010000020100001e01000012
-010000040100000201000002010000040100000201010036010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-051501000502010005170c01001101000002010000020100000201020002010400030100
-00060100000201000002010000010104001e0100000f0103000401000003010000000100
-0005010000020101003601000063010000630100006301000063010000020100060c0801
-0a0e0001062a01000603020201030202060301000901051501000502010005170c010011
-010000020100000201000005010000010100000701000006010000020100000201000001
-010000220100000e01000002010000040100000301000000010000050100000201000000
-0100003501000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010009010516010205180c01001101000002010000020100
-000101000002010000010100000201000003010000060100000201000002010000010100
-00020100001e0100000e0100000201000004010000040100000601000002010000010100
-003401000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105320c01001101000003010200030102000301020004
-010000060100000201000002010000020102001f0100000f010300040100000401000006
-01000002010000020100003301000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c010011010000500100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105320c01000e01000001010000500100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100090105320c01000f01010051010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010532
-0c0100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105320c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-0603010009010c3400630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a010006030202010302020603010009000c3501ff01ff0161060c
-08010a0e0001062a01000603020201030202060301000936006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-0603010009350c0000630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100090105320c01006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-02020103020206030100090105320c010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010515
-010405170c0100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000901051501000502010005170c01
-0011010100130100000b01000002010000290100002c0100000b010200030102001f0100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010009010518010005180c010010010000150100000f010000290100002c
-0100000d010000050100001f01000063010000630100006301000063010000020100060c
-08010a0e0001062a010006030202010302020603010009010518010005180c0100100100
-000301000000010100030102000301010000010000010100000001010003010200020100
-0001010000260100000e0100000001010003010200020100000001010002010000000101
-0002010400010100000201000004010000050100001f0100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010518
-010005180c01000e01040001010100010100000101000002010000010100000101010001
-01010001010000040100000201000000010000270100000e010100010100000101000002
-010000010101000101000001010100010100000301000003010000020100000401000005
-0100001f01000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010009010518010005180c01001001000003010000050100
-00020100000101000002010000010100000801000002010100280100000e010000020100
-000101000002010000010100000501000007010000030100000201000004010000050100
-001f01000063010000630100006301000063010000020100060c08010a0e0001062a0100
-06030202010302020603010009010517010005190c010010010000030100000501040001
-01000002010000010100000801000002010100280100000e010000020100000101000002
-010000010100000501000007010000030100000201000004010000050100001f01000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-02020603010009010517010005190c010010010000030100000501000005010000020100
-0001010000080100000201000000010000270100000e0100000201000001010000020100
-00010100000501000007010000030100000201000004010000050100001f010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-0603010009010517010005190c0100100100000301000005010000020100000101000001
-01010001010000080100000201000001010000260100000e010000020100000101000002
-010000010100000501000007010000030100000101010004010000050100001f01000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100090105320c01001001000003010000060102000301010000010000010100
-00080100000201000002010000250100000e010000020100000201020002010000050100
-0008010100020101000001000004010000050100001f0100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010532
-0c0100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105320c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105320c010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a0100060302020103020206030100090105320c0100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100090105320c01006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-0c3400630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a010006030202010302020603010009000c3501ff01ff0161060c08010a0e0001
-062a01000603020201030202060301000936006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000935
-0c0000630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100090105320c01006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105320c010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010516010205180c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000901051501000502010005170c0100630100000e
-0100000f0100000b01000006010000100100001b01000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105150100
-0502010005170c0100630100000e0100001c010000180100001b01000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-0901051501000502010005170c01000e0100000001010003010200020100000001010042
-0100000e0100000101000002010000000101000301020003010200020104000201020002
-010000000101000301020002010000000101000301020002010000000101000301010000
-0100000201000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010009010516010205180c01000e01010001010000010100
-00020100000101010001010000410100000e010000000100000301010001010000040100
-000201000002010000030100000601000002010100010100000101000002010000010101
-000101000001010000020100000101010001010000010100000101010002010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000901051501000502010005170c01000e01000002010000010100000201000001
-010000450100000e01010004010000080100000201000007010000060100000201000002
-010000010100000201000001010000020100000101000002010000010100000501000002
-0100000201000063010000630100006301000063010000020100060c08010a0e0001062a
-01000603020201030202060301000901051501000502010005170c01000e010000020100
-000101040001010000450100000e01010004010000080100000301020004010000060100
-000201000002010000010104000101000002010000010104000101000005010000020100
-000201000063010000630100006301000063010000020100060c08010a0e0001062a0100
-0603020201030202060301000901051501000502010005170c01000e0100000201000001
-01000005010000450100000e010000000100000301000008010000060100000301000006
-010000020100000201000001010000050100000201000001010000050100000501000002
-0100000201000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010009010516010205180c01000e01010001010000010100
-000201000001010000450100000e01000001010000020100000801000002010000020100
-000301000006010000020100000201000001010000020100000101010001010000010100
-000201000001010000050100000101010002010000630100006301000063010000630100
-00020100060c08010a0e0001062a0100060302020103020206030100090105320c01000e
-010000000101000301020002010000450100000e01000002010000010100000801000003
-010200050101000401000002010000020100000201020002010000000101000301020002
-01000006010100000100000201000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c01000e010000530100
-005f0100000201000063010000630100006301000063010000020100060c08010a0e0001
-062a0100060302020103020206030100090105320c01000e010000530100005b01000002
-0100000201000063010000630100006301000063010000020100060c08010a0e0001062a
-0100060302020103020206030100090105320c01000e010000530100005c010200030100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-0103020206030100090105320c0100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009010c3400630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-09000c3501ff01ff0161060c08010a0e0001062a01000603020201030202060301000936
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a010006030202010302020603010009350c0000630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-090105320c0100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a0100060302020103020206030100090105320c010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010009010516010205180c01006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000901
-051501000502010005170c0100260100003b01000019010000170102002d010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000901051501000502010005170c01006301000019010000190100002d01000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-0202060301000901051501000502010005170c01000e0101000001000003010200020100
-00000101000301020003010200340100000f010200030101000001000002010200020100
-00000101000201000000010100050100000301020002010000000101001f010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000901051501000502010005170c01000e01000000010000000100000101000002
-0100000101010001010000040100000201000002010000330100000e0100000201000001
-010000010101000101000002010000010101000101000001010100010100000401000002
-0100000201000001010100010100001e0100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010516010305170c01
-000e010000000100000001000005010000010100000801000006010000330100000e0100
-000201000001010000020100000101000002010000010100000201000001010000020100
-00040100000601000001010000020100001e010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000901051901000517
-0c01000e010000000100000001000002010300010100000801000003010300330100000e
-010000020100000101000002010000010104000101000002010000010100000201000004
-0100000301030001010000020100001e0100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010009010518010005180c01
-000e01000000010000000100000101000002010000010100000801000002010000020100
-00330100000e010000020100000101000002010000010100000501000002010000010100
-000201000004010000020100000201000001010000020100001e01000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-09010515010205190c01000e010000000100000001000001010000020100000101000008
-0100000201000002010000330100000e0100000201000001010000010101000101000002
-010000010100000201000001010100010100000401000002010000020100000101000002
-0100001e01000063010000630100006301000063010000020100060c08010a0e0001062a
-0100060302020103020206030100090105320c01000e0100000001000000010000020103
-00010100000801000003010300330100000f010200030101000001000002010200020100
-00020100000101000000010100050100000301030001010000020100001e010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-06030100090105320c0100630100002a0100003701000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100090105320c01
-00630100002a0100003701000063010000630100006301000063010000020100060c0801
-0a0e0001062a0100060302020103020206030100090105320c0100630100002a01000037
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-02020103020206030100090105320c010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010009010532
-0c0100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a010006030202010302020603010009010c340063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010009000c3501ff01ff0161060c08010a0e0001062a0100060302020103020206030100
-009a0100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000035080000630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006040102061508010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010611010206030100060201000614080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-000106130100060301000602010006140801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-061301000603010006020100061408010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006030100060201000614080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106130100
-060301000602010006140801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001061301000603
-010006020100061408010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006030100
-060201000614080100630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100000106110104060201020615
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-0632080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000108340063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a01000603020201030202060301000000083501ff01ff0161
-060c08010a0e0001062a0100060302020103020206030100009a01000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000035080000630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006050100061608010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010611010206030102
-0616080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006050100061608010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010613010006050100061608010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006050100061608010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010613010006050100061608010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006050100061608010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006050100
-0616080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010611010406010104061408010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-01000001083400630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000000083501ff01ff0161060c0801
-0a0e0001062a0100060302020103020206030100009a0100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-0035080000630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001061301000604
-01020615080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001061101020603010006020100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006030100060201000614
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000106130100060301000602010006140801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001061301000606010006150801006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-020201030202060301000001061301000605010006160801006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000001061301000604010006170801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-061301000603010006020100061408010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010611
-010406010104061408010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-0632080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010834006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000000
-083501ff01ff0161060c08010a0e0001062a0100060302020103020206030100009a0100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100003508000063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000001061301000604010206150801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-061101020603010006020100061408010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006070100061408010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006070100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006050101061508010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010613010006070100061408010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006070100061408010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010613010006030100060201000614080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-000106110104060201020615080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000108340063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-01000000083501ff01ff0161060c08010a0e0001062a0100060302020103020206030100
-009a0100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000035080000630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006060100061508010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010611010206050101061508010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006040100060001000615080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106130100
-060401000600010006150801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001061301000603
-010006010100061508010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006020100
-060201000615080100630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100000106130100060201050614
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000106130100060601000615080100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106110104060301020614080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000108340063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-01000603020201030202060301000000083501ff01ff0161060c08010a0e0001062a0100
-060302020103020206030100009a01000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000035080000630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-0632080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006030104061408010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010611010206030100061808010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006030100061808010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010613010006030100061808010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006030103061508010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006070100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006070100061408010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010613010006020100060301000614080100630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106110104060101030615080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000108340063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-01000603020201030202060301000000083501ff01ff0161060c08010a0e0001062a0100
-060302020103020206030100009a01000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000035080000630100
-006301000063010000630100006301000063010000020100060c08010a0e0001062a0100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-0632080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006050102061408010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010611010206040100061708010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006030100061808010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010613010006030100061808010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006030103061508010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006030100
-060201000614080100630100006301000063010000630100006301000063010000020100
-060c08010a0e0001062a0100060302020103020206030100000106130100060301000602
-01000614080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001061301000603010006020100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010611010406020102061508010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-01000001083400630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000000083501ff01ff0161060c0801
-0a0e0001062a0100060302020103020206030100009a0100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-0035080000630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001061301000603
-01040614080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001061101020603010006020100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006060100061508010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010613010006060100061508010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006060100061508010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-010000010613010006060100061508010063010000630100006301000063010000630100
-0063010000020100060c08010a0e0001062a010006030202010302020603010000010613
-010006050100061608010063010000630100006301000063010000630100006301000002
-0100060c08010a0e0001062a010006030202010302020603010000010613010006050100
-0616080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010611010406030100061608010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100060c08010a0e0001062a0100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100060c08010a0e0001062a010006030202010302020603
-01000001083400630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000000083501ff01ff0161060c0801
-0a0e0001062a0100060302020103020206030100009a0100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-0035080000630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001061301000604
-01020615080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001061101020603010006020100
-0614080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010613010006030100060201000614
-080100630100006301000063010000630100006301000063010000020100060c08010a0e
-0001062a0100060302020103020206030100000106130100060301000602010006140801
-00630100006301000063010000630100006301000063010000020100060c08010a0e0001
-062a01000603020201030202060301000001061301000604010206150801006301000063
-01000063010000630100006301000063010000020100060c08010a0e0001062a01000603
-020201030202060301000001061301000603010006020100061408010063010000630100
-0063010000630100006301000063010000020100060c08010a0e0001062a010006030202
-010302020603010000010613010006030100060201000614080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106130100060301000602010006140801006301000063010000630100
-00630100006301000063010000020100060c08010a0e0001062a01000603020201030202
-060301000001061101040602010206150801006301000063010000630100006301000063
-01000063010000020100060c08010a0e0001062a01000603020201030202060301000001
-0632080100630100006301000063010000630100006301000063010000020100060c0801
-0a0e0001062a010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100060c08010a0e0001062a0100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100060c08010a0e0001062a01000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100060c08010a0e0001062a
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100060c08010a0e0001062a0100060302020103020206030100
-00010632080100630100006301000063010000630100006301000063010000020100060c
-08010a0e0001062a01000603020201030202060301000001083400630100006301000063
-010000630100006301000063010000020100060c08010010062a01000603020201030202
-060301ff01ff0199060c08000011062a010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-020201030202060301000649010006ff06ff069801000603020201030202060301000648
-010106ff06ff06980100060302020103020206030100064701000600010006ff06ff0698
-01000603020201030202060301000649010006ff06ff0698010006030202010302020603
-01000649010006ff06ff069801000603020201030202060301000649010006ff06ff0698
-01000603020201030202060301000649010006ff06ff0698010006030202010302020603
-01000649010006ff06ff069801000603020201030202060301000647010406ff06ff0696
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-020206030100063708ff08ff0860064a0100060302020103020206030100063708ff08ff
-085f0000064a010006030202010302020603010006370801001d0aff0aff0a3e0001064a
-010006030202010302020603010006370801001c08000aff0aff0a3e0001064a01000603
-02020103020206030100063708010001060b08000000060b08010aff0aff0a3e0001064a
-0100060302020103020206030100063708010001060b08000000060b08010aff0aff0a3e
-0001064a0100060302020103020206030100063708010001060b08000000060b08010aff
-0aff0a3e0001064a0100060302020103020206030100063708010001060b08000000060b
-08010aff0aff0a3e0001064a0100060302020103020206030100063708010001060b0800
-0000060b08010aff0aff0a3e0001064a0100060302020103020206030100063708010001
-060b08000000060b08010aff0aff0a3e0001064a01000603020201030202060301000637
-08010001060b08000000060b08010aff0aff0a3e0001064a010006030202010302020603
-0100063708010001060b08000000060b08010aff0aff0a3e0001064a0100060302020103
-020206030100063708010001060b08000000060b08010aff0aff0a3e0001064a01000603
-02020103020206030100063708010001060b08000000060b08010aff0aff0a3e0001064a
-0100060302020103020206030100063708010001060b08000000060b08010aff0aff0a3e
-0001064a0100060302020103020206030100063708010001080c0000080d0aff0aff0a3e
-0001064a0100060302020103020206030100063708010000081c0aff0aff0a3e0001064a
-01000603020201030202060301000637080100ff00ff005e064a01000603020201030202
-060301000637080000ff00ff005f064a010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020101
-00040603010006ff06ff06e301000603000502020400060301ff01ff01e5060300000202
-040000000202040006ff06ff06ed00000202040000000202040006ff06ff06ed00000202
-040000000202040006ff06ff06ed00000202040000000202040006ff06ff06ed00000202
-0400000002020400000502ff02ff02e100060202040000000208040002ff02ff02e10000
-0208040000000208040002ff02ff02e100000208040000000208040001ff01ff01e10000
-020804000000040901ff01ff01e100000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 532 441
-%%EOF
diff --git a/lib/tv/doc/src/tv_table_sorted.gif b/lib/tv/doc/src/tv_table_sorted.gif
deleted file mode 100644
index fd69e3cc58..0000000000
--- a/lib/tv/doc/src/tv_table_sorted.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/doc/src/tv_table_sorted.ps b/lib/tv/doc/src/tv_table_sorted.ps
deleted file mode 100644
index 681b2f4d19..0000000000
--- a/lib/tv/doc/src/tv_table_sorted.ps
+++ /dev/null
@@ -1,1502 +0,0 @@
-%!PS-Adobe-3.0 EPSF-3.0
-%%Creator: (ImageMagick)
-%%Title: (/clearcase/otp/erts/lib/tv/doc/src/tv_table_sorted.eps)
-%%CreationDate: (Mon Mar 19 17:15:35 2001)
-%%BoundingBox: 0 0 532 441
-%%DocumentData: Clean7Bit
-%%LanguageLevel: 1
-%%Pages: 0
-%%EndComments
-
-%%BeginDefaults
-%%PageOrientation: Portrait
-%%EndDefaults
-
-%%BeginProlog
-%
-% Display a color image. The image is displayed in color on
-% Postscript viewers or printers that support color, otherwise
-% it is displayed as grayscale.
-%
-/buffer 512 string def
-/byte 1 string def
-/color_packet 3 string def
-/pixels 768 string def
-
-/DirectClassPacket
-{
- %
- % Get a DirectClass packet.
- %
- % Parameters:
- % red.
- % green.
- % blue.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/DirectClassImage
-{
- %
- % Display a DirectClass image.
- %
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { DirectClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayDirectClassPacket } image
- } ifelse
-} bind def
-
-/GrayDirectClassPacket
-{
- %
- % Get a DirectClass packet; convert to grayscale.
- %
- % Parameters:
- % red
- % green
- % blue
- % length: number of pixels minus one of this color (optional).
- %
- currentfile color_packet readhexstring pop pop
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/GrayPseudoClassPacket
-{
- %
- % Get a PseudoClass packet; convert to grayscale.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- color_packet 0 get 0.299 mul
- color_packet 1 get 0.587 mul add
- color_packet 2 get 0.114 mul add
- cvi
- /gray_packet exch def
- compression 0 gt
- {
- /number_pixels 1 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add def
- } ifelse
- 0 1 number_pixels 1 sub
- {
- pixels exch gray_packet put
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassPacket
-{
- %
- % Get a PseudoClass packet.
- %
- % Parameters:
- % index: index into the colormap.
- % length: number of pixels minus one of this color (optional).
- %
- currentfile byte readhexstring pop 0 get
- /offset exch 3 mul def
- /color_packet colormap offset 3 getinterval def
- compression 0 gt
- {
- /number_pixels 3 def
- }
- {
- currentfile byte readhexstring pop 0 get
- /number_pixels exch 1 add 3 mul def
- } ifelse
- 0 3 number_pixels 1 sub
- {
- pixels exch color_packet putinterval
- } for
- pixels 0 number_pixels getinterval
-} bind def
-
-/PseudoClassImage
-{
- %
- % Display a PseudoClass image.
- %
- % Parameters:
- % class: 0-PseudoClass or 1-Grayscale.
- %
- currentfile buffer readline pop
- token pop /class exch def pop
- class 0 gt
- {
- currentfile buffer readline pop
- token pop /depth exch def pop
- /grays columns 8 add depth sub depth mul 8 idiv string def
- columns rows depth
- [
- columns 0 0
- rows neg 0 rows
- ]
- { currentfile grays readhexstring pop } image
- }
- {
- %
- % Parameters:
- % colors: number of colors in the colormap.
- % colormap: red, green, blue color packets.
- %
- currentfile buffer readline pop
- token pop /colors exch def pop
- /colors colors 3 mul def
- /colormap colors string def
- currentfile colormap readhexstring pop pop
- systemdict /colorimage known
- {
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { PseudoClassPacket } false 3 colorimage
- }
- {
- %
- % No colorimage operator; convert to grayscale.
- %
- columns rows 8
- [
- columns 0 0
- rows neg 0 rows
- ]
- { GrayPseudoClassPacket } image
- } ifelse
- } ifelse
-} bind def
-
-/DisplayImage
-{
- %
- % Display a DirectClass or PseudoClass image.
- %
- % Parameters:
- % x & y translation.
- % x & y scale.
- % label pointsize.
- % image label.
- % image columns & rows.
- % class: 0-DirectClass or 1-PseudoClass.
- % compression: 0-RunlengthEncodedCompression or 1-NoCompression.
- % hex color packets.
- %
- gsave
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- x y translate
- currentfile buffer readline pop
- token pop /x exch def
- token pop /y exch def pop
- currentfile buffer readline pop
- token pop /pointsize exch def pop
- /Helvetica findfont pointsize scalefont setfont
- x y scale
- currentfile buffer readline pop
- token pop /columns exch def
- token pop /rows exch def pop
- currentfile buffer readline pop
- token pop /class exch def pop
- currentfile buffer readline pop
- token pop /compression exch def pop
- class 0 gt { PseudoClassImage } { DirectClassImage } ifelse
- grestore
-} bind def
-%%EndProlog
-%%Page: 1 1
-%%PageBoundingBox: 0 0 532 441
-userdict begin
-%%BeginData:
-DisplayImage
-0 0
-532.000000 441.000000
-12
-760 630
-1
-0
-0
-16
-ffffff
-000000
-d8d8d8
-c2c2c2
-6b6b6b
-ff0000
-d9d9d9
-b22222
-828282
-00ff00
-ffda00
-ffff80
-c3c3c3
-7f7f7f
-998300
-000000
-000a01ff01ff01e1000b0208040001ff01ff01e100000208040000000208040002ff02ff
-02e1000002080400000002080400020000ff00ff00de0400020000000208040000000202
-04060200000004ff04ff04de020000000405020204000000020204000209000d02ff02ff
-02d500000202040000000202040002080000020d040002a501010206010102150101021e
-0101022901010206010102430101022a010102260101023201010233010102ae00000202
-040000000202040002080000020d04000277010502000107020101030206010702090101
-02060101021501010219010002030101021c0100020b010102060101022e010202020100
-020d0101022a0101020c0104021401010232010102160100021b010102ae000002020400
-00000202040002080000020d04000277010102070101020301010201010102080101020c
-010102060101021501010218010102210101020b010102060101022e010202020100020d
-01010238010102020101024801010215010102cc00000202040000000202040002080000
-0202040602030400027701010207010102030101020c0101020401030203010102000101
-020301010202010302020101020901010202010302030103020201030201010402010101
-020201030203010102000101020a01040201010302030101020001010203010102020103
-022701000200010102010100020201030203010402020103020201010209010102000101
-020101010203010302030101020201010200010102020101020101030202010402020101
-020101010202010102020101020001010203010102000101020301030203010402020104
-020501040202010102010101020501030201010402000101020101010204010302020101
-020001010201010102020103020201040202010402020103020301010200010102060104
-020201030274000002020400000004030208000002020400030400000203040002770101
-0207010102030102020b0101020301010201010102020102020001010202010102010101
-020101010201010102090101020101010201010102010101020101010200010102010101
-020101010203010102010101020101010202010202000101020a01010202010102010101
-020201020200010102020101020101010201010102260100020001010201010002010101
-020101010201010102010101020101010201010102010101020901020200010202000101
-020101010201010102020101020201020200010102010101020001010200010102010101
-020101010202010102010101020201010202010202000101020201020200010102010101
-020101010201010102050101020801010201010102020101020101010204010102010101
-020101010202010102010101020301010201010102010101020001010201010102010101
-020101010200010102050101020501010201010102020102020001010204010102050101
-020101010273000004030101020b00000203040003020000020404000277010402040101
-0204010302090101020701010202010102010101020201010201010102010101020d0101
-020101010201010102010101020801010201010102030101020101010201010102020101
-02010101020a010102060101020201010201010102020101020101010201010102260100
-0200010202000100020101010201010102010101020101010201010102010101020d0101
-020101010201010102050101020201010202010102010101020101010200010102000101
-020101010201010102020101020101010202010102020101020101010202010102010101
-020101010201010102010102020401020207010102010101020201010201010102040101
-020101010201010102030101020001000204010102010101020101020203010102010101
-020401020204010202040101020101010202010102010101020401020204010102010101
-02760103020b000002030400030200000204040002770101020701010206010202080101
-0204010402020101020101010202010102010105020d0101020101010201010102010101
-02050104020101010203010102010101020101010202010102010101020a010102030104
-020201010201010102020101020101050226010002010101020001000201010102010101
-020101010201010102010105020d01010201010102010101020201040202010102020101
-020101010201010102000101020001010201010102010101020201010201010102020101
-020201010201010102020101020101010201010502020103020301030205010102010101
-020201010201010102040105020101010204010102050105020101010204010102010101
-020501030203010302020101020101010202010102010101020501030202010502760103
-020b00000204040003000000020504000277010102070101020701010208010102030101
-020101010202010102010101020201010201010102110101020101010201010102010101
-0204010102010101020101010203010102010101020101010202010102010101020a0101
-020201010201010102020101020101010202010102010101022a01000202010202010101
-020101010201010102010101020101010211010102010101020101010201010102010101
-020201010202010102010101020101010201010102000101020001010200010202020101
-020101010202010102020101020101010202010102010101020101010208010202040102
-020401010201010102020101020101010204010102050101020301000200010102040101
-020501010204010102010101020701020204010202010101020101010202010102010101
-0207010202010101027a0103020b00000204040003000000020504000277010102070101
-020301010201010102080101020301010201010102020101020101010202010102010101
-020201000201010102090101020101010201010102010101020201000200010102010101
-020101010203010102010101020101010202010102010101020a01010202010102010101
-020201010201010102020101020101010202010002260100020201020201010102010101
-020101010200010202010101020201000201010102090101020101010201010102010101
-020101010202010102020101020101010202010102070101020001010202010102000102
-020201010202010102010101020201010201010102010101020201000205010102050101
-020101010200010102000102020201010200010202010101020001010202010002010101
-020201010201010102000101020001010202010002010101020401010201010102020100
-020401010205010102010101020101010202010102010101020101010204010102010101
-0202010002760103020b0000020500000206040002770105020301010204010302090101
-020401020200010102010104020301010202010302020101020901010202010302030103
-02020102020001010201010202010101020201030203010102010101020b010202010102
-020001010201010402030101020201030227010002030101020201030203010102000101
-020201030202010102090101020101010201010102020102020001010201010102020101
-020101010203010502050101020301010200010102020101020201010201010102020101
-020101010202010302020104020201040202010102010101020001010203010102000101
-020101010201010302030102020001010201010102000101020101030202010102040101
-020201030201010402020104020301030203010102010101020101010200010402030103
-02770103020b0000020d040002fc010602a201010201010102ff022a0103020b0000020d
-040002ff02a7010302ff022b0103020b0000020d040002ff02ff02d70103020c040d02ff
-02ff02d8010302ff02ff02f3010302ff02ff02f30103020200ff00ff00ec040002020103
-0202000004ff04ff04ec0202010302ff02ff02f30103020200ff00ff00ed020201030202
-00ff00ff00ec0800020201030202000106ff06ff06e90801020201030202000106ff06ff
-06e90801020201030202000106ff06ff06e90801020201030202000106ff06ff06e90801
-020201030202000106ff06ff06e908010202010302020001060b07040604070006030702
-061f07040610070206200702060b070006060700062d0700060207000604070006ff06fa
-07000602070006090702061308010202010302020001060b0700060f0700062107000614
-0700061f070006020700060a0700063507000602070006ff06ff0600070006020700060b
-0700061308010202010302020001060b0700060607020605070006030702061a07000604
-070206030702060507000603070206180700060207000601070006000701060207040602
-070206030702060207000600070106030702061807000602070006020702060307020602
-07000602070006ff06eb07000602070006020702060507000602070006000701060c0801
-0202010302020001060b0700060807000605070006020700060207000619070006030700
-060207000601070006020700060407000602070006020700061707000602070006010701
-060107000603070006060700060207000602070006010701060107000601070006020700
-0618070006000700060507000602070006020700060107000602070006ff06eb07000602
-07000601070006020700060407000602070106010700060b08010202010302020001060b
-070306050700060507000602070006020700061907000603070006020700060107000602
-07000604070006020700061b070006020700060107000602070006030700060607000602
-070006020700060107000602070006010700061c07000600070006050700060207000602
-070006010700060007000600070006ff06eb070406010700060207000604070006020700
-06020700060b08010202010302020001060b070006080700060507000602070406190700
-060307000602070006010700060207000604070006030702061807000602070006010700
-060207000603070006060700060207000602070006010700060207000602070206190700
-06000700060507000602070406010700060007000600070006ff06eb0700060207000601
-0704060407000602070006020700060b08010202010302020001060b0700060807000605
-070006020700061d07000603070006020700060107000602070006040700060607000617
-070006020700060107000602070006030700060607000602070006020700060107000602
-07000605070006190700060607000602070006050700060007000600070006ff06eb0700
-0602070006010700060807000602070006020700060b08010202010302020001060b0700
-060807000605070006020700060207000619070006030700060207000601070006020700
-060407000602070006020700061707000602070006010701060107000603070006060700
-060207000602070006010700060207000601070006020700061907000606070006020700
-0602070006010700060007000600070006ff06eb07000602070006010700060207000604
-07000602070106010700060b08010202010302020001060b070006080700060507000603
-0702061a0700060407020603070206050700060307020619070206020700060007010605
-07010604070006030702060207000602070006020702061a070006060700060307020603
-07000600070006ff06ec07000602070006020702060507000602070006000701060c0801
-0202010302020001067d070006ff06ff06590700060f08010202010302020001060a0706
-062a07060631070606000700063d070606ff06fe0706060e0700060f0801020201030202
-0001060a0706062a07060631070606000700063d070606ff06fe0706060e0700060f0801
-020201030202000106ff06ff06e90801020201030202000106ff06ff06e9080102020103
-0202000106ff06ff06e90801020201030202000108ff08ff08eb020201030202000008ff
-08ff08ec02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff
-06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202010302020603
-0016061600160616004406160016061600160616001606ff06be02020103020206030015
-080006160015080006160015080000150800001508000616001508000616001508000616
-0015080006ff06be02020103020206030001061208010616000106120801061600010612
-080100010612080100010612080106160001061208010616000106120801061600010612
-080106ff06be020201030202060300010612080106160001061208010616000106120801
-000106120801000106120801061600010612080106160001061208010616000106120801
-06ff06be0202010302020603000106120801061600010603070206030702060408010616
-000106120801000106120801000106120801061600010612080106160001061208010616
-00010612080106ff06be0202010302020603000106080702060608010616000106030702
-060307020604080106160001061208010001061208010001061208010616000106050704
-0607080106160001060707010608080106160001060707030606080106ff06be02020103
-020206030001060b0701060408010616000106020704060107040603080106160001060e
-0700060208010001060e070006020801000106020700060e080106160001060307080605
-080106160001060607030607080106160001060507070604080106ff06be020201030202
-06030001060d070006000700060108010616000106020700060107010601070006010701
-0603080106160001060e0700060208010001060e070006020801000106020700060e0801
-061600010602070a06040801061600010606070306070801061600010604070306010703
-0603080106ff06be02020103020206030001060207020608070106010801061600010601
-070d0602080106160001060b07000601070006020801000106020700060a070006020801
-00010602070006010700060b080106160001060207030602070306040801061600010607
-0701060808010616000106040702060307020603080106ff06be02020103020206030001
-060107080602070206010801061600010600070006000703060007020600070406010801
-06160001060b07000601070006020801000106020700060a070006020801000106020700
-06010700060b080106160001060107030604070306030801061600010612080106160001
-06040702060307020603080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106080700060107000601
-070006020801000106020700060407000604070006020801000106020700060107000601
-070006080801061600010601070206030707060108010616000106050704060708010616
-000106050701060207020604080106ff06be020201030202060300010601070906060801
-061600010600070006000703060007020600070406010801061600010608070006010700
-060107000602080100010602070006040700060407000602080100010602070006010700
-060107000608080106160001060107020604070506020801061600010606070306070801
-06160001060907020605080106ff06be0202010302020603000106010709060608010616
-000106000700060007030600070206000704060108010616000106050700060107000601
-070006010700060208010001060207000604070006010700060107000602080100010602
-070006010700060107000601070006050801061600010601070206050703060308010616
-0001060707020607080106160001060807020606080106ff06be02020103020206030001
-0601070d0602080106160001060007000600070706000704060108010616000106050700
-060107000601070006010700060208010001060207000604070006010700060107000602
-080100010602070006010700060107000601070006050801061600010601070306050701
-0604080106160001060707020607080106160001060707020607080106ff06be02020103
-020206030001060107030607070006030801061600010600070006000704060107000600
-070406010801061600010602070006010700060107000601070006010700060208010001
-060207000601070006010700060107000601070006020801000106020700060107000601
-07000601070006010700060208010616000106020703060b080106160001060707020607
-080106160001060707020607080106ff06be020201030202060300010601070206070700
-060408010616000106000706060107060601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106020709
-06050801061600010607070206070801061600010612080106ff06be0202010302020603
-000106010701060707000605080106160001060007000600070206050700060007020601
-080106160001060207000601070006010700060107000601070006020801000106020700
-060107000601070006010700060107000602080100010602070006010700060107000601
-070006010700060208010616000106030707060608010616000106060704060608010616
-0001060707020607080106ff06be02020103020206030001060107090606080106160001
-060007000600070206050700060007020601080106160001060207000601070006010700
-060107000601070006020801000106020700060107000601070006010700060107000602
-080100010602070006010700060107000601070006010700060208010616000106050704
-0607080106160001060507060605080106160001060707020607080106ff06be02020103
-020206030001061208010616000106000704060507040601080106160001061208010001
-0612080100010612080106160001061208010616000106120801061600010612080106ff
-06be02020103020206030001061208010616000106120801061600010612080100010612
-080100010612080106160001061208010616000106120801061600010612080106ff06be
-020201030202060300010612080106160001061208010616000106120801000106120801
-00010612080106160001061208010616000106120801061600010612080106ff06be0202
-010302020603000108140616000108140616000108140001081400010814061600010814
-06160001081406160001081406ff06be0202010302020603000008150616000008150616
-00000815000008150000081506160000081506160000081506160000081506ff06be0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed0202
-0103020206ff06ff06ed02020103020206ff06ff06ed020201030202060301ff01ff01e5
-06030202010302020603010000ff00ff00cf010000120100060302020103020206030100
-00ff00ff00cf010000110800010006030202010302020603010000ff00ff00cf01000001
-060e0801010006030202010302020603010000ff00ff00cf01000001060e080101000603
-0202010302020603010000ff00ff00cf01000001060e0801010006030202010302020603
-010000ff00ff00cf01000001060e0801010006030202010302020603010000ff00ff00cf
-01000001060e0801010006030202010302020603010000ff00ff00cf01000001060e0801
-010006030202010302020603010000ff00ff00cf01000001060e08010100060302020103
-02020603010000ff00ff00cf010000010601010a06010801010006030202010302020603
-010000ff00ff00cf010000010602010806020801010006030202010302020603010000ff
-00ff00cf010000010603010606030801010006030202010302020603010000ff00ff00cf
-010000010604010406040801010006030202010302020603010000ff00ff00cf01000001
-0605010206050801010006030202010302020603010000ff00ff00cf0100000106060100
-06060801010006030202010302020603010000ff00ff00cf01000001060e080101000603
-0202010302020603010000ff00ff00cf01000001060e0801010006030202010302020603
-010000ff00ff00cf01000001060e0801010006030202010302020603010000ff00ff00cf
-01000001060e0801010006030202010302020603010000ff00ff00cf01000001060e0801
-010006030202010302020603010000ff00ff00cf01000001060e08010100060302020103
-02020603010000ff00ff00cf01000001060e0801010006030202010302020603010000ff
-00ff00cf010000010810010006030202010302020603010000ff00ff00cf010000000811
-01000603020201030202060301ff01ff01e5060302020103020206ff06ff06ed02020103
-020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103
-020206ff06ff06ed02020103020206ff06ff06ed02020103020206ff06ff06ed02020103
-020206ff06ff06ed020201030202060301ff01ff01e506030202010302020603010006ff
-06ff06970100064a01000603020201030202060301000663010506ff06ff062d0100064a
-01000603020201030202060301000662010706ff06ff062c0100064a0100060302020103
-020206030100066101020603010206ff06ff062b0100064a010006030202010302020603
-0100066101010605010106ff06ff062b0100064a01000603020201030202060301000661
-01020603010206ff06ff062b0100064a01000603020201030202060301000662010706ff
-06ff062c0100064a01000603020201030202060301000663010506ff06ff062d0100064a
-01000603020201030202060301000665010106ff06ff062f0100064a0100060302020103
-0202060301000665010106ff06ff062f0100064a01000603020201030202060301000665
-010106ff06ff062f0100064a01000603020201030202060301000665010106ff06ff062f
-0100064a01000603020201030202060301000665010106ff06ff062f0100064a01000603
-020201030202060301000665010106ff06ff062f0100064a010006030202010302020603
-0100066101010600010206ff06ff062f0100064a01000603020201030202060301000661
-01010600010206ff06ff062f0100064a01000603020201030202060301000661010506ff
-06ff062f0100064a01000603020201030202060301000661010506ff06ff062f0100064a
-0100060302020103020206030100066101020600010106ff06ff062f0100064a01000603
-0202010302020603010006ff06ff06970100064a01000603020201030202060301ff01ff
-0199064a010006030202010302020603010006350b610d04005f0d04005f0d04005f0d04
-005f0d04005f0d0400010100061308120623010006030202010302020603010006350b60
-0e000d030100005e08000d030100005e08000d030100005e08000d030100005e08000d03
-0100005e08000d0301000001010006130811000006230100060302020103020206030100
-06350b010a5d0e010d0101020001065b08010d0101020001065b08010d0101020001065b
-08010d0101020001065b08010d0101020001065b08010d01010200010100061308010010
-0623010006030202010302020603010006350b010a2c01000a2f0e010d0101020001062a
-0102062d08010d0101020001062a0102062d08010d0101020001062c0100062d08010d01
-0102000106290104062c08010d0101020001062b0102062c08010d010102000101000613
-0801000d080000010623010006030202010302020603010006350b010a2a01020a2f0e01
-0d01010200010629010006020100062c08010d01010200010629010006020100062c0801
-0d0101020001062b0101062d08010d010102000106290100063008010d0101020001062a
-0100062f08010d01010200010100061308010001060a0801000106230100060302020103
-02020603010006350b010a2c01000a2f0e010d01010200010629010006020100062c0801
-0d0101020001062d0100062c08010d0101020001062a010006000100062d08010d010102
-000106290100063008010d010102000106290100063008010d0101020001010006130801
-0001060a080100010623010006030202010302020603010006350b010a2c01000a2f0e01
-0d01010200010629010006020100062c08010d0101020001062d0100062c08010d010102
-0001062a010006000100062d08010d010102000106290100063008010d01010200010629
-0100063008010d01010200010100061308010001060a0801000106230100060302020103
-02020603010006350b010a2c01000a2f0e010d0101020001062c0100062d08010d010102
-0001062b0101062d08010d01010200010629010006010100062d08010d01010200010629
-0103062d08010d010102000106290103062d08010d01010200010100061308010001060a
-080100010623010006030202010302020603010006350b010a2c01000a2f0e010d010102
-0001062b0100062e08010d0101020001062d0100062c08010d0101020001062801000602
-0100062d08010d0101020001062d0100062c08010d01010200010629010006020100062c
-08010d01010200010100061308010001060a080100010623010006030202010302020603
-010006350b010a2c01000a2f0e010d0101020001062a0100062f08010d0101020001062d
-0100062c08010d010102000106280105062c08010d0101020001062d0100062c08010d01
-010200010629010006020100062c08010d01010200010100061308010001060a08010001
-0623010006030202010302020603010006350b010a2c01000a2f0e010d01010200010629
-010006020100062c08010d01010200010629010006020100062c08010d0101020001062c
-0100062d08010d01010200010628010006030100062c08010d0101020001062901000602
-0100062c08010d01010200010100061308010001060a0801000106230100060302020103
-02020603010006350b010a2a01040a2d0e010d010102000106290104062c08010d010102
-0001062a0102062d08010d0101020001062b0102062c08010d010102000106290103062d
-08010d0101020001062a0102062d08010d01010200010100061308010001060a08010001
-0623010006030202010302020603010006350b010a5d0e010d0101020001065b08010d01
-01020001065b08010d0101020001065b08010d0101020001065b08010d0101020001065b
-08010d01010200010100061308010001060a080100010623010006030202010302020603
-010006350b010a5d0e010d0101020001065b08010d0101020001065b08010d0101020001
-065b08010d0101020001065b08010d0101020001065b08010d0101020001010006130801
-0001060a080100010623010006030202010302020603010006350b010a5d0e010d010102
-0001065b08010d0101020001065b08010d0101020001065b08010d0101020001065b0801
-0d0101020001065b08010d01010200010100060e0100060308010001060a080100010623
-010006030202010302020603010006350b010a5d0e010d0101020001065b08010d010102
-0001065b08010d0101020001065b08010d0101020001065b08010d0101020001065b0801
-0d01010200010100060d0101060308010001060a08010001062301000603020201030202
-0603010006350b010a5d0e010d0101020001065b08010d0101020001065b08010d010102
-0001065b08010d0101020001065b08010d0101020001065b08010d01010200010100060c
-010006000100060308010001080c00010623010006030202010302020603010006350b01
-0a5d0e010d0101020001065b08010d0101020001065b08010d0101020001065b08010d01
-01020001065b08010d0101020001065b08010d01010200010100060e010006030801000d
-080000010623010006030202010302020603010006350b010e5f0d0101020001085d0d01
-01020001085d0d0101020001085d0d0101020001085d0d0101020001085d0d0101020001
-0100060e0100060308010001060a08010001062301000603020201030202060301000635
-0b000e600d0001030000085e0d0001030000085e0d0001030000085e0d0001030000085e
-0d0001030000085e0d000103000008000100060e0100060308010001060a080100010623
-0100060302020103020206030100009a0100006301000063010000630100006301000063
-010000020100060e0100060308010001060a080100010623010006030202010302020603
-01000035080000630100006301000063010000630100006301000063010000020100060e
-0100060308010001060a0801000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100060c010406010801
-0001060a0801000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010001060a080100010623
-010006030202010302020603010000010617010006190801006301000063010000630100
-00630100006301000063010000020100061308010001060a080100010623010006030202
-01030202060301000001061501020619080100630100000e010000530100006301000063
-0100006301000063010000020100061308010001060a0801000106230100060302020103
-0202060301000001061701000619080100630100000e0100005301000063010000630100
-006301000063010000020100061308010001060a08010001062301000603020201030202
-0603010000010617010006190801000f0102000201000000010100020100000001010003
-0102003b0100000e01000000010100020100000001010003010200020101000001000002
-01010000010000030102002d010000630100006301000063010000630100000201000613
-08010001060a080100010623010006030202010302020603010000010617010006190801
-000e010000020100000101010001010000010101000101000001010000020100003a0100
-000e01010001010000010101000101000001010000020100000101000000010000000100
-0001010000000100000001000001010000020100002c0100006301000063010000630100
-0063010000020100061308010001060a0801000106230100060302020103020206030100
-00010617010006190801001201000001010000020100000101000002010000050100003a
-0100000e0100000201000001010000050100000201000001010000000100000001000001
-0100000001000000010000050100002c0100006301000063010000630100006301000002
-0100061308010001060a0801000106230100060302020103020206030100000106170100
-06190801000f01030001010000020100000101000002010000020103003a0100000e0100
-000201000001010000050100000201000001010000000100000001000001010000000100
-0000010000020103002c0100006301000063010000630100006301000002010006130801
-0001080c00010623010006030202010302020603010000010617010006190801000e0100
-00020100000101000002010000010100000201000001010000020100003a0100000e0100
-000201000001010000050100000201000001010000000100000001000001010000000100
-000001000001010000020100002c01000063010000630100006301000063010000020100
-061308010000080d00010623010006030202010302020603010000010615010406170801
-000e010000020100000101000002010000010100000201000001010000020100003a0100
-000e01010001010000010100000501000002010000010100000001000000010000010100
-00000100000001000001010000020100002c010000630100006301000063010000630100
-00020100061308010c0e000106230100060302020103020206030100000106320801000f
-01030001010000020100000101000002010000020103003a0100000e0100000001010002
-01000006010200020100000001000000010000010100000001000000010000020103002c
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000108340063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000000835
-01ff01ff0161061308010c0e000106230100060302020103020206030100009a01000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000035080000630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010616010206180801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061501000602
-0100061708010011010100130100000b01000002010000290100002c0100000b01020003
-0102001f01000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010615010006020100061708010010010000150100
-000f010000290100002c0100000d010000050100001f0100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010615
-010006020100061708010010010000030100000001010003010200030101000001000001
-01000000010100030102000201000001010000260100000e010000000101000301020002
-01000000010100020100000001010002010400010100000201000004010000050100001f
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-0202010302020603010000010618010006180801000e0104000101010001010000010100
-000201000001010000010101000101010001010000040100000201000000010000270100
-000e01010001010000010100000201000001010100010100000101010001010000030100
-00030100000201000004010000050100001f010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061701000619
-080100100100000301000005010000020100000101000002010000010100000801000002
-010100280100000e01000002010000010100000201000001010000050100000701000003
-0100000201000004010000050100001f0100006301000063010000630100006301000002
-0100061308010c0e000106230100060302020103020206030100000106160100061a0801
-001001000003010000050104000101000002010000010100000801000002010100280100
-000e01000002010000010100000201000001010000050100000701000003010000020100
-0004010000050100001f0100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010615010006020100061708010010
-010000030100000501000005010000020100000101000008010000020100000001000027
-0100000e0100000201000001010000020100000101000005010000070100000301000002
-01000004010000050100001f010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061501040617080100100100
-000301000005010000020100000101000001010100010100000801000002010000010100
-00260100000e010000020100000101000002010000010100000501000007010000030100
-000101010004010000050100001f01000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801001001000003
-01000006010200030101000001000001010000080100000201000002010000250100000e
-010000020100000201020002010000050100000801010002010100000100000401000005
-0100001f01000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106320801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001083400630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0000083501ff01ff0161061308010c0e000106230100060302020103020206030100009a
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000350800006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106160102061808010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010615
-01000602010006170801002601000003010200030102002d010000160102004901000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-02020603010000010619010006170801002d010000050100002d01000018010000490100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010619010006170801000f01010000010000010100000201000001
-0100000001010003010200050100000501000003010200260100000f0102000501000002
-010000020100000201020003010200030102000201000000010100260100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010617010106180801000e01000001010100010100000201000001010100010100
-000401000005010000050100000201000002010000250100000e01000002010000040100
-000201000002010000010100000201000001010000020100000101000002010000010101
-00010100002501000063010000630100006301000063010000020100061308010c0e0001
-0623010006030202010302020603010000010619010006170801000e0100000201000001
-01000002010000010100000201000004010000050100000501000006010000250100000e
-010000080100000201000002010000010100000501000005010000020100000101000002
-0100002501000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010619010006170801000e01000002010000010100
-0002010000010100000201000004010000050100000501000003010300250100000f0102
-000501000002010000020100000201020003010200020104000101000002010000250100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000001061501000602010006170801000e010000020100000101000002
-010000010100000201000004010000050100000501000002010000020100002501000012
-010000040100000201000002010000050100000501000001010000050100000201000025
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-0202010302020603010000010616010206180801000e0100000101010001010000010101
-0001010000020100000401000005010000050100000201000002010000250100000e0100
-000201000004010000020100000101010001010000020100000101000002010000010100
-000201000001010000020100002501000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801000f01010000
-010000020101000001000001010000020100000401000005010000050100000301030025
-0100000f0102000501000003010100000100000201020003010200030102000201000002
-0100002501000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100120100004f01000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-06030100000106320801000e010000020100004f01000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-06320801000f010200500100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010834
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000000083501ff01ff0161061308010c0e00010623
-0100060302020103020206030100009a0100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100003508000063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106320801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061801000618080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000001061701010618080100110100001a010100040100002d
-010000160102000c01000002010000370100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010616010006000100
-06180801002c010000350100001801000010010000370100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010616
-01000600010006180801000f010200030102000301020003010200040100000401020002
-01000000010100030102001f0100000f0102000501000002010000020100000201020002
-010000010100003401000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106150100060101000618080100110100
-000201000002010000010100000201000001010000020100000101040004010000020101
-000101000001010000020100001e0100000e010000020100000401000002010000020100
-000401000002010000000100003501000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106140100060201000618
-080100110100000201000002010000010100000501000002010000030100000601000002
-0100000201000001010000020100001e0100001201000004010000020100000201000004
-010000020101003601000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106140105061708010011010000020100
-0002010000020102000201040003010000060100000201000002010000010104001e0100
-000f01030004010000030100000001000005010000020101003601000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106180100061808010011010000020100000201000005010000010100000701000006
-010000020100000201000001010000220100000e01000002010000040100000301000000
-010000050100000201000000010000350100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010617010206170801
-001101000002010000020100000101000002010000010100000201000003010000060100
-00020100000201000001010000020100001e0100000e0100000201000004010000040100
-000601000002010000010100003401000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801001101000003
-010200030102000301020004010000060100000201000002010000020102001f0100000f
-010300040100000401000006010000020100000201000033010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010011010000500100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801000e01000001
-010000500100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801000f01010051010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001083400630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0000083501ff01ff0161061308010c0e0001062301000603020201030202060301000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000000050000000500000005000000050000000500
-000005000000050000000500000005000100006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000500
-000005320100050000630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000005340100006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000500000005150104051701000500006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-06030100000005160100051c0100000e010000160100003b0100000e0100000601020010
-0100000c0100002901000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000500000005150100051b01000500000e0100
-00530100000e01000008010000100100000c010000290100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000000516
-0100051c0100000e01000001010000030102000201000000010100030102000201000000
-010100340100000e01000000010100050100000301020003010200020100000101000003
-010200020100000001010003010200020100000001010003010100000100001001000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000500000005150103051801000500000e0100000001000003010000020100
-000101010001010000040100000201010001010000330100000e01010001010000040100
-000201000002010000010100000201000001010000000100000301000002010000010101
-000101000001010000020100000101010001010000010100000101010010010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000000051a010005180100000e0101000801000001010000080100000201000002
-010000330100000e01000002010000040100000601000001010000050101000401000002
-010000010100000201000001010000020100000101000005010000020100001001000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000500000005190100051701000500000e0101000501030001010000080100
-000201000002010000330100000e01000002010000040100000301030001010000050101
-000401040001010000020100000101040001010000050100000201000010010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000000051501000503010005180100000e01000000010000030100000201000001
-010000080100000201000002010000330100000e01000002010000040100000201000002
-010000010100000501000000010000030100000501000002010000010100000501000005
-010000020100001001000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000500000005150103051801000500000e0100
-0001010000020100000201000001010000080100000201000002010000330100000e0101
-000101000004010000020100000201000001010000020100000101000001010000020100
-000201000001010100010100000101000002010000010100000501000001010100100100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-0103020206030100000005340100000e0100000201000002010300010100000801000002
-01000002010000330100000e010000000101000501000003010300020102000201000002
-010000020102000201000000010100030102000201000006010100000100001001000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100050000000532010005000063010000510100001001000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-00000534010000630100004d010000020100001001000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100050000000532
-0100050000630100004e0102001101000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000005340100006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000500000005320100050000630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010000630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001000500010005000100050001000500
-010005000100050001000500010005000100050001ff01ff0161061308010c0e00010623
-01000603020201030202060301000d360063010000630100006301000063010000630100
-0063010000020100061308010c0e0001062301000603020201030202060301000d350100
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000d01013400630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0d0101340063010000630100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000d010117000201190063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000d0101160000011c000e0100000e010000140100002d010000320102
-002d01000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000d0101150000011d000e0100000e01000043010000340100
-002d01000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000d0101150000011d000e0100000101000003010200020104
-00020102000201000000010100030102000201000000010100030102001f0100000e0100
-000201000001010000000101000201000000010100030102000301020005010000030102
-002601000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000d0101150003011a000e0100000001000003010000020100
-000301000003010000020100000101010001010000040100000201010001010000010100
-00020100001e0100000e0100000201000001010100010100000101010001010000010100
-000201000001010000020100000401000002010000020100002501000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0d0101150000010200000119000e01010008010000030100000701000001010000080100
-000201000002010000050100001e0100000e010000020100000101000002010000010100
-000201000001010000090100000401000006010000250100006301000063010000630100
-0063010000020100061308010c0e0001062301000603020201030202060301000d010115
-0000010200000119000e0101000501030003010000040103000101000008010000020100
-0002010000020103001e0100000e01000002010000010100000201000001010000020100
-000201020003010300040100000301030025010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000d01011500000102
-00000119000e010000000100000301000002010000030100000301000002010000010100
-0008010000020100000201000001010000020100001e0100000e01000002010000010100
-000201000001010000020100000501000001010000020100000401000002010000020100
-002501000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000d0101160002011a000e0100000101000002010000020100
-000301000003010000020100000101000008010000020100000201000001010000020100
-001e0100000e010000010101000101010001010000010101000101000001010000020100
-000101000002010000040100000201000002010000250100006301000063010000630100
-0063010000020100061308010c0e0001062301000603020201030202060301000d010134
-000e01000002010000020103000401010002010300010100000801000002010000020100
-00020103001e0100000f0101000001000001010000000101000201000000010100030102
-000301030004010000030103002501000063010000630100006301000063010000020100
-061308010c0e0001062301000603020201030202060301000d0101340063010000150100
-00050100004501000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000d01013400630100001501000005010000450100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-01030202060301000d010134006301000015010000050100004501000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0d0101340063010000630100006301000063010000630100006301000002010006130801
-0c0e0001062301000603020201030202060301000d010134006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000d01013400630100006301000063010000630100006301000063010000020100
-061308010c0e0001062301000603020201030202060301000d0001ff01ff019706130801
-0c0e000106230100060302020103020206030100009a0100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-003508000063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061501040617
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106150100060201000617080100260100
-003b01000019010000170102002d01000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106180100061808010063
-01000019010000190100002d010000630100006301000063010000630100000201000613
-08010c0e00010623010006030202010302020603010000010618010006180801000e0101
-00000100000301020002010000000101000301020003010200340100000f010200030101
-000001000002010200020100000001010002010000000101000501000003010200020100
-00000101001f01000063010000630100006301000063010000020100061308010c0e0001
-0623010006030202010302020603010000010618010006180801000e0100000001000000
-01000001010000020100000101010001010000040100000201000002010000330100000e
-010000020100000101000001010100010100000201000001010100010100000101010001
-01000004010000020100000201000001010100010100001e010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-0618010006180801000e0100000001000000010000050100000101000008010000060100
-00330100000e010000020100000101000002010000010100000201000001010000020100
-000101000002010000040100000601000001010000020100001e01000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-00010617010006190801000e010000000100000001000002010300010100000801000003
-010300330100000e01000002010000010100000201000001010400010100000201000001
-01000002010000040100000301030001010000020100001e010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-0617010006190801000e0100000001000000010000010100000201000001010000080100
-000201000002010000330100000e01000002010000010100000201000001010000050100
-0002010000010100000201000004010000020100000201000001010000020100001e0100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010617010006190801000e01000000010000000100000101000002
-01000001010000080100000201000002010000330100000e010000020100000101000001
-010100010100000201000001010000020100000101010001010000040100000201000002
-01000001010000020100001e010000630100006301000063010000630100000201000613
-08010c0e000106230100060302020103020206030100000106320801000e010000000100
-000001000002010300010100000801000003010300330100000f01020003010100000100
-000201020002010000020100000101000000010100050100000301030001010000020100
-001e01000063010000630100006301000063010000020100061308010c0e000106230100
-06030202010302020603010000010632080100630100002a010000370100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100002a01000037010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100002a0100003701000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010834006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000000083501ff01ff0161061308010c0e00010623010006030202
-010302020603010005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050000000500000005000000
-050000000500000005000000050000000500000005000000050001000063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010005000000053201000500006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000000
-053401000063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010005000000051601020518010005000063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-01000603020201030202060301000000051601000502010005180100001e010000430100
-000e01000006010200100100000c01000029010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000500000005150100
-05020100051701000500001e010000430100000e01000008010000100100000c01000029
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000000051601000502010005180100000e01010000010000030102
-0002010400020102003b0100000e01000000010100050100000301020003010200020100
-000101000003010200020100000001010003010200020100000001010003010100000100
-001001000063010000630100006301000063010000020100061308010c0e000106230100
-0603020201030202060301000500000005160102051801000500000e0100000001000000
-01000001010000020100000301000003010000020100003a0100000e0101000101000004
-010000020100000201000001010000020100000101000000010000030100000201000001
-010100010100000101000002010000010101000101000001010000010101001001000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000000051601000502010005180100000e0100000001000000010000050100
-0003010000030100003e0100000e01000002010000040100000601000001010000050101
-000401000002010000010100000201000001010000020100000101000005010000020100
-001001000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100050000000515010005020100051701000500000e01000000
-010000000100000201030003010000040102003b0100000e010000020100000401000003
-010300010100000501010004010400010100000201000001010400010100000501000002
-0100001001000063010000630100006301000063010000020100061308010c0e00010623
-01000603020201030202060301000000051601000502010005180100000e010000000100
-0000010000010100000201000003010000070100003a0100000e01000002010000040100
-000201000002010000010100000501000000010000030100000501000002010000010100
-000501000005010000020100001001000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100050000000516010205180100
-0500000e010000000100000001000001010000020100000301000003010000020100003a
-0100000e0101000101000004010000020100000201000001010000020100000101000001
-010000020100000201000001010100010100000101000002010000010100000501000001
-0101001001000063010000630100006301000063010000020100061308010c0e00010623
-0100060302020103020206030100000005340100000e0100000001000000010000020103
-0004010100020102003b0100000e01000000010100050100000301030002010200020100
-000201000002010200020100000001010003010200020100000601010000010000100100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010005000000053201000500006301000051010000100100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000000534010000630100004d01000002010000100100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010005000000
-05320100050000630100004e010200110100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000000534010000630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100050000000532010005000063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-050001000500010005000100050001000500010005000100050001000500010005000100
-0500010005000100050001000500010005000100050001ff01ff0161061308010c0e0001
-06230100060302020103020206030100009a010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000350800
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106160102061808010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010615010006020100061708010016010200030102
-00420100000e010000230100000b01020003010200180100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010615
-01000602010006170801001801000005010000420100000e010000230100000d01000005
-0100001801000063010000630100006301000063010000020100061308010c0e00010623
-01000603020201030202060301000001061501000602010006170801000f010200050100
-0005010000030102003b0100000e01000000010100030102000201000000010100020100
-000001010003010200020104000101000002010000040100000501000018010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061501000602010006170801000e01000002010000040100000501000002
-010000020100003a0100000e010100010100000101000002010000010101000101000001
-010100010100000101000002010000030100000301000002010000040100000501000018
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-0202010302020603010000010616010306170801000e0100000201000004010000050100
-0002010000020100003a0100000e01000002010000010100000201000001010000050100
-000201000001010000070100000301000002010000040100000501000018010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-0603010000010619010006170801000e010000020100000401000005010000020104003a
-0100000e0100000201000001010000020100000101000005010000020100000201020004
-010000030100000201000004010000050100001801000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106180100
-06180801000e010000020100000401000005010000020100003e0100000e010000020100
-000101000002010000010100000501000002010000050100000301000003010000020100
-000401000005010000180100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010615010206190801000e01000002
-010000040100000501000002010000020100003a0100000e010000020100000101000002
-010000010100000501000002010000010100000201000003010000030100000101010004
-010000050100001801000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801000f01020005010000050100
-00030102003b0100000e0100000201000002010200020100000501000002010000020102
-000501010002010100000100000401000005010000180100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-083400630100006301000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000000083501ff01ff0161061308010c0e0001
-062301000603020201030202060301000900000009000000090000000900000009000000
-090000000900000009000000090000000900000009000000090000000900000009000000
-090000000900000009000000090000000900000009000000090000000900000009000000
-090000000900000009000000090000000900006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000000
-090000000900000009000000090000000900000009000000090000000900000009000000
-090000000900000009000000090000000900000009000000090000000900000009000000
-090000000900000009000000090000000900000009000000090000000900000009000100
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000900000009320100090000630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000009340100006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000900000009130100
-090401020915010009000063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000000912010209030100
-090201000915010000630100001701000020010200260100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010009000000
-091301000903010009020100091401000900006301000017010000220100002601000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000009140100090301000902010009150100000e01000000010100030102
-000201000000010100420100000f01020002010400010100000201000001010000000101
-000301020002010000000101000501000003010200020100000001010018010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-0603010009000000091301000903010009020100091401000900000e0101000101000001
-010000020100000101010001010000410100000e01000002010000030100000301000002
-010000010101000101000001010000020100000101010001010000040100000201000002
-010000010101000101000017010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000000091401000903010009020100
-09150100000e01000002010000010100000201000001010000450100000e010000070100
-000301000002010000010100000501000002010000010100000201000004010000060100
-000101000002010000170100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010009000000091301000903010009020100
-091401000900000e010000020100000101040001010000450100000f0102000401000003
-010000020100000101000005010400010100000201000004010000030103000101000002
-0100001701000063010000630100006301000063010000020100061308010c0e00010623
-0100060302020103020206030100000009140100090301000902010009150100000e0100
-000201000001010000050100004501000012010000030100000301000002010000010100
-000501000005010000020100000401000002010000020100000101000002010000170100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-0103020206030100090000000911010409020102091501000900000e0101000101000001
-0100000201000001010000450100000e0100000201000003010000030100000101010001
-010000050100000201000001010100010100000401000002010000020100000101000002
-0100001701000063010000630100006301000063010000020100061308010c0e00010623
-0100060302020103020206030100000009340100000e0100000001010003010200020100
-00450100000f010200050101000201010000010000010100000601020002010000000101
-000501000003010300010100000201000017010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000900000009320100
-0900000e0100005301000031010000300100006301000063010000630100006301000002
-0100061308010c0e000106230100060302020103020206030100000009340100000e0100
-005301000031010000300100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010009000000093201000900000e01000053
-010000310100003001000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000009340100006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000900000009320100090000630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000009000100
-090001000900010009000100090001000900010009000100090001000900010009000100
-090001000900010009000100090001000900010009000100090001000900010009000100
-090001000900010009000100090001000900010009000100090001000900010000630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100090001000900010009000100090001000900010009000100
-090001000900010009000100090001000900010009000100090001000900010009000100
-090001000900010009000100090001000900010009000100090001000900010009000100
-090001000900010009000100090001ff01ff0161061308010c0e00010623010006030202
-0103020206030100009a0100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100003508000063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000605010006160801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061101020603010206160801001701000006010000420100
-00150100001c0100000b0102000301020018010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000605
-01000616080100170100004a010000150100001c0100000d010000050100001801000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-0202060301000001061301000605010006160801000f0102000201040002010200020100
-000001010003010200340100000f01020002010000010100000301020002010000000101
-000301020002010400010100000201000004010000050100001801000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-0001061301000605010006160801000e0100000201000003010000060100000201010001
-0100000101000002010000330100000e0100000201000001010000000100000301000002
-010000010101000101000001010000020100000301000003010000020100000401000005
-0100001801000063010000630100006301000063010000020100061308010c0e00010623
-01000603020201030202060301000001061301000605010006160801000e010000070100
-0006010000020100000201000005010000330100000e0100000501010008010000010100
-000201000001010000070100000301000002010000040100000501000018010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000605010006160801000f01020004010000060100000201000002
-01000002010300330100000f010200020101000501030001010000020100000201020004
-010000030100000201000004010000050100001801000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106130100
-060501000616080100120100000301000006010000020100000201000001010000020100
-003301000012010000010100000001000003010000020100000101000002010000050100
-000301000003010000020100000401000005010000180100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010611
-01040601010406140801000e010000020100000301000006010000020100000201000001
-01000002010000330100000e010000020100000101000001010000020100000201000001
-010000020100000101000002010000030100000301000001010100040100000501000018
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-02020103020206030100000106320801000f010200050101000401000002010000020100
-0002010300330100000f0102000201000002010000020103000101000002010000020102
-000501010002010100000100000401000005010000180100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-083400630100006301000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000000083501ff01ff0161061308010c0e0001
-06230100060302020103020206030100009a010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000350800
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060401020615
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106110102060301000602010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000603010006020100061408010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006030100060201000614080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106130100060601000615080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106130100060501000616080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106130100060401000617080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106130100
-060301000602010006140801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061101040601
-010406140801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001063208010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001083400630100006301000063010000630100006301000063
-010000020100061308010c0e0001062301000603020201030202060301000000083501ff
-01ff0161061308010c0e000106230100060302020103020206030100009a010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000350800006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010632080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106130100060401020615080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106110102
-060301000602010006140801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000607
-010006140801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000607010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000605010106150801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061301000607010006140801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000607010006140801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000603010006020100061408010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010611
-010406020102061508010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-063208010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010632080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106320801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001063208010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010834006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000000
-083501ff01ff0161061308010c0e000106230100060302020103020206030100009a0100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100003508000063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000606010006150801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061101020605010106150801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000604
-010006000100061508010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010613010006040100
-060001000615080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060301000601
-010006150801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000602010006020100
-061508010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010613010006020105061408010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006060100061508010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010611010406030102061408010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010834006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000000083501ff01ff0161061308010c0e00010623010006030202
-0103020206030100009a0100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100003508000063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000603010406140801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061101020603010006180801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000603010006180801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000603010006180801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000603
-010306150801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000607010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000607010006140801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061301000602010006030100061408010063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010611010406010103061508010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010834006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000000083501ff01ff0161061308010c0e00010623010006030202
-0103020206030100009a0100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100003508000063010000630100
-0063010000630100006301000063010000020100061308010c0e00010623010006030202
-010302020603010000010632080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000605010206140801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061101020604010006170801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000603010006180801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000603010006180801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000603
-010306150801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000603010006020100
-061408010063010000630100006301000063010000630100006301000002010006130801
-0c0e00010623010006030202010302020603010000010613010006030100060201000614
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106130100060301000602010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061101040602010206150801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-083400630100006301000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000000083501ff01ff0161061308010c0e0001
-06230100060302020103020206030100009a010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000350800
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060301040614
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106110102060301000602010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000606010006150801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001061301000606010006150801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000606010006150801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-061301000606010006150801006301000063010000630100006301000063010000630100
-00020100061308010c0e0001062301000603020201030202060301000001061301000605
-010006160801006301000063010000630100006301000063010000630100000201000613
-08010c0e0001062301000603020201030202060301000001061301000605010006160801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061101040603010006160801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106320801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001063208010063010000630100006301000063010000630100006301000002
-0100061308010c0e00010623010006030202010302020603010000010632080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106320801006301000063010000630100006301000063
-01000063010000020100061308010c0e0001062301000603020201030202060301000001
-083400630100006301000063010000630100006301000063010000020100061308010c0e
-0001062301000603020201030202060301000000083501ff01ff0161061308010c0e0001
-06230100060302020103020206030100009a010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000350800
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106130100060401020615
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000106110102060301000602010006140801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001061301000603010006020100061408010063
-0100006301000063010000630100006301000063010000020100061308010c0e00010623
-010006030202010302020603010000010613010006030100060201000614080100630100
-006301000063010000630100006301000063010000020100061308010c0e000106230100
-060302020103020206030100000106130100060401020615080100630100006301000063
-010000630100006301000063010000020100061308010c0e000106230100060302020103
-020206030100000106130100060301000602010006140801006301000063010000630100
-00630100006301000063010000020100061308010c0e0001062301000603020201030202
-060301000001061301000603010006020100061408010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010613010006030100060201000614080100630100006301000063010000630100
-006301000063010000020100061308010c0e000106230100060302020103020206030100
-000106110104060201020615080100630100006301000063010000630100006301000063
-010000020100061308010c0e000106230100060302020103020206030100000106320801
-00630100006301000063010000630100006301000063010000020100061308010c0e0001
-062301000603020201030202060301000001063208010063010000630100006301000063
-0100006301000063010000020100061308010c0e00010623010006030202010302020603
-010000010632080100630100006301000063010000630100006301000063010000020100
-061308010c0e000106230100060302020103020206030100000106320801006301000063
-01000063010000630100006301000063010000020100061308010c0e0001062301000603
-020201030202060301000001063208010063010000630100006301000063010000630100
-0063010000020100061308010c0e00010623010006030202010302020603010000010632
-080100630100006301000063010000630100006301000063010000020100061308010c0e
-000106230100060302020103020206030100000108340063010000630100006301000063
-0100006301000063010000020100061308010010062301000603020201030202060301ff
-01ff01990613080000110623010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-0202060301000649010006ff06ff069801000603020201030202060301000648010106ff
-06ff06980100060302020103020206030100064701000600010006ff06ff069801000603
-020201030202060301000649010006ff06ff069801000603020201030202060301000649
-010006ff06ff069801000603020201030202060301000649010006ff06ff069801000603
-020201030202060301000649010006ff06ff069801000603020201030202060301000649
-010006ff06ff069801000603020201030202060301000647010406ff06ff069601000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-0100063708ff08ff0860064a0100060302020103020206030100063708ff08ff085f0000
-064a010006030202010302020603010006370801001d0cff0cff0c3e0001064a01000603
-0202010302020603010006370801001c08000cff0cff0c3e0001064a0100060302020103
-020206030100063708010001060b08000000060b08010cff0cff0c3e0001064a01000603
-02020103020206030100063708010001060b08000000060b08010cff0cff0c3e0001064a
-0100060302020103020206030100063708010001060b08000000060b08010cff0cff0c3e
-0001064a0100060302020103020206030100063708010001060b08000000060b08010cff
-0cff0c3e0001064a0100060302020103020206030100063708010001060b08000000060b
-08010cff0cff0c3e0001064a0100060302020103020206030100063708010001060b0800
-0000060b08010cff0cff0c3e0001064a0100060302020103020206030100063708010001
-060b08000000060b08010cff0cff0c3e0001064a01000603020201030202060301000637
-08010001060b08000000060b08010cff0cff0c3e0001064a010006030202010302020603
-0100063708010001060b08000000060b08010cff0cff0c3e0001064a0100060302020103
-020206030100063708010001060b08000000060b08010cff0cff0c3e0001064a01000603
-02020103020206030100063708010001060b08000000060b08010cff0cff0c3e0001064a
-0100060302020103020206030100063708010001080c0000080d0cff0cff0c3e0001064a
-0100060302020103020206030100063708010000081c0cff0cff0c3e0001064a01000603
-020201030202060301000637080100ff00ff005e064a0100060302020103020206030100
-0637080000ff00ff005f064a010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010302020603
-010006ff06ff06e3010006030202010302020603010006ff06ff06e30100060302020103
-02020603010006ff06ff06e3010006030202010302020603010006ff06ff06e301000603
-0202010302020603010006ff06ff06e3010006030202010302020603010006ff06ff06e3
-010006030202010302020603010006ff06ff06e3010006030202010302020603010006ff
-06ff06e3010006030202010302020603010006ff06ff06e3010006030202010100040603
-010006ff06ff06e301000603000502020400060301ff01ff01e506030000020204000000
-0202040006ff06ff06ed00000202040000000202040006ff06ff06ed0000020204000000
-0202040006ff06ff06ed00000202040000000202040006ff06ff06ed0000020204000000
-02020400000502ff02ff02e100060202040000000208040002ff02ff02e1000002080400
-00000208040002ff02ff02e100000208040000000208040001ff01ff01e1000002080400
-0000040901ff01ff01e100000409
-%%EndData
-end
-%%PageTrailer
-%%Trailer
-%%BoundingBox: 0 0 532 441
-%%EOF
diff --git a/lib/tv/doc/src/warning.gif b/lib/tv/doc/src/warning.gif
deleted file mode 100644
index 96af52360e..0000000000
--- a/lib/tv/doc/src/warning.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/ebin/.gitignore b/lib/tv/ebin/.gitignore
deleted file mode 100644
index e69de29bb2..0000000000
--- a/lib/tv/ebin/.gitignore
+++ /dev/null
diff --git a/lib/tv/info b/lib/tv/info
deleted file mode 100644
index 63e88b04b5..0000000000
--- a/lib/tv/info
+++ /dev/null
@@ -1,2 +0,0 @@
-group: tools
-short: An ETS and MNESIA graphical table visualizer
diff --git a/lib/tv/priv/Makefile b/lib/tv/priv/Makefile
deleted file mode 100644
index 679a76fe88..0000000000
--- a/lib/tv/priv/Makefile
+++ /dev/null
@@ -1,72 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-include ../vsn.mk
-VSN = $(TV_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/tv-$(VSN)
-
-#
-# Macros
-#
-TOOLBAR_FILES = \
- arrow_left.xbm \
- arrow_right.xbm \
- edit1.xbm \
- erlang.gif \
- help.xbm \
- info.xbm \
- key.xbm \
- more.xbm \
- no_sort.xbm \
- open.xbm \
- poll.xbm \
- search.xbm \
- sort.xbm \
- sort_reverse.xbm \
- tv.gif \
- tv.tool
-
-#
-# Rules
-#
-
-debug opt:
-
-docs:
-
-clean:
-
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/priv"
- $(INSTALL_DATA) $(TOOLBAR_FILES) "$(RELSYSDIR)/priv"
-
-release_docs_spec:
-
-FORCE:
diff --git a/lib/tv/priv/arrow_left.xbm b/lib/tv/priv/arrow_left.xbm
deleted file mode 100644
index 58db123a00..0000000000
--- a/lib/tv/priv/arrow_left.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define arrow_left_width 16
-#define arrow_left_height 8
-static unsigned char arrow_left_bits[] = {
- 0x70, 0x00, 0x38, 0x00, 0x1c, 0x00, 0xfe, 0xff, 0xfe, 0xff, 0x1c, 0x00,
- 0x38, 0x00, 0x70, 0x00};
diff --git a/lib/tv/priv/arrow_right.xbm b/lib/tv/priv/arrow_right.xbm
deleted file mode 100644
index 7eca80303d..0000000000
--- a/lib/tv/priv/arrow_right.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define arrow_right_width 16
-#define arrow_right_height 8
-static unsigned char arrow_right_bits[] = {
- 0x00, 0x1c, 0x00, 0x38, 0x00, 0x70, 0xfc, 0xff, 0xfc, 0xff, 0x00, 0x70,
- 0x00, 0x38, 0x00, 0x1c};
diff --git a/lib/tv/priv/edit1.xbm b/lib/tv/priv/edit1.xbm
deleted file mode 100644
index dc13f274c0..0000000000
--- a/lib/tv/priv/edit1.xbm
+++ /dev/null
@@ -1,12 +0,0 @@
-#define edit1_width 25
-#define edit1_height 25
-static unsigned char edit1_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x00,
- 0x00, 0x01, 0x14, 0x00, 0x70, 0xf9, 0x27, 0x00, 0xf8, 0x01, 0x3c, 0x00,
- 0xf8, 0xf9, 0x27, 0x00, 0xf0, 0x03, 0x20, 0x00, 0xe0, 0xff, 0x27, 0x00,
- 0xc0, 0x07, 0x20, 0x00, 0x80, 0xff, 0x27, 0x00, 0x00, 0x1f, 0x20, 0x00,
- 0x00, 0xfd, 0x27, 0x00, 0x00, 0x79, 0x20, 0x00, 0x00, 0xf9, 0x27, 0x00,
- 0x00, 0x21, 0x21, 0x00, 0x00, 0xf9, 0x27, 0x00, 0x00, 0x01, 0x20, 0x00,
- 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/erlang.gif b/lib/tv/priv/erlang.gif
deleted file mode 100644
index 8d06e98065..0000000000
--- a/lib/tv/priv/erlang.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/priv/help.xbm b/lib/tv/priv/help.xbm
deleted file mode 100644
index b2cbc541e4..0000000000
--- a/lib/tv/priv/help.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define help_width 20
-#define help_height 20
-static unsigned char help_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0xff, 0x00, 0x80, 0xe7, 0x01,
- 0x80, 0xc3, 0x01, 0x80, 0xc3, 0x01, 0x00, 0xe3, 0x00, 0x00, 0x70, 0x00,
- 0x00, 0x38, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/info.xbm b/lib/tv/priv/info.xbm
deleted file mode 100644
index d5157661c2..0000000000
--- a/lib/tv/priv/info.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define info_width 20
-#define info_height 20
-static unsigned char info_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x1e, 0x00,
- 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x1e, 0x00,
- 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x1c, 0x00,
- 0x00, 0x3e, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/key.xbm b/lib/tv/priv/key.xbm
deleted file mode 100644
index 222be32219..0000000000
--- a/lib/tv/priv/key.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define key_width 10
-#define key_height 18
-static char key_bits[] = {
- 0xfc,0x00,0xfe,0x01,0x87,0x03,0x03,0x03,0x87,0x03,0xfe,0x01,0xfc,0x00,0x30,
- 0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x3b,0x00,0x3b,0x00,
- 0x3f,0x00,0x3f,0x00,0x37,0x00};
diff --git a/lib/tv/priv/more.xbm b/lib/tv/priv/more.xbm
deleted file mode 100644
index 38ef738768..0000000000
--- a/lib/tv/priv/more.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define more_width 16
-#define more_height 26
-static unsigned char more_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f,
- 0xe0, 0x3f, 0xc0, 0x1f, 0x80, 0x0f, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/no_sort.xbm b/lib/tv/priv/no_sort.xbm
deleted file mode 100644
index 90568dd828..0000000000
--- a/lib/tv/priv/no_sort.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define no_sort_width 20
-#define no_sort_height 20
-static unsigned char no_sort_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
- 0x20, 0x00, 0x02, 0x20, 0x00, 0x02, 0x20, 0x08, 0x02, 0x20, 0x08, 0x02,
- 0x20, 0x48, 0x02, 0x20, 0x48, 0x02, 0x20, 0x49, 0x02, 0x20, 0x49, 0x02,
- 0x20, 0x49, 0x02, 0x20, 0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/open.xbm b/lib/tv/priv/open.xbm
deleted file mode 100644
index fe77d2c38b..0000000000
--- a/lib/tv/priv/open.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define open_width 20
-#define open_height 20
-static unsigned char open_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x05,
- 0xe0, 0x00, 0x06, 0xf0, 0x1f, 0x07, 0xf0, 0x3f, 0x00, 0xf0, 0x3f, 0x00,
- 0xf0, 0x3f, 0x00, 0xf0, 0xff, 0x03, 0xf0, 0x00, 0x01, 0x70, 0x80, 0x00,
- 0x30, 0x40, 0x00, 0xf0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/poll.xbm b/lib/tv/priv/poll.xbm
deleted file mode 100644
index 6ec1dbeaf2..0000000000
--- a/lib/tv/priv/poll.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define poll2_width 20
-#define poll2_height 20
-static unsigned char poll2_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0xc0, 0x7f, 0x00, 0xe0, 0xff, 0x00,
- 0xe0, 0xf1, 0x00, 0xf0, 0xe0, 0x01, 0x70, 0xf8, 0x07, 0x70, 0xf0, 0x03,
- 0x70, 0xe0, 0x01, 0xf0, 0xc0, 0x00, 0xe0, 0x01, 0x00, 0xe0, 0x7f, 0x00,
- 0xc0, 0x3f, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/search.xbm b/lib/tv/priv/search.xbm
deleted file mode 100644
index 3498e66b0d..0000000000
--- a/lib/tv/priv/search.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define search2_width 20
-#define search2_height 20
-static unsigned char search2_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xc0, 0xe1, 0x00, 0xc0, 0xe1, 0x00, 0xe0, 0xf3, 0x01, 0x20, 0x93, 0x01,
- 0xf0, 0xff, 0x03, 0xe8, 0xdd, 0x07, 0xe8, 0xdd, 0x07, 0xe8, 0xdd, 0x07,
- 0xe8, 0xdd, 0x07, 0xe8, 0xdf, 0x07, 0xe8, 0xd3, 0x07, 0xf8, 0xf3, 0x07,
- 0xe8, 0x40, 0x07, 0xe8, 0x40, 0x07, 0xf8, 0xc0, 0x07, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/sort.xbm b/lib/tv/priv/sort.xbm
deleted file mode 100644
index 576564b817..0000000000
--- a/lib/tv/priv/sort.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define sort_width 20
-#define sort_height 20
-static unsigned char sort_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x02,
- 0x00, 0x40, 0x02, 0x00, 0x40, 0x02, 0x00, 0x48, 0x02, 0x00, 0x48, 0x02,
- 0x00, 0x49, 0x02, 0x00, 0x49, 0x02, 0x20, 0x49, 0x02, 0x20, 0x49, 0x02,
- 0x20, 0x49, 0x02, 0x20, 0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/sort_reverse.xbm b/lib/tv/priv/sort_reverse.xbm
deleted file mode 100644
index b58e6308f5..0000000000
--- a/lib/tv/priv/sort_reverse.xbm
+++ /dev/null
@@ -1,8 +0,0 @@
-#define sort_reverse_width 20
-#define sort_reverse_height 20
-static unsigned char sort_reverse_bits[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x20, 0x00, 0x00,
- 0x20, 0x01, 0x00, 0x20, 0x01, 0x00, 0x20, 0x09, 0x00, 0x20, 0x09, 0x00,
- 0x20, 0x49, 0x00, 0x20, 0x49, 0x00, 0x20, 0x49, 0x02, 0x20, 0x49, 0x02,
- 0x20, 0x49, 0x02, 0x20, 0x49, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/lib/tv/priv/tv.gif b/lib/tv/priv/tv.gif
deleted file mode 100644
index 44daac2912..0000000000
--- a/lib/tv/priv/tv.gif
+++ /dev/null
Binary files differ
diff --git a/lib/tv/priv/tv.tool b/lib/tv/priv/tv.tool
deleted file mode 100644
index 770424d283..0000000000
--- a/lib/tv/priv/tv.tool
+++ /dev/null
@@ -1,23 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{version,"0.1"}.
-{{tool,"Table Visualizer"},
- {start,{tv,start,[]}},
- {icon,"tv.gif"},
- {message,"The Table Visualizer"},
- {html,"../doc/html/index.html"}}.
diff --git a/lib/tv/src/Makefile b/lib/tv/src/Makefile
deleted file mode 100644
index 3d680c1eaf..0000000000
--- a/lib/tv/src/Makefile
+++ /dev/null
@@ -1,135 +0,0 @@
-#
-# %CopyrightBegin%
-#
-# Copyright Ericsson AB 1997-2012. All Rights Reserved.
-#
-# The contents of this file are subject to the Erlang Public License,
-# Version 1.1, (the "License"); you may not use this file except in
-# compliance with the License. You should have received a copy of the
-# Erlang Public License along with this software. If not, it can be
-# retrieved online at http://www.erlang.org/.
-#
-# Software distributed under the License is distributed on an "AS IS"
-# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-# the License for the specific language governing rights and limitations
-# under the License.
-#
-# %CopyrightEnd%
-include $(ERL_TOP)/make/target.mk
-include $(ERL_TOP)/make/$(TARGET)/otp.mk
-
-# ----------------------------------------------------
-# Application version
-# ----------------------------------------------------
-include ../vsn.mk
-VSN=$(TV_VSN)
-
-# ----------------------------------------------------
-# Release directory specification
-# ----------------------------------------------------
-RELSYSDIR = $(RELEASE_PATH)/lib/tv-$(VSN)
-
-# ----------------------------------------------------
-# Common Macros
-# ----------------------------------------------------
-
-MODULES= \
- tv \
- tv_comm_func \
- tv_db \
- tv_db_search \
- tv_db_sort \
- tv_ets_rpc \
- tv_etsread \
- tv_info \
- tv_io_lib \
- tv_io_lib_format \
- tv_io_lib_pretty \
- tv_ip \
- tv_main \
- tv_mnesia_rpc \
- tv_new_table \
- tv_nodewin \
- tv_pb \
- tv_pb_funcs \
- tv_pc \
- tv_pc_graph_ctrl \
- tv_pc_menu_handling \
- tv_pd \
- tv_pd_display \
- tv_pd_frames \
- tv_pd_scale \
- tv_pg \
- tv_pg_gridfcns \
- tv_poll_dialog \
- tv_pw \
- tv_pw_window \
- tv_rec_edit \
- tv_table_owner \
- tv_utils
-
-
-
-HRL_FILES= \
- tv_db_int_def.hrl \
- tv_int_def.hrl \
- tv_int_msg.hrl \
- tv_main.hrl \
- tv_pb_int_def.hrl \
- tv_pc_int_def.hrl \
- tv_pd_int_def.hrl \
- tv_pd_int_msg.hrl \
- tv_pg_int_def.hrl \
- tv_pw_int_def.hrl
-
-ERL_FILES= $(MODULES:%=%.erl)
-
-TARGET_FILES = $(MODULES:%=$(EBIN)/%.$(EMULATOR)) $(APP_TARGET) $(APPUP_TARGET)
-
-APP_FILE = tv.app
-APP_SRC = $(APP_FILE).src
-APP_TARGET = $(EBIN)/$(APP_FILE)
-
-APPUP_FILE = tv.appup
-APPUP_SRC = $(APPUP_FILE).src
-APPUP_TARGET = $(EBIN)/$(APPUP_FILE)
-# ----------------------------------------------------
-# FLAGS
-# ----------------------------------------------------
-ERL_COMPILE_FLAGS += +warn_obsolete_guard
-
-# ----------------------------------------------------
-# Targets
-# ----------------------------------------------------
-
-debug opt: $(TARGET_FILES)
-
-clean:
- rm -f $(TARGET_FILES)
- rm -f errs core *~
-
-$(APP_TARGET): $(APP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-$(APPUP_TARGET): $(APPUP_SRC) ../vsn.mk
- $(vsn_verbose)sed -e 's;%VSN%;$(VSN);' $< > $@
-
-docs:
-
-# ----------------------------------------------------
-# Special Targets
-# ----------------------------------------------------
-
-# ----------------------------------------------------
-# Release Target
-# ----------------------------------------------------
-include $(ERL_TOP)/make/otp_release_targets.mk
-
-release_spec: opt
- $(INSTALL_DIR) "$(RELSYSDIR)/src"
- $(INSTALL_DATA) $(HRL_FILES) $(ERL_FILES) "$(RELSYSDIR)/src"
- $(INSTALL_DIR) "$(RELSYSDIR)/ebin"
- $(INSTALL_DATA) $(TARGET_FILES) "$(RELSYSDIR)/ebin"
-
-release_docs_spec:
-
diff --git a/lib/tv/src/tv.app.src b/lib/tv/src/tv.app.src
deleted file mode 100644
index e76c587868..0000000000
--- a/lib/tv/src/tv.app.src
+++ /dev/null
@@ -1,56 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{application, tv,
- [{description, "tv Table Visualizer"},
- {vsn, "%VSN%"},
- {modules, [tv,
- tv_comm_func,
- tv_db,
- tv_db_search,
- tv_db_sort,
- tv_ets_rpc,
- tv_etsread,
- tv_info,
- tv_io_lib,
- tv_io_lib_format,
- tv_io_lib_pretty,
- tv_ip,
- tv_main,
- tv_mnesia_rpc,
- tv_new_table,
- tv_nodewin,
- tv_pb,
- tv_pb_funcs,
- tv_pc,
- tv_pc_graph_ctrl,
- tv_pc_menu_handling,
- tv_pd,
- tv_pd_display,
- tv_pd_frames,
- tv_pd_scale,
- tv_pg,
- tv_pg_gridfcns,
- tv_poll_dialog,
- tv_pw,
- tv_pw_window,
- tv_rec_edit,
- tv_table_owner,
- tv_utils
- ]},
- {registered,[tv_table_owner]},
- {applications, [kernel, stdlib, gs]}]}.
diff --git a/lib/tv/src/tv.appup.src b/lib/tv/src/tv.appup.src
deleted file mode 100644
index 0d918b6081..0000000000
--- a/lib/tv/src/tv.appup.src
+++ /dev/null
@@ -1,18 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 2001-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-{"%VSN%",[],[]}.
diff --git a/lib/tv/src/tv.erl b/lib/tv/src/tv.erl
deleted file mode 100644
index 70bc945c63..0000000000
--- a/lib/tv/src/tv.erl
+++ /dev/null
@@ -1,38 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv).
-
--export([start/0,
- start_browser/6]).
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-start() ->
- tv_main:start().
-
-
-start_browser(Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode) ->
- spawn_link(tv_pc, pc, [self(), Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode]).
-
-
-
-
-
diff --git a/lib/tv/src/tv_comm_func.erl b/lib/tv/src/tv_comm_func.erl
deleted file mode 100644
index d57960e303..0000000000
--- a/lib/tv/src/tv_comm_func.erl
+++ /dev/null
@@ -1,77 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_comm_func).
-
-
-
-
--export([max/2,
- min/2
- ]).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-max(X, Y) when X > Y ->
- X;
-max(_X, Y) ->
- Y.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-min(X, Y) when X < Y ->
- X;
-min(_X, Y) ->
- Y.
-
-
-
diff --git a/lib/tv/src/tv_db.erl b/lib/tv/src/tv_db.erl
deleted file mode 100644
index 75537418b3..0000000000
--- a/lib/tv/src/tv_db.erl
+++ /dev/null
@@ -1,1271 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Module handling the internal database in the table tool.
-%%%
-%%%*********************************************************************
-
--module(tv_db).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([dbs/2]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_db_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-dbs(Master, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- ProcVars = #process_variables{master_pid = Master},
- blocked(ProcVars).
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #dbs_deblock{} ->
- deblock(Msg, ProcVars, false);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(ProcVars);
-
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- blocked(ProcVars);
-
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-deblock(Msg, ProcVars, SearchWinCreated) ->
- #dbs_deblock{sender = Sender,
- etsread_pid = EtsreadPid,
- type = Type,
- keypos = KeyPos,
- sublist_length = SublistLength} = Msg,
-
- NewDbData = #db_data{subset_size = SublistLength,
- subset_pos = 1,
- key_no = KeyPos,
- ets_type = Type
- },
- NewProcVars = ProcVars#process_variables{db_data = NewDbData,
- etsread_pid = EtsreadPid},
- Sender ! #dbs_deblock_cfm{sender = self()},
- deblocked_loop(NewProcVars, SearchWinCreated, [], undefined).
-
-
-
-
-
-
-
-
-deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp) ->
- receive
- Msg ->
- case Msg of
-
- {gs,entry,keypress,_Data,['Return' | _T]} ->
- NewSearchData = search_object(ProcVars, RegExp),
- deblocked_loop(ProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- {gs,entry,keypress,_Data,['Tab' | _T]} ->
- gs:config(entry, [{select, {0,1000}}]),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,entry,keypress,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,expr_term,click,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, false);
-
- {gs,expr_regexp,click,_Data,_Args} ->
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, true);
-
- {gs,search,click,_Data,_Args} ->
- NewSearchData = search_object(ProcVars, RegExp),
- deblocked_loop(ProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- {gs,cancel,click,cancel,_Args} ->
- tv_db_search:destroy_window(SearchWinCreated),
- deblocked_loop(ProcVars, false, [], RegExp);
-
- {gs,listbox,click,_LbData,[Idx | _T]} when SearchData =/= [] ->
- tv_db_search:mark_busy(SearchWinCreated),
- {Row,_Obj} = lists:nth(Idx+1, SearchData),
- DbData = ProcVars#process_variables.db_data,
- %% Never allow 'subset_pos' to have zero as value!
- %% No list can begin with the 0:th element!!!
- %% Has to be at least 1!
- NewDbData = DbData#db_data{subset_pos=?COMM_FUNC_FILE:max(1,
- Row),
- subset_size=?ITEMS_TO_DISPLAY},
- NewProcVars = ProcVars#process_variables{db_data=NewDbData},
- send_subset(NewProcVars, undefined, undefined),
- tv_db_search:mark_nonbusy(SearchWinCreated),
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,win,configure,_Data,_Args} ->
- tv_db_search:resize_window(SearchWinCreated),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {gs,win,destroy,_Data,_Args} ->
- deblocked_loop(ProcVars, false, [], RegExp);
-
-
- #dbs_new_data{data = NewData, keys = ListOfKeys,
- time_to_read_table = ElapsedTimeEtsread} ->
- tv_db_search:reset_window(SearchWinCreated),
- T1 = time(),
- NewProcVars = update_db(NewData, ListOfKeys, ProcVars),
- T2 = time(),
- ElapsedTimeDbs = compute_elapsed_seconds(T1, T2),
- send_subset(NewProcVars, ElapsedTimeEtsread, ElapsedTimeDbs),
- deblocked_loop(NewProcVars, SearchWinCreated, [], RegExp);
-
- #dbs_subset_req{subset_pos = Pos,subset_length = Length} ->
- DbData = ProcVars#process_variables.db_data,
- %% Never allow 'subset_pos' to have zero as value!
- %% No list can begin with the 0:th element!!!
- %% Has to be at least 1!
- NewDbData = DbData#db_data{subset_pos=?COMM_FUNC_FILE:max(1,
- Pos),
- subset_size=Length},
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- send_subset(NewProcVars, undefined, undefined),
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_marked_row{row_no = RowNo} ->
- DbData = ProcVars#process_variables.db_data,
- NewDbData = DbData#db_data{requested_row = RowNo},
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_search_req{} ->
- tv_db_search:create_window(SearchWinCreated),
- deblocked_loop(ProcVars, true, SearchData, false);
-
- #dbs_sorting_mode{} ->
- {NewProcVars, NewSearchData} =
- update_sorting_mode(Msg, ProcVars,
- SearchWinCreated, SearchData, RegExp),
- deblocked_loop(NewProcVars, SearchWinCreated, NewSearchData, RegExp);
-
- #dbs_deblock{} ->
- tv_db_search:reset_window(SearchWinCreated),
- deblock(Msg, ProcVars, SearchWinCreated);
-
- #dbs_updated_object{object=Obj,old_object=OldObj,old_color=Color,obj_no=ObjNo} ->
- {Success, NewProcVars} = update_object(Obj, OldObj, Color, ObjNo, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_new_object{object=Obj} ->
- {Success, NewProcVars} = new_object(Obj, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #dbs_delete_object{object=Obj, color=Color, obj_no=ObjNo} ->
- {Success, NewProcVars} = delete_object(Obj, Color, ObjNo, ProcVars),
- case Success of
- true ->
- tv_db_search:reset_window(SearchWinCreated),
- send_subset(NewProcVars, undefined, undefined);
- false ->
- done
- end,
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- #pc_list_info{lists_as_strings=ListAsStr} ->
- NewProcVars = ProcVars#process_variables{lists_as_strings=ListAsStr},
- deblocked_loop(NewProcVars, SearchWinCreated, SearchData, RegExp);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp);
-
- _Other ->
- %% io:format("Received message: ~w ~n", [_Other]),
- deblocked_loop(ProcVars, SearchWinCreated, SearchData, RegExp)
- end
- end.
-
-
-
-
-
-
-
-search_object(ProcVars, RegExp) ->
- DbData = ProcVars#process_variables.db_data,
- DbList = dblist2list(DbData#db_data.db),
- ListAsStr = ProcVars#process_variables.lists_as_strings,
- case catch tv_db_search:get_input_and_search(DbList, RegExp, ListAsStr) of
- {'EXIT', _Reason} ->
- tv_db_search:reset_window(true),
- [];
- List ->
- List
- end.
-
-
-
-
-
-
-update_sorting_mode(Msg, ProcVars, SearchWinCreated, OldSearchData, RegExp) ->
- #dbs_sorting_mode{sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortKeyNo} = Msg,
-
- DbData = ProcVars#process_variables.db_data,
-
- #db_data{db = DbList,
- sorting = OldSorting,
- rev_sorting = OldReverse,
- sort_key_no = OldSortKeyNo} = DbData,
-
-
- NewDbList = sort_db_list(DbList, Sorting, OldSorting, Reverse, OldReverse,
- SortKeyNo, OldSortKeyNo),
-
- NewDbData = DbData#db_data{db = NewDbList,
- sorting = Sorting,
- rev_sorting = Reverse,
- sort_key_no = SortKeyNo
- },
-
- NewProcVars = ProcVars#process_variables{db_data = NewDbData},
- send_subset(NewProcVars, undefined, undefined),
-
- SearchData =
- case Sorting of
- false ->
- OldSearchData;
- OldSorting when Reverse =:= OldReverse,
- SortKeyNo =:= OldSortKeyNo ->
- [];
- OldSorting when Reverse =:= OldReverse,
- OldSortKeyNo =:= undefined->
- [];
- _Other ->
- ListAsStr = ProcVars#process_variables.lists_as_strings,
- case catch tv_db_search:update_search(SearchWinCreated,
- NewDbList, RegExp,
- ListAsStr) of
- {'EXIT', _Reason} ->
- tv_db_search:reset_window(true),
- [];
- List ->
- List
- end
- end,
-
- {NewProcVars, SearchData}.
-
-
-
-
-
-
-
-
-sort_db_list(DbList, Sort, Sort, Rev, Rev, KeyNo, KeyNo) ->
- % Already sorted!
- DbList;
-sort_db_list(DbList, false, _OldSort, _Rev, _OldRev, _KeyNo, _OldKeyNo) ->
- % No sorting, i.e., the old list order suffices!
- DbList;
-sort_db_list(DbList, _Sort, _OldSort, Rev, _OldRev, KeyNo, _OldKeyNo) ->
- tv_db_sort:mergesort(KeyNo, DbList, Rev).
-
-
-
-
-
-
-
-send_subset(ProcVars, EtsreadTime, DbsTime) ->
- #process_variables{master_pid = MasterPid,
- db_data = DbData,
- list_of_keys = ListOfKeys} = ProcVars,
-
- #db_data{subset_size = SubsetSize,
- subset_pos = SubsetPos,
- requested_row = RowNo,
- db_size = DbSize,
- db = DbList,
- max_elem_size = MaxElemSize} = DbData,
-
-
- RowData = get_requested_row_data(RowNo, DbList),
-
- if
- DbSize > 0 ->
- Pos = ?COMM_FUNC_FILE:min(SubsetPos, DbSize),
- % Requested_data may be shorter than requested, but that's OK,
- % pd handles that correctly!
- Subset = lists:sublist(DbList, Pos, SubsetSize),
- MasterPid ! #dbs_subset{sender = self(),
- data = Subset,
- subset_pos = Pos,
- db_length = DbSize,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = RowData,
- required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime
- };
- true ->
- MasterPid ! #dbs_subset{sender = self(),
- data = [],
- subset_pos = 1,
- db_length = 0,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = RowData,
- required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime
- }
- end.
-
-
-
-
-
-get_requested_row_data(undefined, _DbList) ->
- [];
-get_requested_row_data(_RowNo, []) ->
- [];
-get_requested_row_data(RowNo, DbList) ->
- case catch lists:nth(RowNo, DbList) of
- {'EXIT', _Reason} ->
- [];
- RowData ->
- [RowData]
- end.
-
-
-
-
-exit_signals(ExitInfo, MasterPid) ->
- case ExitInfo of
- {MasterPid, _Reason} ->
- % When from master, just quit!
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-update_db(NewList, ListOfKeys, ProcVars) ->
- DbData = ProcVars#process_variables.db_data,
- #db_data{db = OldDbList,
- max_elem_size = MaxElemSize,
- deleted = DelList,
- ets_type = EtsType,
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- DbList = update_colors(OldDbList -- DelList),
- OldList = dblist2list(DbList),
- InsOrUpd = (NewList -- OldList),
- DelOrUpd = (OldList -- NewList),
-
- {Inserted, Deleted, Updated} = group_difflists(basetype(EtsType), KeyNo,
- InsOrUpd,
- DelOrUpd),
- DelMarked = mark_deleted(KeyNo, Deleted, DbList),
- Replaced = replace_elements(KeyNo, Updated, DelMarked),
- NewDbList = add_elements(KeyNo, Inserted, Replaced, Sorting, RevSorting,
- SortKeyNo),
-
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize,
- ?COMM_FUNC_FILE:max(max_size(Replaced),
- max_size(Inserted))),
-
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize,
- deleted = list2dblist(Deleted, ?BLACK)
- },
-
- ProcVars#process_variables{db_data = NewDbData,
- list_of_keys = ListOfKeys
- }.
-
-
-
-
-
-
-update_object(Obj, OldObj, OldColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{key_no = KeyNo} = DbData,
-
- %% Don't update if there are no changes!
- case OldObj of
- Obj when OldColor =/= ?BLACK -> %% Allow deleted objects to be inserted!
- gs:window(dbwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification", ["The object is unchanged!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Stay the patient course,",
- "Of little worth is your ire:",
- "The object's unchanged." ])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- _Other ->
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- Result =
- case OldColor of
- ?BLACK ->
- EtsreadPid ! #etsread_new_object{sender = self(),
- object = Obj},
- receive
- #etsread_new_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end;
- _OtherColor ->
- EtsreadPid ! #etsread_update_object{sender = self(),
- key_no = KeyNo,
- object = Obj,
- old_object = OldObj},
- receive
- #etsread_update_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end
- end,
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- {true, update_object2(Obj, OldObj, OldColor, ObjNo, ProcVars)}
- end
- end.
-
-
-
-
-
-update_object2(Obj, OldObj, OldColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData} = ProcVars,
-
- #db_data{db = DbList,
- ets_type = EtsType, %% 'bag', 'set', 'ordered_set' or
- %% 'duplicate_bag'
- max_elem_size = MaxElemSize,
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- %% Replace the old element...
- Key = element(KeyNo, Obj),
- OldKey = element(KeyNo, OldObj),
- %% If Key == OldKey, the old object shall only be replaced!
- %% Otherwise the updated object shall be treated as a new
- %% object when inserting it in the list!
- %% In that latter case, we also have to check for duplicates!
-
- Fun =
- case basetype(EtsType) of
- set ->
- case Key of
- OldKey ->
- fun({Data,Color}, {Replaced,AccDb}) when element(KeyNo,Data) =/= Key ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) ->
- ElemKey = element(KeyNo,Data),
- case ElemKey of
- OldKey when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- OldKey when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- OldKey ->
- {Replaced, AccDb};
- Key ->
- {Replaced, AccDb};
- _OtherKey ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end
- end;
-
- bag ->
- case Key of
- OldKey ->
- fun({Data,_Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, AccDb};
- ({Data,Color}, {Replaced,AccDb}) when Data =/= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- %% Clauses when Data =:= OldObj.
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({Data,_Color}, {Replaced,AccDb}) when Data =:= OldObj ->
- {Replaced, AccDb};
- ({Data,_Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, AccDb};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end;
-
- duplicate_bag ->
- %% Multiple identical objects allowed, meaning that we shall not
- %% remove anything, just replace one element.
- case Key of
- OldKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =/= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end;
- _NewKey ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =:= ?BLACK,
- Color =:= ?BLACK ->
- {true, [{Obj,?RED1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj,
- not Replaced,
- OldColor =/= ?BLACK,
- Color =/= ?BLACK ->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= OldObj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when Data =:= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) ->
- {Replaced, [{Data,Color} | AccDb]}
- end
- end
- end,
-
- FilterFun = fun(Acc0, L) ->
- lists:foldl(Fun, Acc0, L)
- end,
-
-
- {Repl, TmpList} =
- case split(ObjNo, DbList) of
- {L1, [{OldObj,OldColor} | T]} when OldColor =/= ?BLACK ->
- {true,
- lists:reverse(element(2, FilterFun({true,[]}, L1))) ++
- [{Obj,?GREEN1} | lists:reverse(element(2, FilterFun({true,[]},T)))]};
- {L1, [{OldObj,OldColor} | T]} ->
- {true,
- lists:reverse(element(2, FilterFun({true,[]}, L1))) ++
- [{Obj,?RED1} | lists:reverse(element(2, FilterFun({true,[]}, T)))]};
- {L1, L2} ->
- {R1, NewL1} = FilterFun({false,[]}, L1),
- {R2, NewL2} = FilterFun({false,[]}, L2),
- {R1 or R2, lists:reverse(NewL1) ++ lists:reverse(NewL2)}
- end,
-
- NewDbList =
- case Repl of
- true when not Sorting ->
- TmpList;
- true ->
- tv_db_sort:mergesort(SortKeyNo, TmpList, RevSorting);
- false ->
- TmpList2 =
- case Key of
- OldKey ->
- lists:reverse(element(2, FilterFun({false,[]}, TmpList)));
- _OtherKey ->
- lists:reverse(element(2, FilterFun({true,[]}, TmpList))) ++
- [{Obj,?RED1}]
- end,
- case Sorting of
- false ->
- TmpList2;
- true ->
- tv_db_sort:mergesort(SortKeyNo, TmpList2, RevSorting)
- end
- end,
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize, max_size([Obj])),
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize
- },
- ProcVars#process_variables{db_data = NewDbData}.
-
-
-
-
-
-delete_object(_Obj, ?BLACK, _ObjNo, ProcVars) ->
- %% Don't delete already deleted objects!!!
- {false, ProcVars};
-delete_object(undefined, undefined, _ObjNo, ProcVars) ->
- {false, ProcVars};
-delete_object(Obj, _ObjColor, ObjNo, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{db = DbList,
- deleted = OldDeleted} = DbData,
-
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- EtsreadPid ! #etsread_delete_object{sender = self(),
- object = Obj},
- Result =
- receive
- #etsread_delete_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end,
-
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- %% Replace the old element...
- %% Have to beware of duplicate_bag tables,
- %% i.e., the same object may occur more than
- %% once, but we only want to remove it once!
- {Repl, TmpList} =
- case split(ObjNo, DbList) of
- {L1, [{Obj,_Color} | T]} ->
- {true, L1 ++ [{Obj,?BLACK} | T]};
- {L1, L2} ->
- {false, L1 ++ L2}
- end,
- NewDbList =
- case Repl of
- true ->
- TmpList;
- false ->
- Fun = fun({Data,TmpColor},
- {Removed,AccDb}) when Data =/= Obj ->
- {Removed, [{Data,TmpColor} | AccDb]};
- ({_Data,TmpColor},
- {Removed,AccDb}) when not Removed, TmpColor =/= ?BLACK ->
- {true, [{Obj,?BLACK} | AccDb]};
- ({Data,TmpColor},
- {Removed,AccDb}) ->
- {Removed, [{Data,TmpColor} | AccDb]}
- end,
- lists:reverse(element(2, lists:foldl(Fun, {false,[]}, DbList)))
- end,
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- deleted = [{Obj,?BLACK} | OldDeleted]},
- {true, ProcVars#process_variables{db_data = NewDbData}}
- end.
-
-
-
-
-
-new_object(Obj, ProcVars) ->
- #process_variables{db_data = DbData,
- etsread_pid = EtsreadPid} = ProcVars,
-
- #db_data{db = DbList,
- max_elem_size = MaxElemSize,
- ets_type = EtsType, %% 'bag', 'set' or 'duplicate_bag'
- sorting = Sorting,
- rev_sorting = RevSorting,
- sort_key_no = SortKeyNo,
- key_no = KeyNo} = DbData,
-
- %% Before we try to update the internal database, we have to check to see
- %% whether the ETS/Mnesia update is allowed!
- EtsreadPid ! #etsread_new_object{sender = self(),
- object = Obj},
- Result =
- receive
- #etsread_new_object_cfm{success = Success} ->
- Success
- after
- 60000 ->
- exit(etsread_not_responding)
- end,
-
- case Result of
- false ->
- gs:window(dbwin, gs:start(), [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Couldn't update table!"]);
- haiku ->
- tv_utils:notify(dbwin, "TV Notification",
- ["Three things are certain:",
- "Death, taxes, and lost updates.",
- "Guess which has occurred."])
- end,
- gs:destroy(dbwin),
- {false, ProcVars};
- true ->
- Key = element(KeyNo, Obj),
- NewDbList = insert_new_object(EtsType, Key, KeyNo, Obj, DbList, Sorting,
- RevSorting, SortKeyNo),
- NewMaxSize = ?COMM_FUNC_FILE:max(MaxElemSize, max_size([Obj])),
- NewDbData = DbData#db_data{db = NewDbList,
- db_size = length(NewDbList),
- max_elem_size = NewMaxSize
- },
- {true, ProcVars#process_variables{db_data = NewDbData}}
- end.
-
-
-
-
-
-insert_new_object(EtsType,Key,KeyNo,Obj,DbList,Sorting,RevSorting,SortKeyNo) ->
- %% Remove elements from the list that ought not to be there,
- %% according to the table type!
-
- Fun =
- case basetype(EtsType) of
- set ->
- fun({Data,Color}, {Replaced,AccDb}) when element(KeyNo,Data) =/= Key ->
- {Replaced, [{Data,Color} | AccDb]};
- ({Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK,
- Data =/= Obj->
- {true, [{Obj,?GREEN1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =:= ?BLACK ->
- {true, [{Obj, ?RED1} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =:= ?BLACK ->
- {false, AccDb};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- bag ->
- fun({Data,Color}, {Replaced,AccDb}) when Data =/= Obj ->
- {Replaced, [{Data,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =/= ?BLACK ->
- {true, [{Obj,Color} | AccDb]};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =/= ?BLACK ->
- {true, AccDb};
- ({_Data,Color}, {Replaced,AccDb}) when Replaced,
- Color =:= ?BLACK ->
- {true, AccDb};
- ({_Data,Color}, {Replaced,AccDb}) when not Replaced,
- Color =:= ?BLACK ->
- {true, [{Obj, ?RED1} | AccDb]};
- ({_Data,_Color}, {Replaced,AccDb}) ->
- {Replaced, AccDb}
- end;
- duplicate_bag ->
- %% The fun is never called if the type is duplicate_bag,
- %% because all we have to do with new elements is to insert
- %% them (multiple identical objects allowed).
- not_used
- end,
-
- FilterFun = fun(Acc0, L) ->
- lists:foldl(Fun, Acc0, L)
- end,
-
- {_Replaced, TmpDbList} =
- case EtsType of
- duplicate_bag ->
- {false, DbList};
- _OtherType ->
- {R,L} = FilterFun({false,[]}, DbList),
- {R, lists:reverse(L)}
- end,
-
- case Sorting of
- false ->
- TmpDbList ++ [{Obj,?RED1}];
- true ->
- %% The original list is already sorted!
- %% Just merge the two lists together!
- tv_db_sort:merge(SortKeyNo, TmpDbList, [{Obj,?RED1}], RevSorting)
- end.
-
-
-
-
-
-
-max_size([]) ->
- 0;
-max_size(L) ->
- max_size(L, 0).
-
-
-
-max_size([], CurrMax) ->
- CurrMax;
-max_size([H | T], CurrMax) when is_tuple(H) ->
- Size = size(H),
- if
- Size >= CurrMax ->
- max_size(T, Size);
- true ->
- max_size(T, CurrMax)
- end;
-max_size([_H | T], CurrMax) ->
- Size = 1,
- if
- Size >= CurrMax ->
- max_size(T, Size);
- true ->
- max_size(T, CurrMax)
- end.
-
-
-
-
-
-add_elements(_KeyNo, Inserted, List, false, _RevSorting, _SortKeyNo) ->
- % Remember that the order of the original list has to be preserved!
- List ++ list2dblist(Inserted, ?RED1);
-add_elements(_KeyNo, Inserted, List, _Sorting, RevSorting, SortKeyNo) ->
- % The original list is already sorted - sort the new elements, and
- % just merge the two lists together!
- SortedInsertedList = tv_db_sort:mergesort(SortKeyNo,
- list2dblist(Inserted, ?RED1),
- RevSorting),
- tv_db_sort:merge(SortKeyNo, List, SortedInsertedList, RevSorting).
-
-
-
-
-
- %% We assume the list already has been sorted, i.e., since the order won't
- %% be changed by marking an element deleted, we DON'T have to sort the list
- %% once again!
-
-mark_deleted(_KeyNo, [], List) ->
- List;
-mark_deleted(KeyNo, [Data | T], List) ->
- KeyValue = tv_db_sort:get_compare_value(KeyNo, Data),
- NewList = mark_one_element_deleted(KeyNo, KeyValue, Data, List, []),
- mark_deleted(KeyNo, T, NewList).
-
-
-
-
-
-
-
-
-mark_one_element_deleted(_KeyNo, _KeyValue, _Data, [], Acc) ->
- Acc;
-mark_one_element_deleted(KeyNo, {tuple, KeyValue},
- Data, [{DataTuple, Color} | Tail], Acc) ->
- OldKeyValue = tv_db_sort:get_compare_value(KeyNo, DataTuple),
- % Remember that the order of the original list has to be preserved!
- if
- OldKeyValue =:= {tuple, KeyValue} ->
- Acc ++ [{Data, ?BLACK}] ++ Tail;
- true ->
- mark_one_element_deleted(KeyNo, {tuple, KeyValue}, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end;
-mark_one_element_deleted(KeyNo, _KeyValue, Data, [{DataTuple, Color} | Tail], Acc) ->
- if
- Data =:= DataTuple ->
- Acc ++ [{Data, ?BLACK}] ++ Tail;
- true ->
- mark_one_element_deleted(KeyNo, _KeyValue, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end.
-
-
-
-
-
-
-
- %% We assume the list already has been sorted, i.e., since the order won't
- %% be changed by marking an element updated, we DON'T have to sort the list
- %% once again!
-
-replace_elements(_KeyNo, [], List) ->
- List;
-replace_elements(KeyNo, [Data | T], List) ->
- KeyValue = tv_db_sort:get_compare_value(KeyNo, Data),
- NewList = replace_one_element(KeyNo, KeyValue, Data, List, []),
- replace_elements(KeyNo, T, NewList).
-
-
-
-
-
-
-
-replace_one_element(_KeyNo, _Key, _Data, [], Acc) ->
- Acc;
-replace_one_element(KeyNo, {tuple, Key1}, Data, [{DataTuple, Color} | Tail], Acc) ->
- Key2 = tv_db_sort:get_compare_value(KeyNo, DataTuple),
- % Remember that the order of the original list has to be preserved!
- if
- Key2 =:= {tuple, Key1} ->
- Acc ++ [{Data, ?GREEN1}] ++ Tail;
- true ->
- replace_one_element(KeyNo, {tuple, Key1}, Data, Tail,
- Acc ++ [{DataTuple, Color}])
- end;
-replace_one_element(_KeyNo, _KeyValue, _Data, [{DataTuple, Color} | Tail], Acc) ->
- % Can't replace an element with no key!
- Acc ++ [{DataTuple, Color} | Tail].
-
-
-
-
-
-
-
-
-group_difflists(bag, _KeyNo, Inserted, Deleted) ->
- %% Since the ETS table is of bag type, no element can be updated, i.e.,
- %% it can only be deleted and re-inserted, otherwise a new element will be added.
- {Inserted, Deleted, []};
-group_difflists(duplicate_bag, _KeyNo, Inserted, Deleted) ->
- %% Since the ETS table is of duplicate_bag type, no element can be updated, i.e.,
- %% it can only be deleted and re-inserted, otherwise a new element will be added.
- {Inserted, Deleted, []};
-group_difflists(set, _KeyNo, [], Deleted) ->
- %% Updated elements have to be present in both lists, i.e., if one list is empty,
- %% the other contains no updated elements - they are either inserted or deleted!
- {[], Deleted, []};
-group_difflists(set, _KeyNo, Inserted, []) ->
- {Inserted, [], []};
-group_difflists(set, KeyNo, InsOrUpd, DelOrUpd) ->
- match_difflists(KeyNo, InsOrUpd, DelOrUpd, [], []).
-
-
-
-
-
-
-match_difflists(_KeyNo, [], Deleted, Inserted, Updated) ->
- {Inserted, Deleted, Updated};
-match_difflists(KeyNo, [Data | T], DelOrUpd, InsAcc, UpdAcc) ->
- % This function is only called in case of a 'set' ETS table.
- % 'Set' type of ETS table means there are unique keys. If two elements in
- % InsOrUpd and DelOrUpd have the same key, that element has been updated,
- % and is added to the Updated list, and removed from the original two lists.
- % After the two lists have been traversed in this way, the remaining elements
- % in DelOrUpd forms the new Deleted list (analogous for InsOrUpd).
- % If we want to improve the performance, we could check which list is the
- % shortest, since the traversing time depends on this.
- Key = element(KeyNo, Data),
- case searchdelete(Key, KeyNo, DelOrUpd) of
- {true, NewDelOrUpd} ->
- match_difflists(KeyNo, T, NewDelOrUpd, InsAcc, [Data | UpdAcc]);
- {false, SameDelOrUpd} ->
- match_difflists(KeyNo, T, SameDelOrUpd, [Data | InsAcc], UpdAcc)
- end.
-
-
-
-
-searchdelete(_Key, _ElemNo, []) ->
- {false, []};
-searchdelete(Key, ElemNo, List) ->
- searchdelete(Key, ElemNo, List, []).
-
-
-
-
-
-searchdelete(_Key, _ElemNo, [], Acc) ->
- {false, Acc};
-searchdelete(Key, ElemNo, [Tuple | Tail], Acc) ->
- % We don't use standard libraries, 'cause we want to make an 'atomic'
- % operation, i.e., we will not search the list two times...
- case (element(ElemNo, Tuple) =:= Key) of
- true ->
- {true, Acc ++ Tail}; % Return the list without the matching element
- _Other ->
- searchdelete(Key, ElemNo, Tail, [Tuple | Acc])
- end.
-
-
-
-
-
-
-
-dblist2list([]) ->
- [];
-dblist2list([{Data, _Color} | T]) ->
- [Data | dblist2list(T)].
-
-
-
-
-
-
-
-list2dblist([], _Color) ->
- [];
-list2dblist([Data | T], Color) ->
- [{Data, Color} | list2dblist(T, Color)].
-
-
-
-
-
-
-
-
-update_colors([]) ->
- [];
-update_colors([{Data, Color} | T]) ->
- [{Data, new_color(Color)} | update_colors(T)].
-
-
-
-
-
-
-
-
-new_color(?GREEN1) ->
- ?GREEN2;
-new_color(?GREEN2) ->
- ?GREEN3;
-new_color(?GREEN3) ->
- ?GREEN4;
-new_color(?GREEN4) ->
- ?GREEN5;
-new_color(?GREEN5) ->
- ?DEFAULT_BTN_COLOR;
-new_color(?RED1) ->
- ?RED2;
-new_color(?RED2) ->
- ?RED3;
-new_color(?RED3) ->
- ?RED4;
-new_color(?RED4) ->
- ?RED5;
-new_color(?RED5) ->
- ?DEFAULT_BTN_COLOR;
-new_color(_Other) ->
- ?DEFAULT_BTN_COLOR. % Default shall be gray.
-
-
-
-
-
-
-
-
-compute_elapsed_seconds({H1, M1, S1}, {H2, M2, S2}) ->
- ElapsedHours = get_time_diff(hours, H1, H2),
- ElapsedMinutes = get_time_diff(minutes, M1, M2),
- ElapsedSeconds = get_time_diff(seconds, S1, S2),
- (ElapsedHours * 3600) + (ElapsedMinutes * 60) + ElapsedSeconds + 1.
-
-
-
-
-
-
-
-get_time_diff(_Type, T1, T2) when T1 =< T2 ->
- T2 - T1;
-get_time_diff(hours, T1, T2) ->
- T2 + 24 - T1;
-get_time_diff(minutes, T1, T2) ->
- T2 + 60 - T1;
-get_time_diff(seconds, T1, T2) ->
- T2 + 60 - T1.
-
-
-
-
-split(_N, []) ->
- {[], []};
-split(0, List) ->
- {[], List};
-split(N, List) ->
- split2(0, N - 1, [], List).
-
-
-
-split2(Ctr, N, Acc, [H | T]) when Ctr < N ->
- split2(Ctr + 1, N, [H | Acc], T);
-split2(_Ctr, _N, Acc, []) ->
- {lists:reverse(Acc), []};
-split2(_Ctr, _N, Acc, List) ->
- {lists:reverse(Acc), List}.
-
-basetype(ordered_set) ->
- set;
-basetype(Any) ->
- Any.
diff --git a/lib/tv/src/tv_db_int_def.hrl b/lib/tv/src/tv_db_int_def.hrl
deleted file mode 100644
index d2cb8adee5..0000000000
--- a/lib/tv/src/tv_db_int_def.hrl
+++ /dev/null
@@ -1,80 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the database part of the table
-%%% tool.
-%%%
-%%%*********************************************************************
-
--define(WHITE, {255, 255, 255}).
--define(MEDIUM_GRAY, {170, 170, 170}).
-
-
--define(LIGHT_GREEN, { 0, 255, 0}).
--define(GREEN, { 50, 215, 50}).
--define(DARK_GREEN, { 50, 170, 50}).
--define(FOREST_GREEN, { 34, 139, 34}).
--define(DARK_FOREST_GREEN, { 15, 100, 15}).
-
-
-
--define(RED, {255, 0, 0}).
--define(PINK, {255, 130, 170}).
--define(LIGHT_VIOLET, {220, 150, 225}).
--define(VIOLET, {160, 70, 180}).
--define(DARK_VIOLET, {100, 10, 130}).
-
-
-
-
-
-
--record(db_data, {db = [], % List containing all elements
- db_size = 0, % Number of elements in 'db'
- max_elem_size = 0, % Size of largest element in db.
- hidden = [], % Elements (i.e., keys) not to be shown
- deleted = [], % Elements just deleted
- subset_size, % Size of the subset to be extracted and
- % shown
- subset_pos, % Position in list where subset starts
- sorting = false, % Tells whether sorting is used ('true'
- % or 'false')
- requested_row = 0,
- rev_sorting = false, % Tells whether the sorting (if any) is
- % in reversed order or not ('true' or
- % 'false')
- sort_key_no, % Element in each tuple to use as sorting
- % element
- key_no, % Element in each tuple to use as key
- % (this element is used when updating the
- % dblist, i.e., inserting, deleting a.s.o)
- ets_type % 'bag' or 'set'
- }).
-
-
--record(process_variables, {master_pid,
- etsread_pid,
- db_data = #db_data{},
- list_of_keys = [],
- lists_as_strings = true
- }).
-
-
-
-
diff --git a/lib/tv/src/tv_db_search.erl b/lib/tv/src/tv_db_search.erl
deleted file mode 100644
index edfa57df04..0000000000
--- a/lib/tv/src/tv_db_search.erl
+++ /dev/null
@@ -1,475 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Code for the search window.
-%%%
-%%%*********************************************************************
--module(tv_db_search).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,radiobutton,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([create_window/1,
- resize_window/1,
- reset_window/1,
- destroy_window/1,
- mark_busy/1,
- mark_nonbusy/1,
- get_input_and_search/3,
- update_search/4,
- string_to_term/1
- ]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_db_int_def.hrl").
-
-
-
-
--define(WIN_WIDTH, 445).
--define(SMALL_WIN_HEIGHT, 117).
--define(BIG_WIN_HEIGHT, 335).
--define(FRAME_WIDTH, 429). % 334
--define(OLD_FRAME_WIDTH, 334).
--define(FRAME_HEIGHT, 105).
--define(FRAME_XPOS, (10-2)).
--define(FRAME_YPOS, 10).
--define(ENTRY_XPOS, 9).
--define(ENTRY_YPOS, 31).
--define(ENTRY_WIDTH, (?OLD_FRAME_WIDTH-10-2*?ENTRY_XPOS-5)).
--define(LISTBOX_WIDTH, ?WIN_WIDTH-2*?FRAME_XPOS+1).
--define(LISTBOX_HEIGHT, 162).
--define(LISTBOX_XPOS, ?FRAME_XPOS-2).
--define(LISTBOX_YPOS, ?SMALL_WIN_HEIGHT+8).
--define(BTN_WIDTH, 80).
--define(BTN_HEIGHT, 30).
--define(BTN_XPOS, ?OLD_FRAME_WIDTH-6).
--define(BG_COLOUR, {217,217,217}).
-
-
-
-
-
-
-create_window(true) ->
- gs:config(win, [raise]);
-create_window(false) ->
- gs:window(win, gs:start(), [{width,?WIN_WIDTH},
- {height,?SMALL_WIN_HEIGHT},
- {data,small},
- {bg,?BG_COLOUR},
- {title,"[TV] Search Object"},
- {destroy,true},
- {configure,true},
- {cursor,arrow}
- ]),
-
- F = gs:frame(win, [{width,?FRAME_WIDTH},
- {height,?FRAME_HEIGHT},
- {x,?FRAME_XPOS},
- {y,?FRAME_YPOS},
- {bw,2},
- {bg,?BG_COLOUR}
- ]),
-
- gs:label(F, [{width,80},
- {height,25},
- {x,?ENTRY_XPOS+2},
- {y,8},
- {align,w},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}},
- {label, {text,"Search for:"}}
- ]),
-
- gs:entry(entry, F, [{width,?ENTRY_WIDTH},
- {height,30},
- {x,?ENTRY_XPOS},
- {y,?ENTRY_YPOS},
- {insert, {0,"<Search expression>"}},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {cursor,text},
- {justify,left},
- {keypress,true},
- {setfocus,true}
- ]),
-
- Group = list_to_atom("expr" ++ pid_to_list(self())),
- RadioWidth = round(?ENTRY_WIDTH / 2),
- gs:radiobutton(expr_term, F, [{width,RadioWidth - 45},
- {height,25},
- {x,?ENTRY_XPOS},
- {y,?ENTRY_YPOS+40},
- {group,Group},
- {align, c},
- {label,{text,"as term"}},
- {select,true}
- ]),
- gs:radiobutton(expr_regexp, F, [{width,RadioWidth + 45},
- {height,25},
- {x,?ENTRY_XPOS+RadioWidth-20-26},
- {y,?ENTRY_YPOS+40},
- {group,Group},
- {align,c},
- {label,{text,"as regular expression"}}
- ]),
-
- gs:button(search, F, [{width,?BTN_WIDTH},
- {height,?BTN_HEIGHT},
- {x,?BTN_XPOS},
- {y,11},
- {label, {text,"Search"}},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- gs:button(cancel, F, [{width,?BTN_WIDTH},
- {height,?BTN_HEIGHT},
- {x,?BTN_XPOS},
- {y,?BTN_HEIGHT+11+10},
- {label, {text,"Cancel"}},
- {data,cancel},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- expand_window(),
- gs:config(entry, [{select, {0,1000}}]),
- gs:config(win, [{map,true}]).
-
-
-
-
-resize_window(false) ->
- done;
-resize_window(true) ->
- gs:config(win, [{width,?WIN_WIDTH},
- {height,?BIG_WIN_HEIGHT}
- ]).
-
-
-
-
-reset_window(false) ->
- done;
-reset_window(true) ->
- gs:config(listbox, [clear]),
- gs:config(objects_found, [{label, {text,""}}]).
-
-
-
-
-destroy_window(false) ->
- done;
-destroy_window(true) ->
- gs:destroy(win).
-
-
-
-mark_busy(false) ->
- done;
-mark_busy(true) ->
- gs:config(win, [{cursor,busy}]),
- gs:config(entry, [{cursor,busy}]).
-
-
-
-
-mark_nonbusy(false) ->
- done;
-mark_nonbusy(true) ->
- gs:config(win, [{cursor,arrow}]),
- gs:config(entry, [{cursor,text}]).
-
-
-
-
-get_input_and_search(DbList, IsRegExp, ListAsStr) ->
- get_input_and_search(DbList, IsRegExp, true, ListAsStr).
-
-
-
-
-get_input_and_search(DbList, IsRegExp, Notify, ListAsStr) ->
- Str = get_entry_text(),
- StrConvRes = case IsRegExp of
- true ->
- string_to_regexp(Str);
- false ->
- string_to_term(Str)
- end,
-
- case StrConvRes of
- {ok, TermOrRE} ->
- search(IsRegExp, TermOrRE, DbList, ListAsStr);
- {error, {_Reason, Msg}} when Notify ->
- gs:config(win, [beep]),
- tv_utils:notify(win, "TV Notification", Msg);
- {error, {_Reason, _Msg}} ->
- done
- end.
-
-
-
-update_search(false, _DbList, _IsRegExp, _ListAsStr) ->
- done;
-update_search(true, DbList, true, ListAsStr) ->
- get_input_and_search(DbList, false, false, ListAsStr);
-update_search(true, DbList, false, ListAsStr) ->
- get_input_and_search(DbList, true, false, ListAsStr).
-
-
-
-get_entry_text() ->
- gs:read(entry,text).
-
-
-
-string_to_regexp(Str) ->
- case re:compile(Str) of
- {ok, RegExp} ->
- {ok, RegExp};
- {error, _Error} ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_regexp, "Please enter a regular expression!"}};
- haiku ->
- {error, {not_a_regexp, ["Being incorrect",
- "The regular expression",
- "Must now be retyped."]}}
- end
- end.
-
-
-
-string_to_term(Str) ->
- case catch erl_scan:string(Str ++ ". ") of
- {ok, ScannedStr, _No} ->
- case erl_parse:parse_term(ScannedStr) of
- {ok, Term} ->
- {ok, Term};
- _Other ->
- %% May be a PID, have to check this, since erl_scan
- %% currently cannot handle this case... :-(
- case catch list_to_pid(Str) of
- Pid when is_pid(Pid) ->
- {ok, Pid};
- _Error ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_term, "Please enter a valid term!"}};
- haiku ->
- {error, {not_a_term, ["Aborted effort.",
- "Reflect, repent and retype:",
- "Enter valid term."]}}
- end
- end
- end;
- _Error ->
- case get(error_msg_mode) of
- normal ->
- {error, {not_a_term, "Please enter a valid term!"}};
- haiku ->
- {error, {not_a_term, ["Aborted effort.",
- "Reflect, repent and retype:",
- "Enter valid term."]}}
- end
- end.
-
-
-
-search(IsRegExp, SearchValue, DbList, ListAsStr) ->
- gs:config(cancel, [{label, {text,"Stop"}}]),
- mark_busy(true),
- reset_window(true),
- SearchRes = traverse(SearchValue, DbList, 1, length(DbList), [], IsRegExp, ListAsStr),
- gs:config(cancel, [{label, {text,"Cancel"}}]),
- mark_nonbusy(true),
- SearchRes.
-
-
-
-
-
-expand_window() ->
- gs:listbox(listbox, win, [{width,?LISTBOX_WIDTH},
- {height,?LISTBOX_HEIGHT},
- {x,?LISTBOX_XPOS},
- {y,?LISTBOX_YPOS},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {scrollbg,?BG_COLOUR},
- {scrollfg,?BG_COLOUR},
- {hscroll,bottom},
- {vscroll,right},
- {click,true},
- {doubleclick,false},
- {selectmode,single}
- ]),
- gs:label(objects_found, win, [{width,?LISTBOX_WIDTH},
- {height,25},
- {x,?LISTBOX_XPOS},
- {y,?LISTBOX_YPOS+?LISTBOX_HEIGHT+13},
- {align,w},
- {bg,?BG_COLOUR},
- {fg, {0,0,0}}
- ]),
- gs:config(win, [{width,?WIN_WIDTH},
- {height,?BIG_WIN_HEIGHT}
- ]).
-
-
-
-
-
-
-
-traverse(Pattern, [Object | T], Row, Length, Acc, IsRegExp, ListAsStr) ->
- SearchRes =
- case IsRegExp of
- true ->
- search_for_regexp(Pattern, Object, ListAsStr);
- false ->
- compare_terms(Pattern, Object)
- end,
-
- NewAcc
- = case SearchRes of
- found ->
- RowStr = integer_to_list(Row),
- LengthStr = integer_to_list(Length),
- ObjectStr = case ListAsStr of
- true ->
- lists:flatten(tv_io_lib:format("~p", [Object]));
- false ->
- lists:flatten(tv_io_lib:write(Object))
- end,
-
- gs:config(listbox,
- [{add,
- " Row " ++ RowStr ++ ":" ++
- lists:duplicate(length(LengthStr)-length(RowStr), " ") ++
- " " ++ ObjectStr}
- ]),
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(length(Acc)+1) ++
- " object(s) found"}}
- ]),
- [{Row,Object} | Acc];
- not_found ->
- Acc
- end,
- receive
- {gs,cancel,click,_Data,_Args} ->
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(gs:read(listbox,size)) ++
- " object(s) found"}}
- ]),
- lists:reverse(NewAcc)
- after
- 0 ->
- traverse(Pattern, T, Row+1, Length, NewAcc, IsRegExp, ListAsStr)
- end;
-traverse(_Pattern, [], _N, _Length, Acc, _IsRegExp, _ListAsStr) ->
- gs:config(objects_found,
- [{label,
- {text,integer_to_list(gs:read(listbox,size)) ++
- " object(s) found"}}
- ]),
- lists:reverse(Acc).
-
-
-
-
-search_for_regexp(Pattern, Elem, ListAsStr) ->
- ListToSearch =
- case ListAsStr of
- true ->
- lists:flatten(tv_io_lib:format("~p", [Elem]));
- false ->
- lists:flatten(tv_io_lib:write(Elem))
- end,
-
- case re:run(ListToSearch, Pattern, [{capture,none}]) of
- match ->
- found;
- nomatch ->
- not_found
- end.
-
-
-
-
-
-compare_terms(Term, Elem) when not is_tuple(Elem), not is_list(Elem), Term =/= Elem ->
- not_found;
-compare_terms(Term, Term) ->
- %% Even the case Term = "{}" or "[]"!!!
- found;
-compare_terms(Term, Elem) when is_list(Elem) ->
- traverse_list(Term, Elem);
-compare_terms(Term, Elem) when is_tuple(Elem) ->
- traverse_tuple(Term, Elem, 1, size(Elem)).
-
-
-
-
-
-traverse_tuple(Pattern, Tuple, N, Stop) when N =< Stop ->
- Elem = element(N,Tuple),
- case compare_terms(Pattern, Elem) of
- found ->
- found;
- not_found ->
- traverse_tuple(Pattern, Tuple, N+1, Stop)
- end;
-traverse_tuple(_Pattern, _Tuple, N, Stop) when N > Stop ->
- not_found.
-
-
-
-
-
-
-traverse_list(Pattern, [H | T]) ->
- case compare_terms(Pattern, H) of
- found ->
- found;
- not_found ->
- traverse_list(Pattern, T)
- end;
-traverse_list(_Pattern, []) ->
- not_found.
-
diff --git a/lib/tv/src/tv_db_sort.erl b/lib/tv/src/tv_db_sort.erl
deleted file mode 100644
index 3675c7b413..0000000000
--- a/lib/tv/src/tv_db_sort.erl
+++ /dev/null
@@ -1,141 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_db_sort).
-
-
-
--export([mergesort/3, merge/4, get_compare_value/2]).
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-
-mergesort(_KeyNo, [X], _ReverseOrder) ->
- [X];
-mergesort(_KeyNo, [], _ReverseOrder) ->
- [];
-mergesort(KeyNo, X, ReverseOrder) ->
- split(KeyNo, X, [], [], ReverseOrder).
-
-
-
-
-
-
-
-
- %% If we want reverse order when just merging two lists,
- %% each of them has to be in reverse order first!
-
-merge(KeyNo, [{E1, C1} | T1], [{E2, C2} | T2], Reverse) when not Reverse ->
- K1 = get_compare_value(KeyNo, E1),
- K2 = get_compare_value(KeyNo, E2),
- case get_correct_order(K1, E1, K2, E2) of
- {1, 2} ->
- [{E1, C1} | merge(KeyNo, T1, [{E2, C2} | T2], Reverse)];
- {2, 1} ->
- [{E2, C2} | merge(KeyNo, [{E1, C1} | T1], T2, Reverse)]
- end;
-merge(KeyNo, [{E1, C1} | T1], [{E2, C2} | T2], Reverse) ->
- K1 = get_compare_value(KeyNo, E1),
- K2 = get_compare_value(KeyNo, E2),
- case get_correct_order(K1, E1, K2, E2) of
- {1, 2} ->
- [{E2, C2} | merge(KeyNo, [{E1, C1} | T1], T2, Reverse)];
- {2, 1} ->
- [{E1, C1} | merge(KeyNo, T1, [{E2, C2} | T2], Reverse)]
- end;
-merge(_KeyNo, [], L2, _Reverse) -> % L2 may be the empty list also!
- L2;
-merge(_KeyNo, L1, [], _Reverse) -> % L1 may be the empty list also!
- L1.
-
-
-
-
-
-
-get_compare_value(KeyNo, E) when is_tuple(E) ->
- case catch element(KeyNo, E) of
- {'EXIT', {badarg, {?MODULE, get_compare_value, [KeyNo, E]}}} ->
- short_tuple;
- V ->
- {tuple, V}
- end;
-get_compare_value(_KeyNo, _E) ->
- no_tuple.
-
-
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-split(KeyNo, [A,B|T], X, Y, Reverse) ->
- split(KeyNo, T, [A|X], [B|Y], Reverse);
-split(KeyNo, [H], X, Y, Reverse) ->
- split(KeyNo, [], [H|X], Y, Reverse);
-split(KeyNo, [], X, Y, Reverse) ->
- merge(KeyNo,
- mergesort(KeyNo, X, Reverse),
- mergesort(KeyNo, Y, Reverse),
- Reverse).
-
-
-
-
-
-
-get_correct_order({tuple, V1}, _E1, {tuple, V2}, _E2) when V1 < V2 ->
- {1, 2};
-get_correct_order({tuple, _V1}, _E1, {tuple, _V2}, _E2) ->
- {2, 1};
-get_correct_order(short_tuple, _E1, {tuple, _V2}, _E2) ->
- {1, 2};
-get_correct_order({tuple, _V1}, _E1, short_tuple, _E2) ->
- {2, 1};
-get_correct_order(short_tuple, E1, short_tuple, E2) when E1 < E2 ->
- {1, 2};
-get_correct_order(short_tuple, _E1, short_tuple, _E2) ->
- {2, 1};
-get_correct_order(no_tuple, E1, no_tuple, E2) when E1 < E2 ->
- {1, 2};
-get_correct_order(no_tuple, _E1, no_tuple, _E2) ->
- {2, 1};
-get_correct_order(_Anything, _E1, no_tuple, _E2) -> % Tuples first, then other
- {1, 2}; % terms in correct order!
-get_correct_order(no_tuple, _E1, _Anything, _E2) ->
- {2, 1}.
diff --git a/lib/tv/src/tv_ets_rpc.erl b/lib/tv/src/tv_ets_rpc.erl
deleted file mode 100644
index ec2fde30ac..0000000000
--- a/lib/tv/src/tv_ets_rpc.erl
+++ /dev/null
@@ -1,140 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_ets_rpc).
-
-
-
--export([all/2,
- info/4,
- new/4,
- tab2list/3,
- insert/4,
- lookup/4,
- delete/4
- ]).
-
-
-
-
-all(_Node, true) ->
- chk(catch ets:all());
-all(Node, false) ->
- chk(catch rpc:block_call(Node, ets, all, [])).
-
-
-
-
-info(_Node, true, TabId, What) ->
- chk(catch ets:info(TabId, What));
-info(Node, false, TabId, What) ->
- chk(catch rpc:block_call(Node, ets, info, [TabId, What])).
-
-
-
-
-new(_Node, true, TabName, Options) ->
- case catch ets:new(TabName, Options) of
- {TabName, Pid} when is_pid(Pid) ->
- {TabName,Pid};
- {TabNo, Pid} when is_pid(Pid) ->
- {TabNo,Pid};
- OtherResult ->
- chk(OtherResult)
- end;
-new(Node, false, TabName, Options) ->
- case catch rpc:block_call(Node, ets, new, [TabName, Options]) of
- {TabName, Pid} when is_pid(Pid) ->
- {TabName,Pid};
- {TabNo, Pid} when is_pid(Pid) ->
- {TabNo, Pid};
- OtherResult ->
- chk(OtherResult)
- end.
-
-
-
-
-tab2list(_Node, true, TabId) ->
- chk(catch ets:tab2list(TabId));
-tab2list(Node, false, TabId) ->
- chk(catch rpc:call(Node, ets, tab2list, [TabId])).
-
-
-
-
-insert(_Node, true, TabId, Object) ->
- chk(catch ets:insert(TabId, Object));
-insert(Node, false, TabId, Object) ->
- chk(catch rpc:call(Node, ets, insert, [TabId, Object])).
-
-
-
-
-lookup(_Node, true, TabId, Key) ->
- chk(catch ets:lookup(TabId, Key));
-lookup(Node, false, TabId, Key) ->
- chk(catch rpc:call(Node, ets, lookup, [TabId, Key])).
-
-
-
-
-delete(_Node, true, TabId, Key) ->
- chk(catch ets:delete(TabId, Key));
-delete(Node, false, TabId, Key) ->
- chk(catch rpc:call(Node, ets, delete, [TabId, Key])).
-
-
-
-
-chk(Result) ->
- case Result of
- undefined ->
- throw(no_table);
- _Anything when is_list(Result) ->
- Result;
- _Anything when is_atom(Result) ->
- Result;
- _Anything when is_integer(Result) ->
- Result;
- _Anything when is_pid(Result) ->
- Result;
-
- %% Messages received when node is down.
- {badrpc, nodedown} ->
- throw(nodedown);
- {'EXIT', nodedown} ->
- throw(nodedown);
- {'EXIT', {{badarg, {gen, set_monitor_node, _Args}}, _Reason}} ->
- throw(nodedown);
-
- %% Messages received when table doesn't exist.
- {'EXIT', {badarg, {ets,local_info,_Args}}} ->
- %% Due to inconsistencies in R2D and earlier versions:
- %% ets:info/1 returned 'undefined' when table didn't
- %% exist, while ets:info/2 returned the exit-signal
- %% above. This was corrected in R3A - now both functions
- %% return 'undefined' :-)
- throw(no_table);
- {badrpc, {'EXIT', {badarg,_Reason}}} ->
- throw(no_table);
- {'EXIT', {badarg,_Reason}} ->
- throw(no_table);
- Error when is_tuple(Error) ->
- throw({unexpected_error,Error})
- end.
-
diff --git a/lib/tv/src/tv_etsread.erl b/lib/tv/src/tv_etsread.erl
deleted file mode 100644
index 32f111c9a1..0000000000
--- a/lib/tv/src/tv_etsread.erl
+++ /dev/null
@@ -1,770 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Module containing the interface towards ETS tables,
-%%% i.e., handling the polling and thereafter sending the
-%%% result to the database part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_etsread).
--compile([{nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([etsread/2]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-etsread(MasterPid, ErrorMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrorMsgMode),
- blocked(MasterPid).
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-blocked(MasterPid) ->
- receive
- Msg ->
- case Msg of
-
- #etsread_deblock{} ->
- deblock(Msg, MasterPid);
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, MasterPid),
- blocked(MasterPid);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(MasterPid);
-
- _Other ->
- %% io:format("Received signal ~p~n", [_Other]),
- blocked(MasterPid)
- end
- end.
-
-
-
-
-
-
-
-deblock(Msg, MasterPid) ->
- #etsread_deblock{dbs_pid = DbsPid,
- table_type = KindOfTable,
- node = Node,
- local_node = LocalNode,
- table_id = TableId,
- poll_interval = PollInt} = Msg,
- PollInterval = case PollInt of
- infinity ->
- PollInt;
- _Other ->
- PollInt * 1000
- end,
- %% Get table info!
- case catch get_table_info(Node, LocalNode, TableId, KindOfTable) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {Type, Pos, Protection} ->
- MasterPid ! #etsread_deblock_cfm{sender = self(),
- type = Type,
- keypos = Pos,
- protection = Protection
- },
-
- timer:sleep(500),
- case catch read_table(Node, LocalNode, TableId, KindOfTable, DbsPid) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false},
- blocked(MasterPid);
- _ElapsedTime ->
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, PollInterval)
- end
- end.
-
-
-
-
-
-
-get_table_info(Node, LocalNode, TableId, KindOfTable) ->
- case KindOfTable of
- ets ->
- % Check whether table is 'bag' or 'set' type.
- Type = tv_ets_rpc:info(Node, LocalNode, TableId, type),
- % Get position for the key.
- Pos = tv_ets_rpc:info(Node, LocalNode, TableId, keypos),
- Protection = tv_ets_rpc:info(Node, LocalNode, TableId, protection),
- {Type, Pos, Protection};
- mnesia ->
- Type = tv_mnesia_rpc:table_info(Node, LocalNode, TableId, type),
- Pos = 2,
- %% All Mnesia tables are regarded as being public!
- {Type, Pos, public}
- end.
-
-
-
-
-
-
-deblocked_loop(MasterPid,DbsPid,Node,LocalNode,TableId,KindOfTable,PollInterval) ->
- receive
- Msg ->
-
- case Msg of
-
- #etsread_poll_table{} ->
- case catch read_table(Node, LocalNode, TableId, KindOfTable, DbsPid) of
- %% No automatic polling here!
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = false};
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = false};
- _ElapsedTime ->
- done
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, PollInterval);
-
-
- #etsread_set_poll_interval{interval = PollInt} ->
- NewPollInterval = case PollInt of
- infinity ->
- PollInt;
- _Other ->
- PollInt * 1000
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, NewPollInterval);
-
-
- #etsread_deblock{} ->
- deblock(Msg, MasterPid);
-
-
- #etsread_update_object{key_no=KeyNo, object=Obj, old_object=OldObj} ->
- update_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- KeyNo, Obj, OldObj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #etsread_new_object{object=Obj} ->
- new_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- Obj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #etsread_delete_object{object=Obj} ->
- delete_object(KindOfTable, Node, LocalNode, TableId, DbsPid,
- Obj, MasterPid, PollInterval),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- #ip_dead_table{} ->
- AutoPoll = case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll},
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, infinity);
-
-
- #etsread_nodedown{} ->
- AutoPoll = case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll},
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId,
- KindOfTable, infinity);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode, TableId, KindOfTable,
- PollInterval);
-
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, PollInterval)
- end
-
- after PollInterval ->
- %% Automatic polling must be on, otherwise these
- %% lines would never be executed!
- NewPollInterval =
- case catch read_table(Node,LocalNode,TableId,KindOfTable,DbsPid) of
- nodedown ->
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = true},
- infinity;
- no_table ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- mnesia_not_started ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- {unexpected_error,_Reason} ->
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = true},
- infinity;
- ElapsedMilliseconds ->
- if
- (ElapsedMilliseconds * 1000) >= PollInterval ->
- infinity;
- true ->
- PollInterval
- end
- end,
- deblocked_loop(MasterPid, DbsPid, Node, LocalNode,
- TableId, KindOfTable, NewPollInterval)
- end.
-
-
-
-
-
-exit_signals(ExitInfo, MasterPid) ->
- case ExitInfo of
- {MasterPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-update_object(KindOfTable, Node, LocalNode, TableId, DbsPid, KeyNo, Obj, OldObj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case check_record_format(KindOfTable, Node, LocalNode, TableId, Obj) of
- bad_format ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false};
- ok ->
- %% Check that we are allowed to edit the table!
- case catch update_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, KeyNo,
- Obj, OldObj) of
-
- nodedown ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_update_object_cfm{sender = self(),
- success = true}
- end
- end.
-
-
-
-
-
-update_object2(ets, Node, LocalNode, Tab, _DbsPid, KeyNo, Obj, OldObj) ->
- %% We shall update a specific object! If the table is a 'set' table,
- %% it is just to insert the altered object. However, if the table
- %% is a 'bag', or a 'duplicate_bag', we first have to remove the
- %% old object, and then insert the altered one.
- %% But, we aren't finished with that... we also want to preserve
- %% the time order, meaning we have to delete *ALL* objects having the
- %% very same key, and then insert them again! (Actually we would have
- %% to do this anyhow, due to limitations in the interface functions,
- %% but this remark has to be noted!)
- OldKey = element(KeyNo, OldObj),
- InsertList =
- case tv_ets_rpc:info(Node, LocalNode, Tab, type) of
- set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- [Obj];
- ordered_set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- [Obj];
- _Other -> %% 'bag' or 'duplicate_bag'
- OldList = tv_ets_rpc:lookup(Node, LocalNode, Tab, OldKey),
- tv_ets_rpc:delete(Node, LocalNode, Tab, OldKey),
- %% Have to beware of duplicate_bag tables,
- %% i.e., the same object may occur more than
- %% once, but we only want to replace it once!
- {_Replaced, TmpList} =
- lists:foldl(
- fun(Data, {Replaced,Acc}) when Data =/= OldObj ->
- {Replaced, [Data | Acc]};
- (_Data, {Replaced,Acc}) when not Replaced ->
- {true, [Obj | Acc]};
- (Data, {Replaced,Acc}) ->
- {Replaced, [Data | Acc]}
- end,
- {false, []},
- OldList),
- lists:reverse(TmpList)
- end,
- lists:foreach(fun(H) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, H)
- end,
- InsertList),
- ok;
-update_object2(mnesia, Node, LocalNode, Tab, _DbsPid, KeyNo, Obj, OldObj) ->
- OldKey = element(KeyNo, OldObj),
- InsertList =
- case tv_mnesia_rpc:table_info(Node, LocalNode, Tab, type) of
- set ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- [Obj];
- ordered_set ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- [Obj];
- _Other -> %% 'bag' or 'duplicate_bag'
- {atomic, OldList} =
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:read(Tab,OldKey,read)
- end),
- %% We can't use mnesia:delete_object here, because
- %% time order wouldn't be preserved then!!!
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- mnesia:delete(Tab,OldKey,write)
- end),
- ChangeFun =
- fun(H) when H =:= OldObj ->
- Obj;
- (H) ->
- H
- end,
- [ChangeFun(X) || X <- OldList]
- end,
- lists:foreach(fun(H) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:write(Tab,H,write)
- end)
- end,
- InsertList),
- ok.
-
-
-
-
-
-
-delete_object(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case catch delete_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj) of
-
- nodedown ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_delete_object_cfm{sender = self(),
- success = true}
- end.
-
-
-
-
-delete_object2(ets, Node, LocalNode, Tab, _DbsPid, Obj) ->
- KeyNo = tv_ets_rpc:info(Node, LocalNode, Tab, keypos),
- Key = element(KeyNo, Obj),
- InsertList =
- case tv_ets_rpc:info(Node, LocalNode, Tab, type) of
- set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- [];
- ordered_set ->
- %% Have to remove old object, because the key may be what's changed.
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- [];
- _Other -> %% 'bag' or 'duplicate_bag'
- OldList = tv_ets_rpc:lookup(Node, LocalNode, Tab, Key),
- tv_ets_rpc:delete(Node, LocalNode, Tab, Key),
- OldList -- [Obj]
- end,
-
- lists:foreach(fun(H) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, H)
- end,
- InsertList),
- ok;
-delete_object2(mnesia, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:delete_object(Tab,Obj,write)
- end),
- ok.
-
-
-
-
-
-new_object(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj, MasterPid, PollInterval) ->
- AutoPoll =
- case PollInterval of
- infinity ->
- false;
- _Other ->
- true
- end,
- case check_record_format(KindOfTable, Node, LocalNode, TableId, Obj) of
- bad_format ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false};
- ok ->
- %% Check that we are allowed to edit the table!
- case catch new_object2(KindOfTable, Node, LocalNode, TableId, DbsPid, Obj) of
-
- nodedown ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_nodedown{sender = self(),
- automatic_polling = AutoPoll};
-
- no_table ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- mnesia_not_started ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- {unexpected_error,_Reason} ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = false},
- MasterPid ! #pc_dead_table{sender = self(),
- automatic_polling = AutoPoll};
-
- ok ->
- DbsPid ! #etsread_new_object_cfm{sender = self(),
- success = true}
- end
- end.
-
-
-
-
-
-new_object2(ets, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_ets_rpc:insert(Node, LocalNode, Tab, Obj),
- ok;
-new_object2(mnesia, Node, LocalNode, Tab, _DbsPid, Obj) ->
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:write(Tab,Obj,write)
- end),
- ok.
-
-
-
-
-
-check_record_format(mnesia, Node, LocalNode, Tab, Obj) ->
- Arity = tv_mnesia_rpc:table_info(Node, LocalNode, Tab, arity),
- case size(Obj) of
- Arity ->
- ok;
- _Other ->
- gs:window(etsreadwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(etsreadwin, "TV Notification",
- ["The record is not complete,",
- "too few fields are specified!"]);
- haiku ->
- tv_utils:notify(etsreadwin, "TV Notification",
- ["The attempt to change",
- "The specified record size",
- "Is simply ignored."])
- end,
- gs:destroy(etsreadwin),
- bad_format
- end;
-check_record_format(ets, _Node, _LocalNode, _Tab, _Obj) ->
- ok.
-
-
-
-
-
-
-
-read_table(Node, LocalNode, Tab, KindOfTable, DbsPid) ->
- T1 = time(),
-
- {TableContent, ListOfKeys} =
- case KindOfTable of
- ets ->
- {tv_ets_rpc:tab2list(Node, LocalNode, Tab),
- [tv_ets_rpc:info(Node, LocalNode, Tab, keypos)]
- };
- mnesia ->
- %% It may be tempting to use Mnesia event subscription,
- %% but will this really save the day? The main drawback
- %% is that we will then have to update the table copy we
- %% store internally in two different ways: one for the
- %% Mnesia tables, and one for the ETS tables. Also, if
- %% the Mnesia tables are frequently updated, this will
- %% cause TV to work all the time too (either updating the
- %% table copy for each inserted/deleted object, or storing
- %% these objects until polling is ordered). To make this
- %% work smoothly requires a bit of work...
- %% The second drawback is that it doesn't seem clear in all
- %% circumstances how the subscription actually works - i.e.,
- %% if we only use subscriptions, can we actually be sure that
- %% the *real* state of the table is the same as the one kept
- %% in TV? For example, imagine the scenario that Mnesia is
- %% stopped, all Mnesia directories are removed (from the UNIX
- %% shell), and then Mnesia once again is started. The first
- %% problem is that we have to check for start/stop of Mnesia,
- %% the second is that we then have to rescan the actual table.
- %% The logic for this may require som effort to write!
- %% Also, what will happen if the table is killed/dies?
- %% Will we get messages for each element in the table?
- %% (I havent't checked this last issue, this is just som thoughts.)
- %% And generally, there is always a risk that a message is lost,
- %% which will result in TV showing an erroneous table content.
- %%
- %% All in all, using Mnesia subscriptions *may* be a sub-optimization.
- %% The current solution works fine, is also easy to control, and is
- %% mainly the same for both ETS and Mnesia tables.
- %% My suggestion is that it is used until someone actually complains
- %% about the polling time being too long for huge tables! :-)
- %% (However, it shall be emphasized that it is this module that
- %% actually polls the Mnesia/ETS tables, meaning that it is
- %% mainly this module that has to be modified, should the usage of
- %% subscriptions be desired. The other module that has to be modified
- %% is the one maintaining the internal copy of the table.)
- WildPattern = tv_mnesia_rpc:table_info(Node,LocalNode,Tab,wild_pattern),
- {atomic, Content} =
- tv_mnesia_rpc:transaction(
- Node,
- LocalNode,
- fun() ->
- %% This mnesia call shall not be distributed,
- %% since the transaction sees to that it is
- %% executed on the right node!!!
- mnesia:match_object(Tab, WildPattern, read)
- end),
- {Content, [2 | tv_mnesia_rpc:table_info(Node, LocalNode,Tab, index)]}
- end,
-
- T2 = time(),
-
- ElapsedTime = compute_elapsed_seconds(T1, T2),
-
- DbsPid ! #dbs_new_data{sender = self(),
- data = TableContent,
- keys = ListOfKeys,
- time_to_read_table = ElapsedTime
- },
-
- ElapsedTime.
-
-
-
-
-
-
-
-compute_elapsed_seconds({H1, M1, S1}, {H2, M2, S2}) ->
- ElapsedHours = get_time_diff(hours, H1, H2),
- ElapsedMinutes = get_time_diff(minutes, M1, M2),
- ElapsedSeconds = get_time_diff(seconds, S1, S2),
- (ElapsedHours * 3600) + (ElapsedMinutes * 60) + ElapsedSeconds + 1.
-
-
-
-
-
-get_time_diff(_Type, T1, T2) when T1 =< T2 ->
- T2 - T1;
-get_time_diff(hours, T1, T2) ->
- T2 + 24 - T1;
-get_time_diff(minutes, T1, T2) ->
- T2 + 60 - T1;
-get_time_diff(seconds, T1, T2) ->
- T2 + 60 - T1.
diff --git a/lib/tv/src/tv_info.erl b/lib/tv/src/tv_info.erl
deleted file mode 100644
index c744888c38..0000000000
--- a/lib/tv/src/tv_info.erl
+++ /dev/null
@@ -1,884 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_info).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,listbox,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([info/6
- ]).
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
-
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
--record(card_field_ids, {parent_pid,
- window_id,
- window_frame,
- table_id,
- table_type,
- table_name,
- named_table,
- owner_pid,
- owner_name,
- bag_or_set,
- arity,
- attributes,
- wild_pattern,
- keypos,
- index,
- snmp,
- protection,
- size,
- memory,
- storage_type,
- disc_copies,
- where_to_read,
- ram_copies,
- disc_only_copies,
- where_to_write,
- checkpoints,
- node
- }).
-
-
-
--define(WINDOW_WIDTH, 580).
--define(WINDOW_HEIGHT, 430).
-
-
-
--define(MNESIA_INFO_ITEMS, [type,
- arity,
- attributes,
- index,
- size,
- memory,
- storage_type,
- where_to_read,
- disc_copies,
- disc_only_copies,
- ram_copies,
- where_to_write,
- checkpoints
- ]).
-
-
-
-
-info(Master, Node, LocalNode, TabId, TabType, ErrMsgMode) ->
- process_flag(trap_exit,true),
- WinId = create_window(),
- {CardIds, MaskLabel} = init(Master, Node, LocalNode, TabId, TabType, WinId),
- put(error_msg_mode, ErrMsgMode),
- gs:config(WinId, [{map, true}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType).
-
-
-
-
-
-
-create_window() ->
- WinWidth = ?WINDOW_WIDTH,
- WinHeight = ?WINDOW_HEIGHT,
- Win = gs:window(win, gs:start(), [{width, WinWidth},
- {height, WinHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {destroy, true},
- {configure, true},
- {keypress, true}
- ]),
-
- MenubarId = gs:create(menubar, Win, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " File "}},
- {underline, 1}
- ]),
- Obutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " Options "}},
- {underline, 1}
- ]),
-
- % Create the actual menu!
- FMenu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- OMenu = gs:create(menu, Obutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- gs:create(menuitem, FMenu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Close Ctrl-C "}},
- {data, close_menu},
- {underline, 1}
- ]),
- gs:create(menuitem, OMenu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Refresh Ctrl-R "}},
- {data, update},
- {underline, 1}
- ]),
- Win.
-
-
-
-
-
-
-
-
-init(Master, Node, LocalNode, TabId, TabType, WinId) ->
- WinWidth = ?WINDOW_WIDTH,
- WinHeight = ?WINDOW_HEIGHT,
-
- WinFrame = gs:frame(WinId, [{width, WinWidth},
- {height, WinHeight},
- {x, 0},
- {y, 30},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, 0}
- ]),
-
- TableIdFlap = create_flap(1, "Table Id", WinFrame),
- BasicSettingsFlap = create_flap(2, "Basic Settings", WinFrame),
- SizeFlap = create_flap(3, "Size", WinFrame),
- StorageFlap = create_flap(4, "Storage", WinFrame),
-
- TableIdCard = create_card(WinFrame, TableIdFlap),
- BasicSettingsCard = create_card(WinFrame, BasicSettingsFlap),
- SizeCard = create_card(WinFrame, SizeFlap),
- StorageCard = create_card(WinFrame, StorageFlap),
-
-
- set_flap_label(TableIdFlap, "Table Id"),
- set_flap_label(BasicSettingsFlap, "Basic Settings"),
- set_flap_label(SizeFlap, "Size"),
- set_flap_label(StorageFlap, "Storage"),
-
-
- gs:config(TableIdCard, [raise]),
-
- CardIds = print_cards(TabType, TableIdCard, BasicSettingsCard, SizeCard, StorageCard),
-
- {_CardId, FirstMaskXpos} = gs:read(TableIdFlap, data),
- Mask = gs:label(WinFrame, [{width, gs:read(TableIdFlap, width) - 2 * gs:read(TableIdFlap, bw) + 1},
- {height, gs:read(TableIdCard, bw)},
- {x, FirstMaskXpos},
- {y, gs:read(TableIdCard, y)},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
-
- update_info_flaps(TabType, Node, LocalNode, TabId, CardIds, Master),
- {CardIds#card_field_ids{parent_pid = Master,
- window_id = WinId,
- window_frame = WinFrame}, Mask}.
-
-
-
-
-
-check_node(OldNode, LocalNode) ->
- HomeNode = node(),
- case net_adm:ping(OldNode) of
- pong ->
- OldNode;
- pang when LocalNode ->
- %% The system has gone either distributed or undistributed.
- %% No matter which, HomeNode tells the current correct node.
- HomeNode;
- pang ->
- OldNode
- end.
-
-
-
-
-
-
-update_data_field(notext, {label, Id}) ->
- gs:config(Id, [{label, {text, "" }}]);
-update_data_field(notext, {listbox, Id}) ->
- gs:config(Id, [{items, []}]);
-update_data_field({Data}, {label, Id}) ->
- gs:config(Id, [{label, {text, " " ++ lists:flatten(io_lib:write(Data))}}]);
-update_data_field({Data}, {listbox, Id}) ->
- gs:config(Id, [{items, lists:map(fun(E) -> " " ++ lists:flatten(io_lib:write(E))
- end, Data)}]).
-
-
-
-
-print_info(mnesia, Node, LocalNode, TabId, CardIds) ->
- update_data_field({mnesia},
- CardIds#card_field_ids.table_type),
- update_data_field({TabId},
- CardIds#card_field_ids.table_name),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, type)},
- CardIds#card_field_ids.bag_or_set),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, arity) - 1},
- CardIds#card_field_ids.arity),
-
- AttributesList = tv_mnesia_rpc:table_info(Node, LocalNode, TabId, attributes),
- update_data_field({AttributesList},
- CardIds#card_field_ids.attributes),
- update_data_field({lists:map(fun(N) ->
- lists:nth(N - 1, AttributesList)
- end,
- [2] ++ tv_mnesia_rpc:table_info(Node,
- LocalNode,
- TabId,
- index)
- )
- },
- CardIds#card_field_ids.index),
-
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, size)},
- CardIds#card_field_ids.size),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, memory)},
- CardIds#card_field_ids.memory),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, storage_type)},
- CardIds#card_field_ids.storage_type),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_read)},
- CardIds#card_field_ids.where_to_read),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_copies)},
- CardIds#card_field_ids.disc_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, disc_only_copies)},
- CardIds#card_field_ids.disc_only_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, ram_copies)},
- CardIds#card_field_ids.ram_copies),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, where_to_write)},
- CardIds#card_field_ids.where_to_write),
- update_data_field({tv_mnesia_rpc:table_info(Node, LocalNode, TabId, checkpoints)},
- CardIds#card_field_ids.checkpoints),
- {ok, TabId};
-print_info(ets, Node, LocalNode, TabId, CardIds) ->
- update_data_field({ets},
- CardIds#card_field_ids.table_type),
- update_data_field({TabId},
- CardIds#card_field_ids.table_id),
- TabName = tv_ets_rpc:info(Node, LocalNode, TabId, name),
- update_data_field({TabName},
- CardIds#card_field_ids.table_name),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, named_table)},
- CardIds#card_field_ids.named_table),
-
- OwnerPid = tv_ets_rpc:info(Node, LocalNode, TabId, owner),
- OwnerNameSearchResult = lists:keysearch(registered_name,
- 1,
- rpc:block_call(Node,
- erlang,
- process_info,
- [OwnerPid])),
- OwnerName = case OwnerNameSearchResult of
- false ->
- notext;
- {value, {registered_name, WantedName}} ->
- {WantedName}
- end,
- update_data_field({OwnerPid},
- CardIds#card_field_ids.owner_pid),
- update_data_field(OwnerName,
- CardIds#card_field_ids.owner_name),
-
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, keypos)},
- CardIds#card_field_ids.keypos),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, type)},
- CardIds#card_field_ids.bag_or_set),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, protection)},
- CardIds#card_field_ids.protection),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, size)},
- CardIds#card_field_ids.size),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, memory)},
- CardIds#card_field_ids.memory),
- update_data_field({tv_ets_rpc:info(Node, LocalNode, TabId, node)},
- CardIds#card_field_ids.node),
- {ok, TabName}.
-
-
-
-
-
-
-print_cards(mnesia, Card1, Card2, Card3, Card4) ->
- create_card_text(1, "Table Type:", Card1),
- create_card_text(2, "Table Name:", Card1),
-
- create_card_text(1, "Table Type:", Card2),
- create_card_text(2, "Number of Attributes:", Card2),
-% create_card_text(3, "Attribute Names:", Card2),
-% create_card_text(4, "Index Positions:", Card2),
-
- create_card_text(1, "Number of Elements Stored:", Card3),
- create_card_text(2, "Number of Words Allocated:", Card3),
-
- create_card_text(1, "Local Storage Type:", Card4),
- create_card_text(2, "Table Readable at Node:", Card4),
-% create_card_text(3, "Disc Copy Nodes:", Card4),
-% create_card_text(4, "Disc Copy Only Nodes:", Card4),
-% create_card_text(5, "RAM Copy Nodes:", Card4),
-% create_card_text(6, "Active Table Replica Nodes:", Card4),
-% create_card_text(7, "Active Checkpoints:", Card4),
-
- {AttributesId, IndexId} = create_special_fields(mnesia, size_card, Card2),
-
-
- {DiscCopiesId, DiscOnlyCopiesId, RamCopiesId, WhereToWriteId, CheckpointsId} =
- create_special_fields(mnesia, storage_card, Card4),
-
- #card_field_ids{table_name = {label, create_card_data_field(2, Card1)},
- table_type = {label, create_card_data_field(1, Card1)},
- bag_or_set = {label, create_card_data_field(1, Card2)},
- arity = {label, create_card_data_field(2, Card2)},
- attributes = AttributesId,
- index = IndexId,
- size = {label, create_card_data_field(1, Card3)},
- memory = {label, create_card_data_field(2, Card3)},
- storage_type = {label, create_card_data_field(1, Card4)},
- where_to_read = {label, create_card_data_field(2, Card4)},
- disc_copies = DiscCopiesId,
- disc_only_copies = DiscOnlyCopiesId,
- ram_copies = RamCopiesId,
- where_to_write = WhereToWriteId,
- checkpoints = CheckpointsId
- };
-print_cards(ets, Card1, Card2, Card3, Card4) ->
- create_card_text(1, "Table Type:", Card1),
- create_card_text(2, "Table Id:", Card1),
- create_card_text(3, "Table Name:", Card1),
- create_card_text(4, "Table Name Registered:", Card1),
- create_card_text(5, "Process Owning the Table:", Card1),
- create_card_text(6, "Name of Owning Process:", Card1),
-
- create_card_text(1, "Index Position:", Card2),
- create_card_text(2, "Table Type:", Card2),
- create_card_text(3, "Protection Mode:", Card2),
-
- create_card_text(1, "Number of Elements Stored:", Card3),
- create_card_text(2, "Number of Words Allocated:", Card3),
-
- create_card_text(1, "Table Stored at Node:", Card4),
-
- #card_field_ids{table_id = {label, create_card_data_field(2, Card1)},
- table_type = {label, create_card_data_field(1, Card1)},
- table_name = {label, create_card_data_field(3, Card1)},
- named_table = {label, create_card_data_field(4, Card1)},
- owner_pid = {label, create_card_data_field(5, Card1)},
- owner_name = {label, create_card_data_field(6, Card1)},
-
- keypos = {label, create_card_data_field(1, Card2)},
- bag_or_set = {label, create_card_data_field(2, Card2)},
- protection = {label, create_card_data_field(3, Card2)},
-
- size = {label, create_card_data_field(1, Card3)},
- memory = {label, create_card_data_field(2, Card3)},
-
- node = {label, create_card_data_field(1, Card4)}
- }.
-
-
-
-
-
-
-create_special_fields(mnesia, size_card, CardId) ->
- LabelWidth = 195,
- LabelHeight = 24,
- ListboxWidth = 210,
- ListboxHeight = 160,
- VerticalSpacing = 20,
- LXpos = 30,
- RXpos = 330,
- Ypos = 40 + (LabelHeight + VerticalSpacing) * 2 + 25,
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Attribute Names:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, RXpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Attributes Used as Indices:"}}
- ]),
-
- AttributesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, Ypos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- IndexId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, RXpos},
- {y, Ypos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- {{listbox, AttributesId},
- {listbox, IndexId}
- };
-create_special_fields(mnesia, storage_card, CardId) ->
- LabelWidth = 155,
- LabelHeight = 24,
- ListboxHeight = 80,
- ListboxWidth = 170,
- VerticalSpacing = 20,
- LXpos = 10,
- MXpos = 197,
- RXpos = 385,
- % Y-positions for upper and lower row.
- UYpos = 40 + (LabelHeight + VerticalSpacing) * 2,
- LYpos = UYpos + ListboxHeight + 37,
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Disc Copy Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, MXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Disc Only Copy Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, RXpos},
- {y, UYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "RAM Copy Nodes:"}}
- ]),
-
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, LXpos},
- {y, LYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Table Replica Nodes:"}}
- ]),
-
- gs:label(CardId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, MXpos},
- {y, LYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {label, {text, "Active Checkpoints:"}}
- ]),
-
-
- DiscCopiesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- DiscCopiesOnlyId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, MXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- RamCopiesId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, RXpos},
- {y, UYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
-
-
- WhereToWriteId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, LXpos},
- {y, LYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- CheckpointsId = gs:listbox(CardId, [{width, ListboxWidth},
- {height, ListboxHeight},
- {x, MXpos},
- {y, LYpos + LabelHeight - 3},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {hscroll, bottom},
- {vscroll, right},
- {selectmode, single},
- {click, true},
- {doubleclick, true},
- {data, listbox}
- ]),
-
- {{listbox, DiscCopiesId},
- {listbox, DiscCopiesOnlyId},
- {listbox, RamCopiesId},
- {listbox, WhereToWriteId},
- {listbox, CheckpointsId}
- }.
-
-
-
-
-
-
-
-create_card_data_field(N, ParentId) ->
- Width = 345,
- Height = 24,
- VerticalSpacing = 20,
- Xpos = 210,
- Ypos = 40 + (Height + VerticalSpacing) * (N - 1),
-
- BgFrame = gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, {0, 0, 0}},
- {bw, 0}
- ]),
- gs:label(BgFrame, [{width, Width - 2},
- {height, Height - 2},
- {x, 1},
- {y, 1},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {align, w}
- ]).
-
-
-
-
-
-
-create_card_text(N, Text, ParentId) ->
- LabelWidth = 205,
- LabelHeight = 24,
- VerticalSpacing = 20,
- Xpos = 10,
- Ypos = 40 + (LabelHeight + VerticalSpacing) * (N - 1),
- gs:label(ParentId, [{width, LabelWidth},
- {height, LabelHeight},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, w},
- {label, {text, Text}}
- ]).
-
-
-
-
-create_card(ParentId, FlapId) ->
- CardId = gs:frame(ParentId, [{width, 570},
- {height, 360},
- {x, 5},
- {y, 35},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, 2}
- ]),
- FlapXpos = gs:read(FlapId, data),
- gs:config(FlapId, [{data, {CardId, FlapXpos}}
- ]),
- CardId.
-
-
-
-
-
-set_flap_label(ParentId, Text) ->
- Bw = gs:read(ParentId, bw), % It is assumed that the parent is a frame! :-)
- Width = gs:read(ParentId, width) - 2 * Bw - 2,
- Height = gs:read(ParentId, height) - 2 * Bw - 6,
- Xpos = 0,
- Ypos = 0,
- Data = gs:read(ParentId, data),
-
- gs:label(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- % {fg, {178, 34, 34}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {label, {text, Text}},
- {align, center},
- {buttonpress, true},
- {data, Data}
- ]).
-
-
-
-create_flap(N, _Text, ParentId) ->
- Width = 120,
- Height = 40,
- Spacing = 2,
- FirstXpos = 5,
- Xpos = FirstXpos + ((Width + Spacing) * (N - 1)),
- Ypos = 5,
- BorderWidth = 2,
-
- gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, BorderWidth},
- {cursor, hand},
- {buttonpress, true},
- {data, Xpos + BorderWidth}
- ]).
-
-
-
-update_info_flaps(TabType, Node, LocalNode, TabId, CardIds, MasterPid) ->
- case catch print_info(TabType, Node, LocalNode, TabId, CardIds) of
- {ok, TabName} ->
- WinTitle = tv_pc_menu_handling:get_window_title(TabType,Node,TabId,TabName),
- gs:config(win, [{title, "[TV] " ++ WinTitle}]),
- done;
- nodedown ->
- nodedown;
- no_table ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- Msg = ["The table " ++ lists:flatten(io_lib:write(TabId)) ++ " on node",
- lists:flatten(io_lib:write(Node)) ++ " no longer exists!"],
- tv_utils:notify(win, "TV Notification", Msg);
- haiku ->
- Msg = ["Three things are certain:",
- "Death, taxes, and lost tables.",
- "Guess which has occurred."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- MasterPid ! #ip_dead_table{sender = self()};
- mnesia_not_started ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- Msg = ["The table " ++ lists:flatten(io_lib:write(TabId)) ++ " on node",
- lists:flatten(io_lib:write(Node)) ++ " no longer exists!"],
- tv_utils:notify(win, "TV Notification", Msg);
- haiku ->
- Msg = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- MasterPid ! #ip_dead_table{sender = self()};
- {unexpected_error,Reason} ->
- io:format("Unexpected error: ~p~n", [Reason]);
- _Other ->
- io:format("Unexpected return value: ~p~n", [_Other]),
- done
- end.
-
-
-
-
-loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType) ->
- receive
- #info_update_table_info{sender = Sender} ->
- NewNode = check_node(Node, LocalNode),
- update_info_flaps(TabType, NewNode, LocalNode, TabId, CardIds, Sender),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
-
- #info_raise_window{sender = Sender} ->
- gs:config(CardIds#card_field_ids.window_id, [raise]),
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType, NewNode, LocalNode, TabId, CardIds, Sender)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
-
- #info_quit{} ->
- exit(normal);
-
- {gs, _FlapId, buttonpress, {CardId, Xpos}, [1 | _]} ->
- gs:config(CardId, [raise
- ]),
- gs:config(MaskLabel, [raise,
- {x, Xpos}
- ]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _Id, buttonpress, {_CardId, _Xpos}, _Args} ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _LblId, enter, _Data, _Args} ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, WinId, configure, _Data, _Args} ->
- gs:config(WinId, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT}
- ]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, ListboxId, click, listbox, _Args} ->
- gs:config(ListboxId, [{selection, clear}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, ListboxId, doubleclick, listbox, _Args} ->
- gs:config(ListboxId, [{selection, clear}]),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- {gs, _Id, click, update, _Args} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, keypress, _, [r, _, 0, 1 | _]} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, keypress, _, ['R', _, 1, 1 | _]} ->
- NewNode = check_node(Node, LocalNode),
- chk(update_info_flaps(TabType,NewNode,LocalNode,TabId,CardIds,
- CardIds#card_field_ids.parent_pid)),
- loop(CardIds, MaskLabel, NewNode, LocalNode, TabId, TabType);
-
- {gs, _Id, click, close_menu, _Args} ->
- exit(normal);
-
- {gs, _Id, keypress, _, [c, _, 0, 1 | _]} ->
- exit(normal);
-
- {gs, _Id, keypress, _, ['C', _, 1, 1 | _]} ->
- exit(normal);
-
- {gs, _Id, destroy, _Data, _Args} ->
- exit(normal);
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType);
-
- _Other ->
- loop(CardIds, MaskLabel, Node, LocalNode, TabId, TabType)
- end.
-
-
-
-
-
-
-chk(nodedown) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The node is down, and the",
- "table cannot be reached."]);
- haiku ->
- ErrMsg1 = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(win, "TV Notification", ErrMsg1)
- end;
-chk(_Other) ->
- done.
-
diff --git a/lib/tv/src/tv_int_def.hrl b/lib/tv/src/tv_int_def.hrl
deleted file mode 100644
index 6d4263c51b..0000000000
--- a/lib/tv/src/tv_int_def.hrl
+++ /dev/null
@@ -1,56 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the table tool as a whole.
-%%%
-%%%*********************************************************************
-
--define(COMM_FUNC_FILE, tv_comm_func).
-
--define(ITEMS_TO_DISPLAY, 35).
-
-
--define(DEFAULT_BACKGROUND_COLOR, {255, 255, 255}). % white
-
-
-% Colors used for marking updates.
-
--define(BLACK, { 0, 0, 0}).
-
--define(RED1, {255, 0, 0}).
--define(RED2, {255, 100, 100}).
--define(RED3, {255, 150, 150}).
--define(RED4, {255, 200, 200}).
--define(RED5, {235, 217, 217}).
-
-
--define(GREEN1, { 0, 255, 0}).
--define(GREEN2, {115, 255, 135}).
--define(GREEN3, {125, 225, 150}).
--define(GREEN4, {170, 225, 185}).
--define(GREEN5, {195, 219, 202}).
-
--define(DEFAULT_BTN_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_int_msg.hrl b/lib/tv/src/tv_int_msg.hrl
deleted file mode 100644
index 75ce8eca3b..0000000000
--- a/lib/tv/src/tv_int_msg.hrl
+++ /dev/null
@@ -1,504 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: File containing all messages used internally
-%%% between the various table tool components.
-%%%
-%%%*********************************************************************
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PC
-%%%*********************************************************************
-
-
-
--record(pc_raise_window, {sender}).
-
-
-
--record(pc_menu_msg, {sender,
- data}).
-
-
-
--record(pc_win_conf, {sender,
- width,
- height}).
-
-
-
--record(pc_show_table_info, {sender}).
-
-
-
--record(pc_poll_table, {sender}).
-
-
-
--record(pc_select, {sender}).
-
-
-
--record(pc_help, {sender}).
-
-
-
--record(pc_set_sorting_mode, {sender,
- sorting, % 'true' or 'false'
- reverse, % 'true' or 'false',
- sort_key_no = 1
- }).
-
-
-
--record(pc_set_sorting_mode_cfm, {sender,
- sort_key_no
- }).
-
-
-
--record(pc_marked_row, {sender,
- row_no,
- object,
- color
- }).
-
-
-
--record(pc_data_req, {sender,
- element,
- nof_elements
- }).
-
-
-
--record(pc_resend_data, {sender}).
-
-
-
-
--record(pc_data, {sender,
- scale_pos, % vertical scale
- scale_range, % vertical scale
- max_elem_size,
- list_range,
- elementlist,
- marked_row,
- list_of_keys,
- color}).
-
-
-
-
--record(pc_list_info, {sender,
- lists_as_strings}).
-
-
-
--record(pc_dead_table, {sender,
- automatic_polling}).
-
-
-
--record(pc_nodedown, {sender,
- automatic_polling}).
-
-
-
--record(pc_search_req, {sender
- }).
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PD
-%%%*********************************************************************
-
-
-
--record(pd_win_conf, {sender,
- width,
- height}).
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data: sender: Pid of the sender of the message.
-%% win: Id of window to create canvas and scale in.
-%% win_width: width of the window to create the canvas in.
-%% win_height: height of the window to create the canvas in.
-%% scale: whether a scale shall be shown or not.
-%% Possible values: true -- scale is shown.
-%% false -- scale is not shown.
-%%======================================================================
-
--record(pd_deblock, {sender,
- win,
- win_width,
- win_height,
- scale = false,
- range}).
-
-
-
-
--record(pd_deblock_cfm, {sender}).
-
-
-
--record(pd_new_table, {sender,
- table_type,
- table_name,
- record_name, %% Only valid for Mnesia tables.
- writable
- }).
-
-
-
--record(pd_get_sort_settings, {sender,
- sorting,
- reverse
- }).
-
-
-
--record(pd_no_sorting, {sender
- }).
-
-
-
-
--record(pd_ignore, {sender
- }).
-
-
-
-
--record(pd_updated_object, {sender,
- object,
- old_object,
- old_color, %% Tells status of the object, if deleted or present.
- obj_no
- }).
-
-
-
--record(pd_new_object, {sender, %% Used when no row is marked.
- object %% Note: may still be an updated object!
- }).
-
-
-
--record(pd_delete_object, {sender,
- object,
- color
- }).
-
-
-
--record(pd_rec_edit, {sender,
- attributes
- }).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PW
-%%%*********************************************************************
-
-
-
-
--record(pw_deblock, {sender,
- win_title,
- win_width,
- win_height,
- min_win_width,
- min_win_height}).
-
-
-
--record(pw_set_window_title, {sender,
- win_title}).
-
-
-
--record(pw_deblock_cfm, {sender,
- win_id}).
-
-
-
-
-%%======================================================================
-%% Message: pw_create_menu.
-%%
-%% Function: Order to pw to create a menu according to the content of the message.
-%%
-%% Data: menutitle: string containing the name of the menu, e.g., "File".
-%% menulist: list of tuples having the following format:
-%% {Text, Data}, where Text is the string that shall be
-%% written in each menulist item, and Data is optional data,
-%% presumably the name of a function that is to be called
-%% when the corresponding menulist message is received.
-%%======================================================================
-
--record(pw_create_menu, {sender,
- menutitle,
- title_acc_pos,
- menulist}).
-
-
-
--record(pw_create_menu_cfm, {sender}).
-
-
-
--record(pw_select_menu, {sender,
- menu,
- old_menus}).
-
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY DBS
-%%%*********************************************************************
-
-
-
--record(dbs_deblock, {sender,
- etsread_pid,
- type,
- keypos,
- sublist_length}).
-
-
-
--record(dbs_deblock_cfm, {sender}).
-
-
-
-
--record(dbs_new_data, {sender,
- data,
- keys,
- time_to_read_table
- }).
-
-
-
--record(dbs_new_mnesia_data, {sender,
- new_or_changed,
- deleted,
- keys
- }).
-
-
-
--record(dbs_subset, {sender,
- data,
- requested_row,
- subset_pos,
- db_length,
- max_elem_size,
- list_of_keys,
- required_time_etsread,
- required_time_dbs}).
-
-
-
-
-
--record(dbs_subset_req, {sender,
- subset_pos,
- subset_length
- }).
-
-
-
-
--record(dbs_sorting_mode, {sender,
- sorting, % 'true' or 'false'
- reverse, % 'true' or 'false'
- sort_key_no
- }).
-
-
-
--record(dbs_marked_row, {sender,
- row_no
- }).
-
-
-
-
--record(dbs_search_req, {sender
- }).
-
-
-
--record(dbs_updated_object, {sender,
- object,
- old_object,
- old_color,
- obj_no
- }).
-
-
--record(dbs_new_object, {sender,
- object
- }).
-
-
--record(dbs_delete_object, {sender,
- object,
- color,
- obj_no
- }).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY ETSREAD
-%%%*********************************************************************
-
-
-
--record(etsread_update_object, {sender,
- object,
- old_object,
- key_no
- }).
-
--record(etsread_update_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_new_object, {sender,
- object
- }).
-
-
--record(etsread_new_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_delete_object, {sender,
- object,
- key_no
- }).
-
-
--record(etsread_delete_object_cfm, {sender,
- success
- }).
-
-
-
--record(etsread_deblock, {sender,
- dbs_pid,
- node,
- local_node,
- table_id,
- table_type, % One of 'ets' or 'mnesia'
- poll_interval
- }).
-
-
-
--record(etsread_deblock_cfm, {sender,
- type,
- keypos,
- protection
- }).
-
-
-
--record(etsread_set_poll_interval, {sender,
- interval}).
-
-
-
--record(etsread_poll_table, {sender}).
-
-
-
--record(etsread_nodedown, {sender}).
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY IP
-%%%*********************************************************************
-
-
-
-
--record(ip_dead_table, {sender}).
-
-
--record(ip_register_parent, {sender}).
-
-
-
--record(ip_update, {sender,
- nof_elements_to_mark,
- text}).
-
-
-
--record(ip_quit, {sender}).
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY INFO
-%%%*********************************************************************
-
-
--record(info_update_table_info, {sender}).
-
-
-
--record(info_raise_window, {sender}).
-
-
-
--record(info_restart, {sender,
- node,
- table_id,
- table_type}).
-
-
-
--record(info_quit, {sender}).
-
-
diff --git a/lib/tv/src/tv_io_lib.erl b/lib/tv/src/tv_io_lib.erl
deleted file mode 100644
index 5457575b7d..0000000000
--- a/lib/tv/src/tv_io_lib.erl
+++ /dev/null
@@ -1,223 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: This file contains io functions adapted to the
-%%% TV requirements.
-%%%
-%%%*********************************************************************
-
--module(tv_io_lib).
-
-
--export([format/2]).
-
--export([write/1,write/2]).
--export([write_atom/1,write_string/2]).
-
--export([char_list/1,deep_char_list/1,printable_list/1]).
-
-
-
-%% Interface calls to sub-modules.
-
-format(Format, Args) ->
- tv_io_lib_format:fwrite(Format, Args).
-
-
-%% write(Term)
-%% write(Term, Depth)
-%% write(Term, Depth, Pretty)
-%% Return a (non-flattened) list of characters giving a printed
-%% representation of the term.
-
-write(Term) -> write(Term, -1).
-
-write(_Term, 0) -> "...";
-write(Term, _D) when is_integer(Term) -> integer_to_list(Term);
-write(Term, _D) when is_float(Term) -> tv_io_lib_format:fwrite_g(Term);
-write(Atom, _D) when is_atom(Atom) -> write_atom(Atom);
-write(Term, _D) when is_port(Term) -> lists:flatten(io_lib:write(Term));
-write(Term, _D) when is_pid(Term) -> pid_to_list(Term);
-write(Term, _D) when is_reference(Term) -> io_lib:write(Term);
-write(Term, _D) when is_binary(Term), byte_size(Term) > 100 -> "#Bin";
-write(Term, _D) when is_binary(Term) -> "<<\"" ++ binary_to_list(Term) ++ "\">>";
-write(Term, _D) when is_bitstring(Term) -> "#Bitstr";
-write([], _D) -> "[]";
-write({}, _D) -> "{}";
-write([H|T], D) ->
- if
- D =:= 1 -> "[...]";
- true ->
- [$[,[write(H, D-1)|write_tail(T, D-1)],$]]
- end;
-write(F, _D) when is_function(F) ->
- {module,M} = erlang:fun_info(F, module),
- ["#Fun<",atom_to_list(M),">"];
-write(T, D) when is_tuple(T) ->
- if
- D =:= 1 -> "{...}";
- true ->
- [${,
- [write(element(1, T), D-1)|write_tail(tl(tuple_to_list(T)), D-1)],
- $}]
- end.
-
-%% write_tail(List, Depth)
-%% Test the terminating case first as this looks better with depth.
-
-write_tail([], _D) -> "";
-write_tail(_List, 1) -> "|...";
-write_tail([H|T], D) ->
- [$,,write(H, D-1)|write_tail(T, D-1)];
-write_tail(Other, D) ->
- [$|,write(Other, D-1)].
-
-%% write_atom(Atom) -> [Char]
-%% Generate the list of characters needed to print an atom.
-
-write_atom(Atom) ->
- Chars = atom_to_list(Atom),
- case quote_atom(Atom, Chars) of
- true ->
- write_string(Chars, $');
- false ->
- Chars
- end.
-
-
-write_string(S, Q) ->
- [Q|write_string1(S, Q)].
-
-write_string1([], Q) ->
- [Q];
-write_string1([C|Cs], Q) ->
- write_char(C, Q, write_string1(Cs, Q)).
-
-
-write_char(Q, Q, Tail) -> %Must check this first
- [$\\,Q|Tail];
-write_char($\\, _, Tail) -> %In printable character range
- [$\\,$\\|Tail];
-write_char(C, _, Tail) when C >= $ , C =< $~ ->
- [C|Tail];
-write_char(C, _, Tail) when C >= 128+$ , C =< 255 ->
- [C|Tail];
-write_char($\n, _Q, Tail) -> %\n = LF
- [$\\,$n|Tail];
-write_char($\r, _, Tail) -> %\r = CR
- [$\\,$r|Tail];
-write_char($\t, _, Tail) -> %\t = TAB
- [$\\,$t|Tail];
-write_char($\v, _, Tail) -> %\v = VT
- [$\\,$v|Tail];
-write_char($\b, _, Tail) -> %\b = BS
- [$\\,$b|Tail];
-write_char($\f, _, Tail) -> %\f = FF
- [$\\,$f|Tail];
-write_char($\e, _, Tail) -> %\e = ESC
- [$\\,$e|Tail];
-write_char($\d, _, Tail) -> %\d = DEL
- [$\\,$d|Tail];
-write_char(C, _, Tail) when C < $ ->
- C1 = (C bsr 3) + $0,
- C2 = (C band 7) + $0,
- [$\\,$0,C1,C2|Tail];
-write_char(C, _, Tail) when C > $~ ->
- C1 = (C bsr 6) + $0,
- C2 = ((C bsr 3) band 7) + $0,
- C3 = (C band 7) + $0,
- [$\\,C1,C2,C3|Tail].
-
-%% quote_atom(Atom, CharList)
-%% Return 'true' if atom with chars in CharList needs to be quoted, else
-%% return 'false'.
-
-quote_atom(Atom, Cs0) ->
- case erl_scan:reserved_word(Atom) of
- true -> true;
- false ->
- case Cs0 of
- [C|Cs] when C >= $a, C =< $z ->
- quote_atom(Cs);
- _ -> true
- end
- end.
-
-quote_atom([C|Cs]) when C >= $a, C =< $z ->
- quote_atom(Cs);
-quote_atom([C|Cs]) when C >= $A, C =< $Z ->
- quote_atom(Cs);
-quote_atom([C|Cs]) when C >= $0, C =< $9 ->
- quote_atom(Cs);
-quote_atom([$_|Cs]) ->
- quote_atom(Cs);
-quote_atom([$@|Cs]) ->
- quote_atom(Cs);
-quote_atom([_|_]) ->
- true;
-quote_atom([]) ->
- false.
-
-%% char_list(CharList)
-%% deep_char_list(CharList)
-%% Return true if CharList is a (possibly deep) list of characters, else
-%% false.
-
-char_list([C|Cs]) when is_integer(C), C >= 0, C =< 255 ->
- char_list(Cs);
-char_list([]) -> true;
-char_list(_Other) -> false. %Everything else is false
-
-deep_char_list(Cs) ->
- deep_char_list(Cs, []).
-
-deep_char_list([C|Cs], More) when is_list(C) ->
- deep_char_list(C, [Cs|More]);
-deep_char_list([C|Cs], More) when is_integer(C), C >= 0, C =< 255 ->
- deep_char_list(Cs, More);
-deep_char_list([], [Cs|More]) ->
- deep_char_list(Cs, More);
-deep_char_list([], []) -> true;
-deep_char_list(_Other, _More) -> %Everything else is false
- false.
-
-%% printable_list([Char]) -> bool()
-%% Return true if CharList is a list of printable characters, else
-%% false.
-
-printable_list([C|Cs]) when is_integer(C), C >= $ , C =< 255 ->
- printable_list(Cs);
-printable_list([$\n|Cs]) ->
- printable_list(Cs);
-printable_list([$\r|Cs]) ->
- printable_list(Cs);
-printable_list([$\t|Cs]) ->
- printable_list(Cs);
-printable_list([$\v|Cs]) ->
- printable_list(Cs);
-printable_list([$\b|Cs]) ->
- printable_list(Cs);
-printable_list([$\f|Cs]) ->
- printable_list(Cs);
-printable_list([$\e|Cs]) ->
- printable_list(Cs);
-printable_list([]) -> true;
-printable_list(_Other) -> false. %Everything else is false
-
-
diff --git a/lib/tv/src/tv_io_lib_format.erl b/lib/tv/src/tv_io_lib_format.erl
deleted file mode 100644
index e043d9296e..0000000000
--- a/lib/tv/src/tv_io_lib_format.erl
+++ /dev/null
@@ -1,386 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2010. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_io_lib_format).
-
-
--export([fwrite/2,fwrite_g/1,indentation/2]).
-
-
-%% fwrite(Format, ArgList) -> [Char].
-%% Format the arguments in ArgList after string Format. Just generate
-%% an error if there is an error in the arguments.
-%%
-%% To do the printing command correctly we need to calculate the
-%% current indentation for everything before it. This may be very
-%% expensive, especially when it is not needed, so we first determine
-%% if, and for how long, we need to calculate the indentations. We do
-%% this by first collecting all the control sequences and
-%% corresponding arguments, then counting the print sequences and
-%% then building the output. This method has some drawbacks, it does
-%% two passes over the format string and creates more temporary data,
-%% and it also splits the handling of the control characters into two
-%% parts.
-
-fwrite(Format, Args) when is_atom(Format) ->
- fwrite(atom_to_list(Format), Args);
-fwrite(Format, Args) ->
- Cs = collect(Format, Args),
- Pc = pcount(Cs),
- build(Cs, Pc, 0).
-
-collect([$~|Fmt0], Args0) ->
- {C,Fmt1,Args1} = collect_cseq(Fmt0, Args0),
- [C|collect(Fmt1, Args1)];
-collect([C|Fmt], Args) ->
- [C|collect(Fmt, Args)];
-collect([], []) -> [].
-
-collect_cseq(Fmt0, Args0) ->
- {F,Ad,Fmt1,Args1} = field_width(Fmt0, Args0),
- {P,Fmt2,Args2} = precision(Fmt1, Args1),
- {Pad,Fmt3,Args3} = pad_char(Fmt2, Args2),
- {C,As,Fmt4,Args4} = collect_cc(Fmt3, Args3),
- {{C,As,F,Ad,P,Pad},Fmt4,Args4}.
-
-field_width([$-|Fmt0], Args0) ->
- {F,Fmt,Args} = field_value(Fmt0, Args0),
- field_width(-F, Fmt, Args);
-field_width(Fmt0, Args0) ->
- {F,Fmt,Args} = field_value(Fmt0, Args0),
- field_width(F, Fmt, Args).
-
-field_width(F, Fmt, Args) when F < 0 ->
- {-F,left,Fmt,Args};
-field_width(F, Fmt, Args) when F >= 0 ->
- {F,right,Fmt,Args}.
-
-precision([$.|Fmt], Args) ->
- field_value(Fmt, Args);
-precision(Fmt, Args) ->
- {none,Fmt,Args}.
-
-field_value([$*|Fmt], [A|Args]) when is_integer(A) ->
- {A,Fmt,Args};
-field_value([C|Fmt], Args) when C >= $0, C =< $9 ->
- field_value([C|Fmt], Args, 0);
-field_value(Fmt, Args) ->
- {none,Fmt,Args}.
-
-field_value([C|Fmt], Args, F) when C >= $0, C =< $9 ->
- field_value(Fmt, Args, 10*F + (C - $0));
-field_value(Fmt, Args, F) -> %Default case
- {F,Fmt,Args}.
-
-pad_char([$.,$*|Fmt], [Pad|Args]) -> {Pad,Fmt,Args};
-pad_char([$.,Pad|Fmt], Args) -> {Pad,Fmt,Args};
-pad_char(Fmt, Args) -> {$ ,Fmt,Args}.
-
-%% collect_cc([FormatChar], [Argument]) ->
-%% {Control,[ControlArg],[FormatChar],[Arg]}.
-%% Here we collect the argments for each control character.
-%% Be explicit to cause failure early.
-
-collect_cc([$w|Fmt], [A|Args]) -> {$w,[A],Fmt,Args};
-collect_cc([$p|Fmt], [A|Args]) -> {$p,[A],Fmt,Args};
-collect_cc([$W|Fmt], [A,Depth|Args]) -> {$W,[A,Depth],Fmt,Args};
-collect_cc([$P|Fmt], [A,Depth|Args]) -> {$P,[A,Depth],Fmt,Args};
-collect_cc([$s|Fmt], [A|Args]) -> {$s,[A],Fmt,Args};
-collect_cc([$e|Fmt], [A|Args]) -> {$e,[A],Fmt,Args};
-collect_cc([$f|Fmt], [A|Args]) -> {$f,[A],Fmt,Args};
-collect_cc([$g|Fmt], [A|Args]) -> {$g,[A],Fmt,Args};
-collect_cc([$c|Fmt], [A|Args]) -> {$c,[A],Fmt,Args};
-collect_cc([$~|Fmt], Args) -> {$~,[],Fmt,Args};
-collect_cc([$n|Fmt], Args) -> {$n,[],Fmt,Args};
-collect_cc([$i|Fmt], [A|Args]) -> {$i,[A],Fmt,Args}.
-
-%% pcount([ControlC]) -> Count.
-%% Count the number of print requests.
-
-pcount(Cs) -> pcount(Cs, 0).
-
-pcount([{$p,_As,_F,_Ad,_P,_Pad}|Cs], Acc) -> pcount(Cs, Acc+1);
-pcount([{$P,_As,_F,_Ad,_P,_Pad}|Cs], Acc) -> pcount(Cs, Acc+1);
-pcount([_|Cs], Acc) -> pcount(Cs, Acc);
-pcount([], Acc) -> Acc.
-
-%% build([Control], Pc, Indentation) -> [Char].
-%% Interpret the control structures. Count the number of print
-%% remaining and only calculate indentation when necessary. Must also
-%% be smart when calculating indentation for characters in format.
-
-build([{C,As,F,Ad,P,Pad}|Cs], Pc0, I) ->
- S = control(C, As, F, Ad, P, Pad, I),
- Pc1 = decr_pc(C, Pc0),
- if
- Pc1 > 0 -> [S|build(Cs, Pc1, indentation(S, I))];
- true -> [S|build(Cs, Pc1, I)]
- end;
-build([$\n|Cs], Pc, _I) -> [$\n|build(Cs, Pc, 0)];
-build([$\t|Cs], Pc, I) -> [$\t|build(Cs, Pc, ((I + 8) div 8) * 8)];
-build([C|Cs], Pc, I) -> [C|build(Cs, Pc, I+1)];
-build([], _, _) -> [].
-
-decr_pc($p, Pc) -> Pc - 1;
-decr_pc($P, Pc) -> Pc - 1;
-decr_pc(_C, Pc) -> Pc.
-
-%% control(FormatChar, [Argument], FieldWidth, Adjust, Precision, PadChar,
-
-%% Indentation) ->
-%% [Char]
-%% This is the main dispatch function for the various formatting commands.
-%% Field widths and precisions have already been calculated.
-
-control($w, [A], F, Adj, P, Pad, _I) ->
- term(tv_io_lib:write(A, -1), F, Adj, P, Pad);
-control($p, [A], F, Adj, P, Pad, I) ->
- print(A, -1, F, Adj, P, Pad, I);
-control($W, [A,Depth], F, Adj, P, Pad, _I) when is_integer(Depth) ->
- term(tv_io_lib:write(A, Depth), F, Adj, P, Pad);
-control($P, [A,Depth], F, Adj, P, Pad, I) when is_integer(Depth) ->
- print(A, Depth, F, Adj, P, Pad, I);
-control($s, [A], F, Adj, P, Pad, _I) when is_atom(A) ->
- string(atom_to_list(A), F, Adj, P, Pad);
-control($s, [L], F, Adj, P, Pad, _I) ->
- true = tv_io_lib:deep_char_list(L), %Check if L a character list
- string(L, F, Adj, P, Pad);
-control($e, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_e(A, F, Adj, P, Pad);
-control($f, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_f(A, F, Adj, P, Pad);
-control($g, [A], F, Adj, P, Pad, _I) when is_float(A) ->
- fwrite_g(A, F, Adj, P, Pad);
-control($c, [A], F, Adj, P, Pad, _I) when is_integer(A) ->
- char(A band 255, F, Adj, P, Pad);
-control($~, [], F, Adj, P, Pad, _I) -> char($~, F, Adj, P, Pad);
-control($n, [], F, Adj, P, Pad, _I) -> newline(F, Adj, P, Pad);
-control($i, [_A], _F, _Adj, _P, _Pad, _I) -> [].
-
-%% indentation([Char], Indentation) -> Indentation.
-%% Calculate the indentation of the end of a string given its start
-%% indentation. We assume tabs at 8 cols.
-
-indentation([$\n|Cs], _I) -> indentation(Cs, 0);
-indentation([$\t|Cs], I) -> indentation(Cs, ((I + 8) div 8) * 8);
-indentation([C|Cs], I) when is_integer(C) ->
- indentation(Cs, I+1);
-indentation([C|Cs], I) ->
- indentation(Cs, indentation(C, I));
-indentation([], I) -> I.
-
-%% term(TermList, Field, Adjust, Precision, PadChar)
-%% Output the characters in a term.
-
-term(T, none, _Adj, none, _Pad) -> T;
-term(T, none, Adj, P, Pad) -> term(T, P, Adj, P, Pad);
-term(T, F, Adj, none, Pad) -> term(T, F, Adj, erlang:min(flat_length(T), F), Pad);
-term(T, F, Adj, P, Pad) when F >= P ->
- adjust_error(T, F, Adj, P, Pad).
-
-%% print(Term, Depth, Field, Adjust, Precision, PadChar, Indentation)
-%% Print a term.
-
-print(T, D, none, Adj, P, Pad, I) -> print(T, D, 80, Adj, P, Pad, I);
-print(T, D, F, Adj, none, Pad, I) -> print(T, D, F, Adj, I+1, Pad, I);
-print(T, D, F, right, P, _Pad, _I) ->
- tv_io_lib_pretty:pretty_print(T, P, F, D).
-
-%% fwrite_e(Float, Field, Adjust, Precision, PadChar)
-
-fwrite_e(Fl, none, Adj, none, Pad) -> %Default values
- fwrite_e(Fl, none, Adj, 6, Pad);
-fwrite_e(Fl, none, _Adj, P, _Pad) when P >= 2 ->
- float_e(Fl, float_data(Fl), P);
-fwrite_e(Fl, F, Adj, none, Pad) ->
- fwrite_e(Fl, F, Adj, 6, Pad);
-fwrite_e(Fl, F, Adj, P, Pad) when P >= 2 ->
- adjust_error(float_e(Fl, float_data(Fl), P), F, Adj, F, Pad).
-
-float_e(Fl, Fd, P) when Fl < 0.0 -> %Negative numbers
- [$-|float_e(-Fl, Fd, P)];
-float_e(_Fl, {Ds,E}, P) ->
- case float_man(Ds, 1, P-1) of
- {[$0|Fs],true} -> [[$1|Fs]|float_exp(E)];
- {Fs,false} -> [Fs|float_exp(E-1)]
- end.
-
-%% float_man([Digit], Icount, Dcount) -> {[Chars],CarryFlag}.
-%% Generate the characters in the mantissa from the digits with Icount
-%% characters before the '.' and Dcount decimals. Handle carry and let
-%% caller decide what to do at top.
-
-float_man(Ds, 0, Dc) ->
- {Cs,C} = float_man(Ds, Dc),
- {[$.|Cs],C};
-float_man([D|Ds], I, Dc) ->
- case float_man(Ds, I-1, Dc) of
- {Cs,true} when D =:= $9 -> {[$0|Cs],true};
- {Cs,true} -> {[D+1|Cs],false};
- {Cs,false} -> {[D|Cs],false}
- end;
-float_man([], I, Dc) -> %Pad with 0's
- {string:chars($0, I, [$.|string:chars($0, Dc)]),false}.
-
-float_man([D|_Ds], 0) when D >= $5 -> {[],true};
-float_man([_|_], 0) -> {[],false};
-float_man([D|Ds], Dc) ->
- case float_man(Ds, Dc-1) of
- {Cs,true} when D =:= $9 -> {[$0|Cs],true};
- {Cs,true} -> {[D+1|Cs],false};
- {Cs,false} -> {[D|Cs],false}
- end;
-float_man([], Dc) -> {string:chars($0, Dc),false}. %Pad with 0's
-
-%% float_exp(Exponent) -> [Char].
-%% Generate the exponent of a floating point number. Alwayd include sign.
-
-float_exp(E) when E >= 0 ->
- [$e,$+|integer_to_list(E)];
-float_exp(E) ->
- [$e|integer_to_list(E)].
-
-%% fwrite_f(FloatData, Field, Adjust, Precision, PadChar)
-
-fwrite_f(Fl, none, Adj, none, Pad) -> %Default values
- fwrite_f(Fl, none, Adj, 6, Pad);
-fwrite_f(Fl, none, _Adj, P, _Pad) when P >= 1 ->
- float_f(Fl, float_data(Fl), P);
-fwrite_f(Fl, F, Adj, none, Pad) ->
- fwrite_f(Fl, F, Adj, 6, Pad);
-fwrite_f(Fl, F, Adj, P, Pad) when P >= 1 ->
- adjust_error(float_f(Fl, float_data(Fl), P), F, Adj, F, Pad).
-
-float_f(Fl, Fd, P) when Fl < 0.0 ->
- [$-|float_f(-Fl, Fd, P)];
-float_f(Fl, {Ds,E}, P) when E =< 0 ->
- float_f(Fl, {string:chars($0, -E+1, Ds),1}, P); %Prepend enough 0's
-float_f(_Fl, {Ds,E}, P) ->
- case float_man(Ds, E, P) of
- {Fs,true} -> "1" ++ Fs; %Handle carry
- {Fs,false} -> Fs
- end.
-
-%% float_data([FloatChar]) -> {[Digit],Exponent}
-
-float_data(Fl) ->
- float_data(float_to_list(Fl), []).
-
-float_data([$e|E], Ds) ->
- {reverse(Ds),list_to_integer(E)+1};
-float_data([D|Cs], Ds) when D >= $0, D =< $9 ->
- float_data(Cs, [D|Ds]);
-float_data([_D|Cs], Ds) ->
- float_data(Cs, Ds).
-
-
-%% fwrite_g(Float, Field, Adjust, Precision, PadChar)
-%% Use the f form if Float is > 0.1 and < 10^4, else the e form.
-%% Precision always means the # of significant digits.
-
-fwrite_g(Fl) ->
- fwrite_g(Fl, none, right, none, $\s).
-
-fwrite_g(Fl, F, Adj, none, Pad) ->
- fwrite_g(Fl, F, Adj, 6, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 0.1 ->
- fwrite_e(Fl, F, Adj, P, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 1.0 ->
- fwrite_f(Fl, F, Adj, P, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 10.0 ->
- fwrite_f(Fl, F, Adj, P-1, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 100.0 ->
- fwrite_f(Fl, F, Adj, P-2, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 1000.0 ->
- fwrite_f(Fl, F, Adj, P-3, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) when abs(Fl) < 10000.0 ->
- fwrite_f(Fl, F, Adj, P-4, Pad);
-fwrite_g(Fl, F, Adj, P, Pad) ->
- fwrite_e(Fl, F, Adj, P, Pad).
-
-%% string(String, Field, Adjust, Precision, PadChar)
-
-string(S, none, _Adj, none, _Pad) -> S;
-string(S, F, Adj, none, Pad) ->
- string(S, F, Adj, erlang:min(flat_length(S), F), Pad);
-string(S, none, _Adj, P, Pad) ->
- string:left(flatten(S), P, Pad);
-string(S, F, Adj, P, Pad) when F >= P ->
- adjust(string:left(flatten(S), P, Pad), string:chars(Pad, F - P), Adj).
-
-%% char(Char, Field, Adjust, Precision, PadChar) -> [Char].
-
-char(C, none, _Adj, none, _Pad) -> [C];
-char(C, F, _Adj, none, _Pad) -> string:chars(C, F);
-char(C, none, _Adj, P, _Pad) -> string:chars(C, P);
-char(C, F, Adj, P, Pad) when F >= P ->
- adjust(string:chars(C, P), string:chars(Pad, F - P), Adj).
-
-%% newline(Field, Adjust, Precision, PadChar) -> [Char].
-
-newline(none, _Adj, _P, _Pad) -> "\n";
-newline(F, right, _P, _Pad) -> string:chars($\n, F).
-
-%% adjust_error([Char], Field, Adjust, Max, PadChar) -> [Char].
-%% Adjust the characters within the field if length less than Max padding
-%% with PadChar.
-
-adjust_error(Cs, F, Adj, M, Pad) ->
- L = flat_length(Cs),
- if
- L > M ->
- adjust(string:chars($*, M), string:chars(Pad, F - M), Adj);
- true ->
- adjust(Cs, string:chars(Pad, F - L), Adj)
- end.
-
-adjust(Data, Pad, left) -> [Data,Pad];
-adjust(Data, Pad, right) -> [Pad,Data].
-
-%%
-%% Utilities
-%%
-
-reverse(List) ->
- reverse(List, []).
-
-reverse([H|T], Stack) ->
- reverse(T, [H|Stack]);
-reverse([], Stack) -> Stack.
-
-%% flatten(List)
-%% Flatten a list.
-
-flatten(List) -> flatten(List, []).
-
-flatten([H|T], Cont) when is_list(H) ->
- flatten(H, [T|Cont]);
-flatten([H|T], Cont) ->
- [H|flatten(T, Cont)];
-flatten([], [H|Cont]) -> flatten(H, Cont);
-flatten([], []) -> [].
-
-%% flat_length(List)
-%% Calculate the length of a list of lists.
-
-flat_length(List) -> flat_length(List, 0).
-
-flat_length([H|T], L) when is_list(H) ->
- flat_length(H, flat_length(T, L));
-flat_length([_|T], L) ->
- flat_length(T, L + 1);
-flat_length([], L) -> L.
diff --git a/lib/tv/src/tv_io_lib_pretty.erl b/lib/tv/src/tv_io_lib_pretty.erl
deleted file mode 100644
index c19277d006..0000000000
--- a/lib/tv/src/tv_io_lib_pretty.erl
+++ /dev/null
@@ -1,171 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_io_lib_pretty).
-
-
-
--export([pretty_print/4]).
-
-%% pretty_print(Term, Column, LineLength, Depth) -> [Chars]
-%% Depth = -1 gives unlimited print depth. Use tv_io_lib:write for atomic terms.
-
-pretty_print(_, _, _, 0) -> "...";
-pretty_print([], _, _, _) -> "[]";
-pretty_print({}, _, _, _) -> "{}";
-pretty_print(List, Col, Ll, D) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- tv_io_lib:write_string(List, $");
- false ->
- Len = write_length(List, D, 0, Ll - Col),
- if
- D =:= 1 -> "[...]";
- Len + Col < Ll ->
- write(List, D);
- true ->
- [$[,
- [pretty_print(hd(List), Col + 1, Ll, D - 1)|
- pretty_print_tail(tl(List), Col + 1, Ll, D - 1)],
- $]]
- end
- end;
-pretty_print(Fun, _Col, _Ll, _D) when is_function(Fun) ->
- tv_io_lib:write(Fun);
-pretty_print(Tuple, Col, Ll, D) when is_tuple(Tuple) ->
- Len = write_length(Tuple, D, 0, Ll - Col),
- if
- D =:= 1 -> "{...}";
- Len + Col < Ll ->
- write(Tuple, D);
- is_atom(element(1, Tuple)), size(Tuple) > 1 ->
- print_tag_tuple(Tuple, Col, Ll, D);
- true ->
- [${,
- [pretty_print(element(1, Tuple), Col + 1, Ll, D - 1)|
- pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 1, Ll, D - 1)],
- $}]
- end;
-pretty_print(Term, _Col, _Ll, D) -> tv_io_lib:write(Term, D).
-
-%% print_tag_tuple(Tuple, Column, LineLength, Depth) -> [Char]
-%% Print a tagged tuple by indenting the rest of the elements differently
-%% to the tag. Start beside the tag if start column not too far to
-%% the right. Tuple has size >= 2.
-
-print_tag_tuple(Tuple, Col, Ll, D) ->
- Tag = tv_io_lib:write_atom(element(1, Tuple)),
- Tlen = length(Tag),
- Tcol = Col + Tlen + 2,
- if
- Tcol >= Ll div 2, Tlen > 2 ->
- [${,Tag,
- pretty_print_tail(tl(tuple_to_list(Tuple)), Col + 4, Ll, D - 2),
- $}];
- true ->
- [${,Tag,$,,
- [pretty_print(element(2, Tuple), Col + Tlen + 2, Ll, D - 2)|
- pretty_print_tail(tl(tl(tuple_to_list(Tuple))), Tcol, Ll, D - 3)],
- $}]
- end.
-
-%% pretty_print_tail([Element], Column, LineLength, D) -> [Char]
-%% Pretty print the elements of a list or tuple.
-
-pretty_print_tail([], _Col, _Ll, _D) -> "";
-pretty_print_tail(_Es, _Col, _Ll, 1) -> "|...";
-pretty_print_tail([E|Es], Col, Ll, D) ->
- [$,,nl_indent(Col-1),
- pretty_print(E, Col, Ll, D-1)|
- pretty_print_tail(Es, Col, Ll, D-1)];
-pretty_print_tail(E, Col, Ll, D) ->
- [$|,nl_indent(Col-1),pretty_print(E, Col, Ll, D-1)].
-
-%% write(Term, Depth) -> [Char]
-%% Write a term down to Depth on one line. Use tv_io_lib:write/2 for
-%% atomic terms.
-
-write(_, 0) -> "...";
-write([], _) -> "[]";
-write({}, _) -> "{}";
-write(List, D) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- tv_io_lib:write_string(List, $");
- false ->
- if
- D =:= 1 -> "[...]";
- true ->
- [$[,
- [write(hd(List), D-1)|write_tail(tl(List), D-1)],
- $]]
- end
- end;
-write(Fun, _D) when is_function(Fun) -> tv_io_lib:write(Fun); %Must catch this first
-write(T, D) when is_tuple(T) ->
- if
- D =:= 1 -> "{...}";
- true ->
- [${,
- [write(element(1, T), D-1)|write_tail(tl(tuple_to_list(T)), D-1)],
- $}]
- end;
-write(Term, D) -> tv_io_lib:write(Term, D).
-
-write_tail([], _D) -> "";
-write_tail(_Es, 1) -> "|...";
-write_tail([E|Es], D) ->
- [$,,write(E, D - 1)|write_tail(Es, D - 1)];
-write_tail(E, D) ->
- [$|,write(E, D - 1)].
-
-%% write_length(Term, Depth, Accumulator, MaxLength) -> integer()
-%% Calculate the print length of a term, but exit when length becomes
-%% greater than MaxLength.
-
-write_length(_T, _D, Acc, Max) when Acc > Max -> Acc;
-write_length(_T, 0, Acc, _Max) -> Acc + 3;
-write_length([], _, Acc, _) -> Acc + 2;
-write_length({}, _, Acc, _) -> Acc + 2;
-write_length(List, D, Acc, Max) when is_list(List) ->
- case tv_io_lib:printable_list(List) of
- true ->
- Acc + length(tv_io_lib:write_string(List, $"));
- false ->
- write_length_list(List, D, Acc, Max)
- end;
-write_length(Fun, _D, Acc, _Max) when is_function(Fun) ->
- Acc + length(tv_io_lib:write(Fun));
-write_length(Tuple, D, Acc, Max) when is_tuple(Tuple) ->
- write_length_list(tuple_to_list(Tuple), D, Acc, Max);
-write_length(Term, _D, Acc, _Max) ->
- Acc + length(tv_io_lib:write(Term)).
-
-write_length_list(_, _, Acc, Max) when Acc > Max -> Acc;
-write_length_list([], _, Acc, _) -> Acc + 1; %]
-write_length_list(_Es, 1, Acc, _) -> Acc + 5; %|...]
-write_length_list([E|Es], D, Acc, Max) ->
- write_length_list(Es,
- D - 1,
- write_length(E, D - 1, Acc + 1, Max),
- Max);
-write_length_list(E, D, Acc, Max) ->
- write_length(E, D - 1, Acc + 2, Max). %| ]
-
-
-
-nl_indent(_) -> "".
diff --git a/lib/tv/src/tv_ip.erl b/lib/tv/src/tv_ip.erl
deleted file mode 100644
index 9f66917362..0000000000
--- a/lib/tv/src/tv_ip.erl
+++ /dev/null
@@ -1,242 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_ip).
--compile([{nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([ip/1]).
-
-
-
--include("tv_int_msg.hrl").
-
-
--define(NOF_LABELS, 25).
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-ip(_Master) ->
- W = gs:window(win, gs:start(), [{width, 302},
- {height, 38},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "Launching..."}
- ]),
- C = gs:canvas(W, [{width, 40},
- {height, 35},
- {x, 0},
- {bg, {255, 255, 255}}
- ]),
- gs:create(image, C, [{load_gif, code:priv_dir(tv) ++ "/erlang.gif"}]),
- gs:label(W, [{width, 252},
- {height, 12},
- {x, 47},
- {y, 23},
- {bg, {0, 0, 0}},
- {cursor, arrow}
- ]),
-
- LabelList = create_labels(?NOF_LABELS, W, 48),
-
- L = gs:label(W, [{width, 250},
- {height, 18},
- {x, 47},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, w}
- ]),
- gs:config(win, [{map, true}]),
- loop(1, LabelList, L).
-
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_labels(0, _WinId, _Xpos) ->
- [];
-create_labels(N, WinId, Xpos) ->
- Width = 10,
- Xdiff = Width,
- LabelId = gs:label(WinId, [{width, Width},
- {height, 10},
- {x, Xpos},
- {y, 24},
- {bg, {235, 235, 235}},
- {cursor, arrow}
- ]),
-
- [LabelId | create_labels(N - 1, WinId, Xpos + Xdiff)].
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-loop(N, LabelList, L) ->
- receive
- Msg ->
- case Msg of
-
- #ip_update{nof_elements_to_mark = X, text = Text} ->
- update_window(LabelList, N, N + X, L, Text),
- loop(N + X, LabelList, L);
-
- #ip_quit{} ->
- update_labels(LabelList, N, ?NOF_LABELS),
- receive
- after 1000 ->
- done
- end,
- done;
-
- _Other ->
- loop(N, LabelList, L)
- end
- end.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_window(LabelList, N, Hi, LblId, Text) ->
- gs:config(win, [raise]),
- gs:config(LblId, [{label, {text, Text}}]),
- update_labels(LabelList, N, Hi).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_labels(_LabelList, N, _Hi) when N > ?NOF_LABELS ->
- done;
-update_labels(_LabelList, N, Hi) when N >= Hi ->
- done;
-update_labels(LabelList, N, Hi) ->
- LabelId = lists:nth(N, LabelList),
- gs:config(LabelId, [{bg, {0, 0, 255}}]),
- update_labels(LabelList, N + 1, Hi).
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_main.erl b/lib/tv/src/tv_main.erl
deleted file mode 100644
index b6ffbd7c49..0000000000
--- a/lib/tv/src/tv_main.erl
+++ /dev/null
@@ -1,1821 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_main).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,grid,3}},
- {nowarn_deprecated_function,{gs,gridline,2}},
- {nowarn_deprecated_function,{gs,label,3}},
- {nowarn_deprecated_function,{gs,menu,2}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,2}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/0,
- init/0
- ]).
-
-
--export([get_ets_tables/1,
- get_mnesia_tables/1
- ]).
-
-
-
--include("tv_main.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_msg.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-start() ->
- spawn(?MODULE, init, []).
-
-
-
-init() ->
- process_flag(trap_exit,true),
- %% OK, so it's *BAD* to use the process dictionary...
- %% So why have I used it? Because it is simple to remove the haiku-functionality,
- %% if that is desired. Otherwise a lot of functions (the parameters) would have
- %% to be changed.
- put(error_msg_mode, ?ERROR_MSG_MODE),
- KindOfTable = ets,
- SysTabHidden = true,
- UnreadHidden = true,
- SortKey = ?NAME_COL,
- CurrNode = node(),
- Children = start_tv_nodewin(CurrNode),
- {MarkedCell, TempGridLines, WinSize, ShortcutList} = create_window([]),
- Tables = get_tables(CurrNode, KindOfTable, UnreadHidden, SysTabHidden,SortKey),
- gs:config(grid, [{rows, {1, get_nof_rows(length(Tables),
- gs:read(grid, height))}}]),
- GridLines = update_gridlines(Tables, TempGridLines, 1),
- gs:config(win, [{map, true}, {cursor,arrow}]),
- %% To avoid unpleasant error/exit messages, we surround the loop with a catch.
- catch loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, ShortcutList,
- UnreadHidden, SysTabHidden, SortKey, Children).
-
-
-
-start_tv_nodewin(CurrNode) ->
- NodewinPid = tv_nodewin:start(CurrNode, get(error_msg_mode)),
- [{NodewinPid, tv_nodewin, CurrNode}].
-
-
-
-
-
-get_ets_tables(SysTabHidden) ->
- Tables = ets:all(),
- get_ets_table_info(Tables,
- hidden_tables(ets, SysTabHidden) ++
- current_mnesia_tables(SysTabHidden),
- owners_to_hide(ets, SysTabHidden),
- []).
-
-
-
-get_mnesia_tables(SysTabHidden) ->
- Tables = mnesia:system_info(tables),
- get_mnesia_table_info(Tables -- hidden_tables(mnesia, SysTabHidden),
- owners_to_hide(mnesia, SysTabHidden),
- []).
-
-
-
-
-
-owners_to_hide(ets, true) ->
- ?SYSTEM_OWNERS;
-owners_to_hide(ets, false) ->
- [];
-owners_to_hide(mnesia, true) ->
- [];
-owners_to_hide(mnesia, false) ->
- [].
-
-
-
-
-get_mnesia_table_info([], _OwnersToHide, Acc) ->
- lists:keysort(?NAME_ELEM, Acc);
-get_mnesia_table_info([TabId | Tail], OwnersToHide, Acc) ->
- case catch get_mnesia_owner_size(TabId) of
- {'EXIT', _Reason} ->
- %% Ignore tables ceasing to exist.
- %% Nodedown errors caught above!
- get_mnesia_table_info(Tail, OwnersToHide, Acc);
- {OwnerPid, OwnerName, Size} ->
- case lists:member(OwnerName, OwnersToHide) of
- true ->
- get_mnesia_table_info(Tail, OwnersToHide, Acc);
- false ->
- Readable = not(lists:member(TabId, ?UNREADABLE_MNESIA_TABLES)),
- get_mnesia_table_info(Tail,
- OwnersToHide,
- [{TabId, {notext}, {notext}, Readable,
- OwnerPid, OwnerName, Size} | Acc])
- end
- end.
-
-
-
-
-get_mnesia_owner_size(TabId) ->
- {OwnerPid, OwnerName} =
- case catch mnesia:table_info(TabId, owner) of
- Pid when is_pid(Pid) ->
- case lists:keysearch(registered_name, 1, process_info(Pid)) of
- false ->
- {Pid, {notext}};
- {value, {registered_name, ProcName}} ->
- {Pid, ProcName}
- end;
- _Other ->
- {{notext}, {notext}}
- end,
- Size = mnesia:table_info(TabId, size),
- {OwnerPid, OwnerName, Size}.
-
-
-
-
-
-
-
-hidden_tables(_Any, true) ->
- ?SYSTEM_TABLES ++ ?MNESIA_TABLES;
-hidden_tables(ets, _SysTabHidden) ->
- ?MNESIA_TABLES;
-hidden_tables(mnesia, _SysTabHidden) ->
- [].
-
-
-
-
-get_tables(Node, KindOfTable, UnreadHidden, SysTabHidden,SortKey) ->
- LocalNode = (Node =:= node()),
- Tables =
- case catch get_table_list(Node,LocalNode,KindOfTable,SysTabHidden) of
- Result when is_list(Result) ->
- case UnreadHidden of
- true ->
- lists:filter(fun(H) ->
- element(?READABLE_ELEM, H)
- end,
- Result);
- _Other ->
- Result
- end;
- Error ->
- analyze_error(Error, Node, undefined),
- []
- end,
- case SortKey of
- ?PROCNAME_ELEM ->
- lists:keysort(SortKey,
- lists:keysort(?PID_ELEM, Tables));
- _OtherCol ->
- lists:keysort(SortKey,
- lists:keysort(?NAME_ELEM, Tables))
- end.
-
-
-
-
-
-get_ets_table_info([], _TablesToHide, _OwnersToHide, Acc) ->
- lists:keysort(?ID_ELEM, Acc);
-get_ets_table_info([TabId | Tail], TablesToHide, OwnersToHide, Acc) ->
- case catch get_ets_name_owner_protection(TabId) of
- {'EXIT', _Reason} ->
- %% Ignore tables ceasing to exist.
- %% Nodedown errors caught above!
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- {Name, NamedTable, Id, Readable, OwnerPid, OwnerName, Size} ->
- case lists:member(Name, TablesToHide) of
- true ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- false ->
- case lists:member(OwnerName, OwnersToHide) of
- true ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide, Acc);
- false ->
- get_ets_table_info(Tail, TablesToHide, OwnersToHide,
- [{Name,NamedTable,Id,Readable,
- OwnerPid,OwnerName,Size} | Acc])
- end
- end
- end.
-
-
-
-get_ets_name_owner_protection(TabId) ->
- Name = ets:info(TabId, name),
- OwnerPid = ets:info(TabId, owner),
- Readable = case ets:info(TabId, protection) of
- private ->
- false;
- _Other ->
- true
- end,
- Size = ets:info(TabId, size),
- {NamedTable,Id} = case ets:info(TabId, named_table) of
- true ->
- {true,{notext}};
- false ->
- {false, TabId}
- end,
- PName = case lists:keysearch(registered_name, 1, process_info(OwnerPid)) of
- false ->
- {notext};
- {value, {registered_name, ProcName}} ->
- ProcName
- end,
- {Name, NamedTable, Id, Readable, OwnerPid, PName, Size}.
-
-
-
-
-
-
-current_mnesia_tables(SysTabHidden) ->
- case catch get_table_list(node(), true, mnesia, SysTabHidden) of
- Result when is_list(Result) ->
- lists:map(fun(H) ->
- element(?NAME_ELEM, H)
- end,
- Result);
- nodedown ->
- handle_error(nodedown, node(), undefined),
- [];
- _Other ->
- []
- end.
-
-
-
-
-get_table_list(_Node, true, ets, SysTabHidden) ->
- get_ets_tables(SysTabHidden);
-get_table_list(Node, false, ets, SysTabHidden) ->
- case rpc:block_call(Node, ?MODULE, get_ets_tables, [SysTabHidden]) of
- {badrpc, Reason} ->
- throw({badrpc,Reason});
- Result ->
- Result
- end;
-get_table_list(_Node, true, mnesia, SysTabHidden) ->
- get_mnesia_tables(SysTabHidden);
-get_table_list(Node, false, mnesia, SysTabHidden) ->
- case rpc:block_call(Node, ?MODULE, get_mnesia_tables, [SysTabHidden]) of
- {badrpc,Reason} ->
- throw({badrpc,Reason});
- Result ->
- Result
- end.
-
-
-
-
-analyze_error(Cause, Node, Table) ->
- case Cause of
- {badrpc, {'EXIT', {badarg,_Reason}}} ->
- done; %% Table has ceased to exist.
- {'EXIT', {badarg, {ets,local_info,_Args}}} ->
- done;
-
- {badrpc, nodedown} ->
- handle_error(nodedown, Node, Table);
- {'EXIT', nodedown} ->
- handle_error(nodedown, Node, Table);
-
- {'EXIT', {aborted, {node_not_running,_ErrNode}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {'EXIT', {'EXIT', {aborted, {node_not_running,_ErrNode}}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {badrpc, {'EXIT', {aborted, {node_not_running,_ErrNode}}}} ->
- handle_error(mnesia_not_started, Node, Table);
- {'EXIT', {undef, {mnesia,_Fcn,_Args,_}}} ->
- handle_error(mnesia_not_started, Node, Table);
-
- {'EXIT', Reason} ->
- handle_error({unexpected_error,Reason}, Node, Table);
- Error when is_tuple(Error) ->
- handle_error({unexpected_error,Error}, Node, Table)
- end.
-
-
-
-handle_error(mnesia_not_started, _Node, _Table) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification", ["Mnesia not started!"]);
- haiku ->
- tv_utils:notify(win, "TV Notification", ["Mnesia is stopped.",
- "We wish to reach all data",
- "But we never will."])
- end;
-handle_error(nodedown, _Node, _Table) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification", ["The selected node is down!"]);
- haiku ->
- Msg = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- self() ! nodedown;
-handle_error({unexpected_error,Cause}, _Node, _Table) ->
- io:format("Unexpected error: ~p~n", [Cause]),
- gs:config(win, [beep]).
-
-
-
-
-loop(KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- receive
-
- {gs, Gridline, click, {grid,Readable}, [Col,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, Col, Row}, MarkedCell, Readable),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Gridline, click, {grid,_Readable}, [_Col,_Row,"" | _]} ->
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?NAME_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?NAME_COL, Row}, undefined, Data),
- {Table, Name, Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?ID_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?ID_COL, Row}, undefined, Data),
- {Table, Name, Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?INFO_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?INFO_COL, Row}, undefined, Data),
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- case start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- refresh_window(NewMarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?PID_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?PID_COL, Row}, undefined, Data),
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
- {gs, Gridline, doubleclick, {grid,Data}, [?PROCNAME_COL,Row,Text | _]} when Text =/= "" ->
- unmark_cell(MarkedCell, Tables),
- NewMarkedCell = mark_cell({Gridline, ?PROCNAME_COL, Row}, undefined, Data),
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
-%% {gs, win, configure, _Data, [Width, Height | _]} when {Width,Height} /= WinSize ->
- Msg0 = {gs, win, configure, _Data, [Width0, Height0 | _]}
- when {Width0,Height0} =/= WinSize ->
- {gs, win, configure, _, [Width,Height|_]} = flush_msgs(Msg0),
-
- NewSize = resize_window(Width, Height, length(Tables)),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,NewSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, update, _Args} ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, open_table, _Args} ->
- {Table, Name, Readable} = get_table_id(KindOfTable, element(3, MarkedCell),
- Tables),
- case start_tv_browser(Table,CurrNode,Name,KindOfTable,Readable,Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, _Id, click, new_table, _Args} ->
- NewChildren = start_tv_new_table(CurrNode, Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {gs, _Id, click, select_node, _Args} ->
- show_tv_nodewin(Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_mnesia, _Args} when KindOfTable =:= ets ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?DISABLED_COLOR}]),
- gs:config(sort_table_id, [{enable, false}]),
- NewSortKey =
- case SortKey of
- ?ID_ELEM ->
- gs:config(sort_table_name, [{select,true}]),
- ?NAME_ELEM;
- _Other ->
- SortKey
- end,
- {NewTables, NewGridLines} =
- update_grid(mnesia, CurrNode, GridLines, UnreadHidden, SysTabHidden, NewSortKey),
- gs:config(win, [{cursor,arrow}]),
- loop(mnesia,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,NewSortKey,Children);
-
-
- {gs, _Id, click, show_ets, _Args} when KindOfTable =:= mnesia ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label3, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label4, [{fg, ?NORMAL_FG_COLOR}]),
- {NewTables, NewGridLines} =
- update_grid(ets, CurrNode, GridLines, UnreadHidden, SysTabHidden,SortKey),
- %% gs:config(show_unreadable, [{enable, true},
- %% {select, not(UnreadHidden)}]),
- gs:config(sort_table_id, [{enable, true}]),
- gs:config(win, [{cursor,arrow}]),
- loop(ets,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_system, _Args} when SysTabHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines}
- = update_grid(KindOfTable, CurrNode, GridLines, UnreadHidden, false, SortKey),
- gs:config(show_system, [{data, hide_system}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,false,SortKey,Children);
-
-
- {gs, _Id, click, hide_system, _Args} when not SysTabHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable, CurrNode, GridLines, UnreadHidden, true, SortKey),
- gs:config(show_system, [{label, {text, " System Tables "}},
- {data, show_system}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,true,SortKey,Children);
-
-
- {gs, _Id, click, show_unreadable, _Args} when UnreadHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines}
- = update_grid(KindOfTable, CurrNode, GridLines, false, SysTabHidden, SortKey),
- gs:config(show_unreadable, [{data, hide_unreadable}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- false,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, hide_unreadable, _Args} when not UnreadHidden ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable, CurrNode, GridLines, true, SysTabHidden, SortKey),
- gs:config(show_unreadable, [{label, {text, " Unreadable Tables "}},
- {data, show_unreadable}]),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- true,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, show_info, _Args} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, element(3,MarkedCell),
- Tables),
- case start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {gs, _Id, click, sort_table_name, _Args} when SortKey =/= ?NAME_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?NAME_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?NAME_ELEM,Children);
-
-
- {gs, _Id, click, sort_table_id, _Args} when SortKey =/= ?ID_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?ID_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?ID_ELEM,Children);
-
-
- {gs, _Id, click, sort_owner_name, _Args} when SortKey =/= ?PROCNAME_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,
- ?PROCNAME_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?PROCNAME_ELEM,Children);
-
-
- {gs, _Id, click, sort_owner_pid, _Args} when SortKey =/= ?PID_ELEM ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,?PID_ELEM),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,?PID_ELEM,Children);
-
-
- {gs, _Id, click, trace_process, _Args} ->
- OwnerPid = element(?PID_ELEM, lists:nth(element(3,MarkedCell), Tables)),
- NewChildren = start_pman(OwnerPid, Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {gs, _Id, click, help_button, _Args} ->
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(win, HelpFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, otp_help_button, _Args} ->
- IndexFile = filename:join([code:root_dir(), "doc", "index.html"]),
- tool_utils:open_help(win, IndexFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, win, configure, _Data, _Args} ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, exit_button, _Args} ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
- {gs, _Id, click, show_haiku, _Args} ->
- gs:config(win, [{cursor,busy}]),
- gs:config(show_haiku, [{data, hide_haiku}]),
- lists:foreach(
- fun({Pid,tv_info,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_browser,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_nodewin,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- ({Pid,tv_new_table,_Data}) ->
- Pid ! {error_msg_mode,haiku};
- (_Other) ->
- done
- end,
- Children),
- put(error_msg_mode, haiku),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, _Id, click, hide_haiku, _Args} ->
- gs:config(win, [{cursor,busy}]),
- gs:config(show_haiku, [{data, show_haiku}]),
- lists:foreach(
- fun({Pid,tv_info,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_browser,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_nodewin,_Data}) ->
- Pid ! {error_msg_mode,normal};
- ({Pid,tv_new_table,_Data}) ->
- Pid ! {error_msg_mode,normal};
- (_Other) ->
- done
- end,
- Children),
- put(error_msg_mode, normal),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {gs, win, destroy, _Data, _Args} ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
- {gs, win, keypress, _Data, [Key, _, _, 1 | _]} ->
- case lists:keysearch(Key, 1, Shortcuts) of
- {value, {Key, Value}} ->
- handle_keypress(Value,KindOfTable,CurrNode,MarkedCell,
- GridLines,WinSize,Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
- false ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children)
- end;
-
-
- {gs, win, keypress, _Data, _Args} ->
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {tv_new_node, _Sender, NewCurrNode} ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,NewCurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- update_tv_browser(Children),
- NewChildren =
- case replace_node_name(NewCurrNode, CurrNode) of
- false ->
- Children;
- true ->
- update_node_name(Children)
- end,
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,NewCurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren);
-
-
- {tv_start_infowin, Table, Node, LocalNode, TableType} ->
- case start_tv_info(Table, Node, LocalNode, TableType, Children) of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,
- UnreadHidden,SysTabHidden,SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- {tv_update_infowin, Table, Node, _Type} ->
- case get_tv_info_pid(Table, Node, Children) of
- undefined ->
- done;
- Pid ->
- Pid ! #info_update_table_info{sender=self()}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
-
-
- {tv_new_table, NewTabWinPid, Node, Name, Options, KindOfTableToCreate, _Readable, false} ->
- case create_table(KindOfTableToCreate, Node, Node =:= node(), Name, Options,
- NewTabWinPid) of
- error ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _TabId ->
- case KindOfTable of
- mnesia ->
- done;
- ets ->
- self() ! {gs, tv_main, click, update, []}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children)
- end;
-
-
-
- {tv_new_table, NewTabWinPid, Node, Name, Options, KindOfTableToCreate, Readable, true} ->
- case create_table(KindOfTableToCreate, Node, Node =:= node(), Name, Options,
- NewTabWinPid) of
- error ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- TabId ->
- case start_tv_browser(TabId,Node,Name,KindOfTableToCreate,Readable,Children) of
- Children ->
- {FinalMarkedCell, NewTables, NewGridLines} =
- case KindOfTable of
- mnesia ->
- {MarkedCell, Tables, GridLines};
- ets ->
- refresh_window(MarkedCell,Tables,KindOfTable,
- CurrNode,GridLines,UnreadHidden,
- SysTabHidden,SortKey, Children)
- end,
- loop(KindOfTable,CurrNode,FinalMarkedCell,NewGridLines,WinSize,
- NewTables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- NewChildren ->
- case KindOfTable of
- mnesia ->
- done;
- ets ->
- self() ! {gs, tv_main, click, update, []}
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end
- end;
-
-
-
- {'EXIT', Pid, _Reason} ->
- case lists:keysearch(Pid, 1, Children) of
- false ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- {value, {Pid,Prog,_Data}} ->
- NewChildren =
- case Prog of
- tv_nodewin ->
- lists:keydelete(Pid, 1, Children) ++ start_tv_nodewin(CurrNode);
- _Other ->
- lists:keydelete(Pid, 1, Children)
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,
- Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
- _Other ->
- loop(KindOfTable, CurrNode, MarkedCell, GridLines, WinSize, Tables, Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children)
- end.
-
-
-flush_msgs(Msg0 = {gs, Win, Op, _, _}) ->
- receive Msg = {gs, Win,Op,_,_} ->
- flush_msgs(Msg)
- after 100 ->
- Msg0
- end.
-
-handle_keypress(open_table,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {undefined,_,_} ->
- case get(error_msg_mode) of
- normal ->
- gs:config(win, [beep]),
- tv_utils:notify(win, "TV Notification", "No table selected!");
- haiku ->
- Msg = ["Rather than a beep",
- "Or a rude error message",
- "These words: make a choice."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- Children;
- _OtherCell ->
- {Table, Name, Readable} = get_table_id(KindOfTable, element(3, MarkedCell),
- Tables),
- start_tv_browser(Table, CurrNode, Name, KindOfTable, Readable, Children)
- end,
- case NewChildren of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,UnreadHidden,
- SysTabHidden, SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _Other ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
-handle_keypress(update,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTabs, NewGrLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGrLines,WinSize,NewTabs,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(show_mnesia,ets,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?DISABLED_COLOR}]),
- gs:config(label3, [{fg, ?DISABLED_COLOR}]),
- gs:config(label4, [{fg, ?DISABLED_COLOR}]),
- gs:config(show_unreadable, [{label, {text, " Unreadable Tables "}},
- {data, show_unreadable}]),
- %% gs:config(show_unreadable, [{enable, false},
- %% {select, false}]),
- gs:config(sort_table_id, [{enable, false}]),
- NewSortKey =
- case SortKey of
- ?ID_ELEM ->
- gs:config(sort_table_name, [{select,true}]),
- ?NAME_ELEM;
- _Other ->
- SortKey
- end,
- {NewTables, NewGridLines} =
- update_grid(mnesia,CurrNode,GridLines,UnreadHidden,SysTabHidden,NewSortKey),
- gs:config(win, [{cursor,arrow}]),
- loop(mnesia,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,NewSortKey,Children);
-
-
-
-handle_keypress(show_ets,mnesia,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- gs:config(label2, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label3, [{fg, ?NORMAL_FG_COLOR}]),
- gs:config(label4, [{fg, ?NORMAL_FG_COLOR}]),
- {NewTables, NewGridLines} =
- update_grid(ets,CurrNode,GridLines,UnreadHidden,SysTabHidden,SortKey),
- %% gs:config(show_unreadable, [{enable, true},
- %% {select, not(UnreadHidden)}]),
- gs:config(sort_table_id, [{enable, true}]),
- gs:config(win, [{cursor,arrow}]),
- loop(ets,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(trace_process,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {_Id, ?PID_COL, Row} ->
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- start_pman(OwnerPid, Children);
- {_Id, ?PROCNAME_COL, Row} ->
- OwnerPid = element(?PID_ELEM, lists:nth(Row, Tables)),
- start_pman(OwnerPid, Children);
- _Other ->
- Children
- end,
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey, NewChildren);
-
-
-handle_keypress(select_node,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- show_tv_nodewin(Children),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-
-handle_keypress(show_info,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- NewChildren =
- case MarkedCell of
- {_Id, ?NAME_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- {_Id, ?ID_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- {_Id, ?INFO_COL, Row} ->
- {Table, _Name, _Readable} = get_table_id(KindOfTable, Row, Tables),
- start_tv_info(Table, CurrNode, CurrNode =:= node(), KindOfTable, Children);
- _OtherCell ->
- Children
- end,
- case NewChildren of
- Children ->
- {NewMarkedCell, NewTables, NewGridLines} =
- refresh_window(MarkedCell,Tables,KindOfTable,CurrNode,GridLines,UnreadHidden,
- SysTabHidden, SortKey, Children),
- loop(KindOfTable,CurrNode,NewMarkedCell,NewGridLines,WinSize,NewTables,
- Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children);
- _Other ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,NewChildren)
- end;
-
-
-handle_keypress(help_button,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(win, HelpFile),
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children);
-
-handle_keypress(exit_button,_KindOfTable,_CurrNode,_MarkedCell,_GridLines,
- _WinSize,_Tables,_Shortcuts,_UnreadHidden,_SysTabHidden,_SortKey,Children) ->
- lists:foreach(
- fun({Pid,pman,_OP}) ->
- exit(Pid,kill);
- (_) ->
- done
- end,
- Children),
- exit(normal);
-
-
-handle_keypress(_Any,KindOfTable,CurrNode,MarkedCell,GridLines,
- WinSize,Tables,Shortcuts,UnreadHidden,SysTabHidden,SortKey,Children) ->
- loop(KindOfTable,CurrNode,MarkedCell,GridLines,WinSize,Tables,Shortcuts,
- UnreadHidden,SysTabHidden,SortKey,Children).
-
-
-
-
-refresh_window(MarkedCell,Tables,KindOfTable,
- CurrNode,GridLines,UnreadHidden,SysTabHidden, SortKey, Children) ->
- gs:config(win, [{cursor,busy}]),
- NewMarkedCell = unmark_cell(MarkedCell, Tables),
- {NewTables, NewGridLines} =
- update_grid(KindOfTable,CurrNode,GridLines,UnreadHidden,SysTabHidden,
- SortKey),
- update_tv_info(Children),
- gs:config(win, [{cursor,arrow}]),
- {NewMarkedCell, NewTables, NewGridLines}.
-
-
-
-
-
-get_table_id(mnesia, Row, Tables) ->
- TabTuple = lists:nth(Row, Tables),
- Readable = element(?READABLE_ELEM, TabTuple),
- Id = element(?NAME_ELEM, TabTuple),
- {Id, Id, Readable};
-get_table_id(ets, Row, Tables) ->
- TabTuple = lists:nth(Row, Tables),
- Readable = element(?READABLE_ELEM, TabTuple),
- Name = element(?NAME_ELEM, TabTuple),
- case element(?NAMED_TABLE_ELEM, TabTuple) of
- false ->
- {element(?ID_ELEM, TabTuple), Name, Readable};
- _Other ->
- {Name, Name, Readable}
- end.
-
-
-
-replace_node_name('nonode@nohost', 'nonode@nohost') ->
- %% Still undistributed...
- false;
-replace_node_name(_Node, _OldNode) when node() =:= 'nonode@nohost' ->
- %% No longer distributed, but previously was!
- true;
-replace_node_name(_Node, 'nonode@nohost') ->
- %% The system has been distributed!
- true;
-replace_node_name(_Node, _OldNode) ->
- false.
-
-
-
-update_node_name(Children) when node() =:= 'nonode@nohost' ->
- %% We have been distributed, but no longer are!
- %% We change all node names stored to 'nonode@nohost'!
- %% This works because we *will* receive exit signals
- %% for those processes that have died on other nodes,
- %% whereupon these processes will be removed from the
- %% 'Children' list.
- lists:map(fun({Pid, Prog, {Table,_Node}}) ->
- {Pid, Prog, {Table,'nonode@nohost'}};
- (H) ->
- H
- end,
- Children);
-update_node_name(Children) ->
- %% We have become distributed!
- %% Change all occurrences of 'nonode@nohost'
- %% to the new current node name!
- HomeNode = node(),
- lists:map(fun({Pid, Prog, {Table,'nonode@nohost'}}) ->
- {Pid, Prog, {Table,HomeNode}};
- (H) ->
- H
- end,
- Children).
-
-
-
-
-show_tv_nodewin(Children) ->
- {value, {Pid,tv_nodewin,_Node}} = lists:keysearch(tv_nodewin, 2, Children),
- Pid ! show_window.
-
-
-
-update_tv_info(Children) ->
- Sender = self(),
- lists:foreach(fun({Pid,tv_info,{_Table,_Node}}) ->
- Pid ! #info_update_table_info{sender=Sender};
- (_) ->
- done
- end,
- Children).
-
-
-
-update_tv_browser(Children) ->
- lists:foreach(fun({Pid,tv_browser,{_Table,_Node}}) ->
- Pid ! check_node;
- (_) ->
- done
- end,
- Children).
-
-
-
-get_tv_info_pid(TabId,Node,Children) ->
- TvInfoChildren = [X || X <- Children, element(2,X) =:= tv_info],
- case lists:keysearch({TabId,Node}, 3, TvInfoChildren) of
- {value, {Pid, tv_info, {_Table,Node}}} ->
- Pid;
- _Other ->
- undefined
- end.
-
-
-
-start_tv_browser(Tab,Node,_Name,KindOfTable,false,Children) ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The selected table is unreadable!",
- "Only table information may be viewed!"]);
- haiku ->
- Msg = ["Table protected.",
- "The answers that you're seeking",
- "will remain unknown."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- start_tv_info(Tab, Node, Node =:= node(), KindOfTable, Children);
-start_tv_browser(Table,Node,Name,KindOfTable,_Readable,Children) ->
- TvBrowserChildren = [X || X <- Children, element(2,X) =:= tv_browser],
- case lists:keysearch({Table,Node}, 3, TvBrowserChildren) of
- {value, {BPid,tv_browser,{Table,Node}}} ->
- BPid ! raise,
- Children;
- _Other ->
- %% Check that table still exists!
- case table_still_there(KindOfTable, Node, Node =:= node(), Table, Name) of
- true ->
- LocalNode = (Node =:= node()),
- NewBPid = tv:start_browser(Node, LocalNode, Table, KindOfTable, Name,
- get(error_msg_mode)),
- [{NewBPid, tv_browser, {Table,Node}} | Children];
- _TableDead ->
- gs:config(win, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(win, "TV Notification",
- ["The table no longer exists!"]);
- haiku ->
- Msg = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(win, "TV Notification", Msg)
- end,
- Children
- end
- end.
-
-
-
-
-
-table_still_there(ets, Node, LocalNode, Table, Name) ->
- case catch tv_ets_rpc:all(Node, LocalNode) of
- Tables when is_list(Tables) ->
- case lists:member(Table, Tables) of
- true ->
- true;
- false -> %% May be a named table...
- lists:keymember(Name, 1, Tables)
- end;
- Error ->
- analyze_error(Error, Node, Table),
- false
- end;
-table_still_there(mnesia, Node, LocalNode, Table, Name) ->
- case catch tv_mnesia_rpc:system_info(Node, LocalNode, tables) of
- Tables when is_list(Tables) ->
- lists:member(Name, Tables);
- Error ->
- analyze_error(Error, Node, Table),
- false
- end.
-
-
-
-
-
-
-start_tv_info(Table, Node, LocalNode, KindOfTable, Children) ->
- TvInfoChildren = [X || X <- Children, element(2,X) =:= tv_info],
- case lists:keysearch({Table,Node}, 3, TvInfoChildren) of
- {value, {Pid,tv_info,{Table,Node}}} ->
- Pid ! #info_raise_window{sender = self()},
- Children;
- _Other ->
- %% May have started a browser but no info window!
- %% Info window may have been started from that browser, but
- %% don't bother with checking *that*.
- Pid = spawn_link(tv_info, info, [self(), Node, LocalNode, Table, KindOfTable,
- get(error_msg_mode)]),
- [{Pid, tv_info, {Table,Node}} | Children]
- end.
-
-
-
-
-
-start_tv_new_table(CurrNode, Children) ->
- TvNewTableChild = [X || X <- Children, element(2,X) =:= tv_new_table],
- case TvNewTableChild of
- [{Pid,tv_new_table,undefined}] ->
- Pid ! raise,
- Children;
- [] ->
- Pid = tv_new_table:start(CurrNode, get(error_msg_mode)),
- [{Pid, tv_new_table, undefined} | Children]
- end.
-
-
-
-
-create_table(mnesia, _Node, _LocalNode, _TabName, _Options, _NewTabWinPid) ->
- error;
-create_table(ets, Node, LocalNode, TabName, Options, NewTabWinPid) ->
- case tv_table_owner:create(ets, Node, LocalNode, TabName, Options) of
- {ok, TabId} ->
- NewTabWinPid ! ok,
- TabId;
- error ->
- NewTabWinPid ! error,
- error
- end.
-
-
-
-
-start_pman(OwnerPid, Children) ->
- Pid = pman_shell:start(OwnerPid),
- [{Pid,pman,OwnerPid} | Children].
-
-
-
-
-update_grid(TableType, CurrNode, GridLines, UnreadHidden, SysTabHidden,SortKey) ->
- NewTables = get_tables(CurrNode, TableType, UnreadHidden, SysTabHidden,SortKey),
- TabStr = case TableType of
- mnesia ->
- "Mnesia ";
- ets ->
- "ETS "
- end,
- NodeStr = atom_to_list(CurrNode),
- gs:config(win, [{title, "[TV] " ++ TabStr ++ "tables on " ++ NodeStr}]),
- gs:config(grid, [{rows, {1, get_nof_rows(length(NewTables), gs:read(grid,height))}}]),
- NewGridLines = update_gridlines(NewTables, GridLines, 1),
- {NewTables, NewGridLines}.
-
-
-
-unmark_cell({undefined, AnyCol, AnyRow}, _Tables) ->
- {undefined, AnyCol, AnyRow};
-unmark_cell({Id, Col, Row}, Tables) ->
- disable_menus(),
- TabTuple = lists:nth(Row, Tables),
- ReadableTable = element(?READABLE_ELEM, TabTuple),
- NamedTable = element(?NAMED_TABLE_ELEM, TabTuple),
- BgColor =
- case ReadableTable of
- false ->
- ?UNREADABLE_BG_COLOR;
- _Other1 ->
- ?READABLE_BG_COLOR
- end,
-
- FgColor =
- case NamedTable of
- false when Col =:= ?NAME_COL ->
- ?UNNAMED_FG_COLOR;
- _Other2 ->
- ?NORMAL_FG_COLOR
- end,
-
- gs:config(Id, [{bg, {Col, BgColor}},
- {fg, {Col, FgColor}}]),
- {undefined, undefined, undefined}.
-
-
-
-
-mark_cell({Id,Col,Row}, {Id,Col,Row}, _Readable) ->
- {undefined, undefined, undefined};
-mark_cell({Id,Col,Row}, _Any, Readable) ->
- case lists:member(Col, ?POSSIBLE_MARK_COLS) of
- true ->
- enable_menus(Col, Readable),
- gs:config(Id, [{bg, {Col, ?GRID_MARK_COLOR}},
- {fg, {Col, ?NORMAL_FG_COLOR}}]),
- {Id, Col,Row};
- false ->
- {undefined, undefined, undefined}
- end.
-
-
-disable_menus() ->
- disable_open_menu(),
- disable_trace_menu(),
- disable_info_menu().
-
-
-enable_menus(?ID_COL, true) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?ID_COL, {notext}) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?ID_COL, false) ->
- enable_info_menu();
-enable_menus(?NAME_COL, true) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?NAME_COL, {notext}) ->
- enable_open_menu(),
- enable_info_menu();
-enable_menus(?NAME_COL, false) ->
- enable_info_menu();
-enable_menus(?PID_COL, _Any) ->
- enable_trace_menu();
-enable_menus(?PROCNAME_COL, _Any) ->
- enable_trace_menu();
-enable_menus(?INFO_COL, _Any) ->
- enable_info_menu();
-enable_menus(_Col, _Any) ->
- done.
-
-
-
-resize_window(Width, Height, NofElems) ->
- WinWidth = lists:max([Width, ?MIN_WIN_WIDTH]),
- WinHeight = lists:max([Height, ?MIN_WIN_HEIGHT]),
- gs:config(win, [{width, WinWidth},
- {height, WinHeight}
- ]),
- {BgWidth, BgHeight, FgWidth, FgHeight} = get_frame_coords(WinWidth, WinHeight),
- {GridWidth, GridHeight} = get_grid_coords(FgWidth, FgHeight),
- ColWidths = get_col_widths(?COL_WIDTHS, GridWidth),
- resize_header_labels(ColWidths,
- [label1,label2,label3,label4,label5],
- ?GRID_XPOS),
- gs:config(bgframe, [{width, BgWidth},
- {height, BgHeight}
- ]),
- gs:config(fgframe, [{width, FgWidth},
- {height, FgHeight}
- ]),
- gs:config(grid, [{width, GridWidth},
- {height, GridHeight},
- {columnwidths, ColWidths},
- {rows, {1, get_nof_rows(NofElems, GridHeight)}}
- ]),
- {WinWidth, WinHeight}.
-
-
-
-
-create_window(Tables) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] ETS tables on " ++
- atom_to_list(node())},
- {destroy, true},
- {configure, true},
- {keypress, true}
- ]),
-
- ShortcutList = create_menus(),
-
- disable_menus(),
-
- {BgFrameWidth, BgFrameHeight, FgFrameWidth, FgFrameHeight} =
- get_frame_coords(?WIN_WIDTH, ?WIN_HEIGHT),
-
- {GridWidth, GridHeight} = get_grid_coords(FgFrameWidth, FgFrameHeight),
-
- ColWidths = get_col_widths(?COL_WIDTHS, GridWidth),
-
- gs:frame(bgframe, win, [{width, BgFrameWidth},
- {height, BgFrameHeight},
- {x, ?GRID_XPOS},
- {y, ?GRID_YPOS},
- {bg, {0,0,0}}
- ]),
- gs:frame(fgframe, bgframe, [{width, FgFrameWidth},
- {height, FgFrameHeight},
- {x, 0},
- {y, 1},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
-
-
- create_header_labels(ColWidths, ?HEADER_LABELS),
- gs:grid(grid, fgframe, [{width, GridWidth},
- {height, GridHeight},
- {x, 0},
- {y, -1},
- {hscroll,bottom},
- {vscroll,right},
- {rows, {1, get_nof_rows(length(Tables), GridHeight)}},
- {columnwidths, ColWidths},
- {fg, ?NORMAL_FG_COLOR},
- {bg, {255,255,255}},
- {font, ?FONT}
- ]),
- GridLines = update_gridlines(Tables, [], 1),
- {{undefined,undefined,undefined}, GridLines, {?WIN_WIDTH,?WIN_HEIGHT}, ShortcutList}.
-
-
-
-
-get_frame_coords(WinWidth, WinHeight) ->
- BgWidth = WinWidth - 2 * ?GRID_XPOS,
- BgHeight = WinHeight - ?GRID_YPOS - ?GRID_XPOS,
- FgWidth = BgWidth,
- FgHeight = BgHeight - 1,
- {BgWidth, BgHeight, FgWidth, FgHeight}.
-
-
-
-
-get_grid_coords(ParentWidth, ParentHeight) ->
- {ParentWidth, ParentHeight + 1}.
-
-
-
-get_col_widths(Cols, GridWidth) ->
- SbWidth = 25, %% OK, OK, don't bother about it, this constant makes it work... :-/
- FixColWidthSum = lists:sum(lists:map(fun(H) ->
- lists:nth(H, Cols)
- end,
- ?FIX_WIDTH_COLS)),
- AvailableWidth = GridWidth - FixColWidthSum - SbWidth,
- OriginalWidth = ?WIN_WIDTH - 2 * ?GRID_XPOS - FixColWidthSum - SbWidth,
- get_col_widths(1, Cols, AvailableWidth, OriginalWidth).
-
-
-
-get_col_widths(N, [H | T], AvailWidth, OrigWidth) ->
- NewColWidth =
- case lists:member(N, ?FIX_WIDTH_COLS) of
- true ->
- H;
- _Other ->
- round(H * (AvailWidth / OrigWidth) + 0.1)
- end,
- [NewColWidth | get_col_widths(N + 1, T, AvailWidth, OrigWidth)];
-get_col_widths(_N, [], _AvailWidth, _OrigWidth) ->
- [].
-
-
-
-create_header_labels(ColWidths, Text) ->
- create_header_labels(ColWidths, Text, 1, ?GRID_XPOS).
-
-
-
-create_header_labels([W | T], [{Name, Text} | TextT], N, Xpos) ->
- Ypos = ?GRID_YPOS - 20,
- gs:label(Name, win, [{width, W + 1 - 3},
- {height, 20},
- {x, Xpos + 1 + 3},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NORMAL_FG_COLOR},
- {font, ?HEADER_FONT},
- {align, w},
- {label, {text, Text}}
- ]),
- create_header_labels(T, TextT, N + 1, Xpos + 1 + W);
-create_header_labels([], [], _N, _Xpos) ->
- done.
-
-
-
-resize_header_labels([W | T], [Name | NT], Xpos) ->
- gs:config(Name, [{width, W + 1 - 3},
- {x, Xpos + 1 + 3}
- ]),
- resize_header_labels(T, NT, Xpos + 1 + W);
-resize_header_labels([], [], _Xpos) ->
- done.
-
-
-
-disable_open_menu() ->
- gs:config(open_table, [{enable,false}]).
-
-
-disable_info_menu() ->
- gs:config(show_info, [{enable,false}]).
-
-disable_trace_menu() ->
- gs:config(trace_process, [{enable,false}]).
-
-
-enable_open_menu() ->
- gs:config(open_table, [{enable,true}]).
-
-
-enable_info_menu() ->
- gs:config(show_info, [{enable,true}]).
-
-
-enable_trace_menu() ->
- gs:config(trace_process, [{enable,true}]).
-
-
-create_menus() ->
- gs:menubar(menubar, win, [{bg, ?DEFAULT_BG_COLOR}]),
-
- HelpButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " Help "}},
- {underline, 1},
- {side, right}
- ]),
- FileButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " File "}},
- {underline, 1},
- {side, left}
- ]),
- ViewButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " View "}},
- {underline, 1},
- {side, left}
- ]),
- OptionsButt = gs:menubutton(menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK}, % firebrick
- {label, {text, " Options "}},
- {underline, 1},
- {side, left}
- ]),
-
- HelpMenu = gs:menu(HelpButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
- FileMenu = gs:menu(FileButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- OptionsMenu = gs:menu(OptionsButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- ViewMenu = gs:menu(ViewButt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {disabledfg,?DISABLED_COLOR}
- ]),
-
- ShortCutList =
- create_menulist([{" Help ",normal,help_button,1,h},
- separator,
- {" OTP Documentation ",normal,otp_help_button,1,no_char}], HelpMenu) ++
- create_menulist([{" Open Table ",normal,open_table,1,o},
- {" New Table... ",normal,new_table,1,no_char},
- {" Table Info ",normal,show_info,7,i},
- separator,
- {" Nodes... ",normal,select_node,1,n},
- separator,
- {" Trace Process ",normal,trace_process,1,t},
- separator,
- {" Exit ",normal, exit_button,2,x}], FileMenu) ++
- [{c,exit_button}, {'C',exit_button}] ++
- create_menulist([{" Refresh ",normal,update,1,r},
- separator,
- {" Unreadable Tables ",check,show_unreadable,1,no_char},
- separator,
- {" System Tables ",check,show_system,1,no_char},
- separator,
- {" Sort by Name ",radio,sort_table_name,9,no_char},
- {" Sort by Id ",radio,sort_table_id,9,no_char},
- {" Sort by Owner PID ",radio,sort_owner_pid,15,no_char},
- {" Sort by Owner Name ",radio,sort_owner_name,9,no_char},
- separator,
- {" Error Messages in Haiku ",check,show_haiku,1,no_char}
- ],
- OptionsMenu) ++
- create_menulist([{" ETS Tables ",radio,show_ets,1,e},
- {" Mnesia Tables ",radio,show_mnesia,1,m}], ViewMenu),
- gs:config(show_unreadable, [{select,false}]),
- gs:config(show_system, [{select,false}]),
- gs:config(show_haiku, [{select,false}]),
- %% Due to a bug (or some other reason), only one of the radiobuttons belonging
- %% to a specified group can be selected, even if different processes have created
- %% the radiobuttons! This means that, if we have started more than one tv_main
- %% process, selecting one radiobutton will affect the radiobuttons in the other
- %% tv_main process(es)!!! Since this is a highly undesirable bahaviour, we have to
- %% create unique group names (i.e., atoms).
- %% (We need to group the radiobuttons, since otherwise all created by one process
- %% belongs to the same group, which also is undesirable...)
- SelfStr = pid_to_list(self()),
- SortGroup = list_to_atom("sorting" ++ SelfStr),
- TypeGroup = list_to_atom("table_type" ++ SelfStr),
- gs:config(sort_table_name, [{group,SortGroup},{select,true}]),
- gs:config(sort_table_id, [{group,SortGroup}]),
- gs:config(sort_owner_pid, [{group,SortGroup}]),
- gs:config(sort_owner_name, [{group,SortGroup}]),
- gs:config(show_ets, [{group,TypeGroup}, {select,true}]),
- gs:config(show_mnesia, [{group,TypeGroup}]),
- ShortCutList.
-
-
-
-
-
-create_menulist(List, Menu) ->
- MaxLength = get_length_of_longest_menu_text(List, 0),
- create_menulist(List, Menu, MaxLength).
-
-
-
-
-create_menulist([], _Menu, _MaxLength) ->
- [];
-create_menulist([{Text, Type, Data, AccCharPos, ShortcutChar} | Rest], Menu, MaxLength) ->
- ShortcutCapitalChar =
- if
- ShortcutChar =:= no_char ->
- no_char;
- true ->
- CharAsciiValue = lists:nth(1, atom_to_list(ShortcutChar)),
- CapitalCharValue = CharAsciiValue - ($a - $A),
- list_to_atom([CapitalCharValue])
- end,
-
- FinalText = if
- ShortcutChar =:= no_char ->
- Text;
- true ->
- Text ++ lists:duplicate(MaxLength - length(Text), " ") ++
- " Ctrl+" ++ atom_to_list(ShortcutCapitalChar) ++ " "
- end,
- gs:menuitem(Data, Menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?FIREBRICK},
- {itemtype, Type},
- {label, {text, FinalText}},
- {underline, AccCharPos},
- {data, Data}
- ]),
- [{ShortcutChar, Data}, {ShortcutCapitalChar, Data} | create_menulist(Rest, Menu, MaxLength)];
-create_menulist([separator | Rest], Menu, MaxLength) ->
- gs:menuitem(Menu, [{itemtype, separator}]),
- create_menulist(Rest, Menu, MaxLength).
-
-
-
-
-
-
-
-get_length_of_longest_menu_text([], MaxLength) ->
- MaxLength;
-get_length_of_longest_menu_text([{Text, _Type, _Data, _APos, _SChar} | Rest], CurrMax) ->
- L = length(Text),
- if
- L > CurrMax ->
- get_length_of_longest_menu_text(Rest, L);
- true ->
- get_length_of_longest_menu_text(Rest, CurrMax)
- end;
-get_length_of_longest_menu_text([separator | Rest], CurrMax) ->
- get_length_of_longest_menu_text(Rest, CurrMax).
-
-
-
-
-
-
-get_nof_rows(NofElems, GridHeight) ->
- lists:max([NofElems, round((GridHeight - 20) / 21) + 1]).
-
-
-
-config_gridline(LineId, TabTuple) ->
- Readable = element(?READABLE_ELEM, TabTuple),
- NamedTable = element(?NAMED_TABLE_ELEM, TabTuple),
- {FgColor, BgColor} =
- case Readable of
- true ->
- {?NORMAL_FG_COLOR, ?READABLE_BG_COLOR};
- false ->
- {?UNREADABLE_FG_COLOR, ?UNREADABLE_BG_COLOR};
- {notext} ->
- {?NORMAL_FG_COLOR, ?READABLE_BG_COLOR}
- end,
-
- NameFgColor =
- case NamedTable of
- false ->
- ?UNNAMED_FG_COLOR;
- _Other ->
- ?NORMAL_FG_COLOR
- end,
-
- gs:config(LineId, [{bg, BgColor},
- {fg, FgColor},
- {fg, {?NAME_COL, NameFgColor}},
- {click, true},
- {doubleclick, true},
- {data, {grid,Readable}} |
-
- lists:map(
- fun({Elem,Col}) ->
- case element(Elem, TabTuple) of
- {notext} ->
- {text, {Col, ""}};
- Other when Elem =:= ?NAME_ELEM ->
- case NamedTable of
- false ->
- {text, {Col, " " ++
- lists:flatten(
- io_lib:write(
- Other)) ++ " "}};
- _AnyOther ->
- {text, {Col, " " ++ lists:flatten(
- io_lib:write(
- Other))}}
- end;
- Other ->
- {text, {Col, " " ++ lists:flatten(
- io_lib:write(
- Other))}}
- end
- end,
- [{?NAME_ELEM, ?NAME_COL},
- {?ID_ELEM, ?ID_COL},
- {?PID_ELEM, ?PID_COL},
- {?PROCNAME_ELEM, ?PROCNAME_COL},
- {?INFO_ELEM, ?INFO_COL}]
- )
- ]).
-
-
-
-
-
-update_gridlines([TabTuple | TT], [LineId | GT], CurrRow) ->
- config_gridline(LineId, TabTuple),
- [LineId | update_gridlines(TT, GT, CurrRow + 1)];
-update_gridlines([TabTuple | TT], [], CurrRow) ->
- LineId = gs:gridline(grid, [{row, CurrRow}]),
- config_gridline(LineId, TabTuple),
- [LineId | update_gridlines(TT, [], CurrRow + 1)];
-update_gridlines([], [LineId | GT], _CurrRow) ->
- gs:destroy(LineId),
- update_gridlines([], GT, _CurrRow);
-update_gridlines([], [], _CurrRow) ->
- [].
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_main.hrl b/lib/tv/src/tv_main.hrl
deleted file mode 100644
index c9db1d9484..0000000000
--- a/lib/tv/src/tv_main.hrl
+++ /dev/null
@@ -1,285 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2013. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-
--define(ERROR_MSG_MODE, normal).
-
--define(WIN_WIDTH, 745). % 779
--define(WIN_HEIGHT, 380).
--define(MIN_WIN_WIDTH, 524).
--define(MIN_WIN_HEIGHT, 150).
-
--define(FONT, {screen, 12}).
--define(HEADER_FONT, {screen, [bold,italic], 12}).
-
--define(GRID_XPOS, 3).
--define(GRID_YPOS, 68).
-
-
-%% Unreadable tables are indicated by the background color.
-%% Unnamed tables are indicated by the foreground color.
-
--define(NORMAL_FG_COLOR, {0,0,0}).
--define(READABLE_BG_COLOR, {255,255,255}).
--define(UNREADABLE_FG_COLOR, ?NORMAL_FG_COLOR).
--define(UNREADABLE_BG_COLOR, {240,240,240}).
-%-define(UNREADABLE_BG_COLOR, {255,250,230}).
-%-define(UNREADABLE_BG_COLOR, {242,242,242}).
--define(UNNAMED_FG_COLOR, {175,175,175}).
-%-define(UNNAMED_FG_COLOR, {140,35,35}).
-
-
--define(DISABLED_COLOR, {160,160,160}).
-
--define(NAME_ELEM, 1).
--define(NAMED_TABLE_ELEM, 2).
--define(ID_ELEM, 3).
--define(READABLE_ELEM, 4).
--define(PID_ELEM, 5).
--define(PROCNAME_ELEM, 6).
--define(INFO_ELEM, 7).
-
--define(NAME_COL, 1).
--define(ID_COL, 2).
--define(PID_COL, 3).
--define(PROCNAME_COL, 4).
--define(INFO_COL, 5).
-
--define(POSSIBLE_MARK_COLS, [?NAME_COL, ?ID_COL, ?PID_COL, ?PROCNAME_COL, ?INFO_COL]).
--define(COL_WIDTHS, [205,131,91,197,90]). % [140,95,125,75,85,140,90]).
--define(FIX_WIDTH_COLS, [2,3,5]).
-
-
--define(HEADER_LABELS, [{label1, " Table Name"},
- % {label2, " Named Table"},
- {label2, " Table Id"},
- % {label4, " Readable"},
- {label3, " Owner Pid"},
- {label4, " Owner Name"},
- {label5, " Table Size"}
- ]).
-
-
-
-%% TABLES_TO_HIDE shall contain both Mnesia and ETS tables that we want to hide. :-)
-
--define(SYSTEM_TABLES, [ac_tab,
- asn1,
- cdv_dump_index_table,
- cdv_menu_table,
- cdv_decode_heap_table,
- cell_id,
- cell_pos,
- clist,
- cover_internal_data_table,
- cover_collected_remote_data_table,
- cover_binary_code_table,
- code,
- code_names,
- cookies,
- corba_policy,
- corba_policy_associations,
- dets,
- dets_owners,
- dets_registry,
- disk_log_names,
- disk_log_pids,
- eprof,
- erl_atom_cache,
- erl_epmd_nodes,
- etop_accum_tab,
- etop_tr,
- ets_coverage_data,
- file_io_servers,
- global,
- global_locks,
- global_names,
- global_names_ext,
- gs_mapping,
- gs_names,
- gstk_db,
- gstk_grid_cellid,
- gstk_grid_cellpos,
- gstk_grid_id,
- gvar,
- httpd,
- id,
- ig,
- ign_req_index,
- ign_requests,
- index,
- inet_cache,
- inet_db,
- inet_hosts,
- 'InitialReferences',
- int_db,
- interpreter_includedirs_macros,
- ir_WstringDef,
- lmcounter,
- locks,
- pg2_table,
- queue,
- snmp_agent_table,
- snmp_local_db2,
- snmp_mib_data,
- snmp_note_store,
- snmp_symbolic_ets,
- sticky,
- sys_dist,
- tid_locks,
- tkFun,
- tkLink,
- tkPriv,
- ttb,
- ttb_history_table,
- udp_fds,
- udp_pids
- ]).
-
-
--define(MNESIA_TABLES, [alarm,
- alarmTable,
- evaLogDiscriminatorTable,
- eva_snmp_map,
- eventTable,
- group,
- imprec,
- ir_AliasDef,
- ir_ArrayDef,
- ir_AttributeDef,
- ir_ConstantDef,
- ir_Contained,
- ir_Container,
- ir_EnumDef,
- ir_ExceptionDef,
- ir_IDLType,
- ir_IRObject,
- ir_InterfaceDef,
- ir_ModuleDef,
- ir_ORB,
- ir_OperationDef,
- ir_PrimitiveDef,
- ir_Repository,
- ir_SequenceDef,
- ir_StringDef,
- ir_StructDef,
- ir_TypedefDef,
- ir_UnionDef,
- logTable,
- logTransferTable,
- mesh_meas,
- mesh_type,
- mnesia_clist,
- mnesia_decision,
- mnesia_transient_decision,
- orber_CosNaming,
- orber_objkeys,
- schema,
- user
- ]).
-
-
--define(UNREADABLE_MNESIA_TABLES, [schema]).
-
-
--define(SYSTEM_OWNERS, [alarm_handler,
- application_controller,
- auth,
- coast_server,
- code_server,
- cover_server_001,
- dbg,
- dets,
- dets_sup,
- disk_log_server,
- disk_log_sup,
- erl_epmd,
- erl_prim_loader,
- error_logger,
- eva_log_sup,
- eva_server,
- eva_sup,
- file_server,
- file_server_2,
- global_group,
- global_group_check,
- global_name_server,
- gs_frontend,
- heart,
- help_main,
- inet_db,
- inet_gethost_native,
- init,
- int_db,
- interpret,
- jive_server,
- kernel_safe_sup,
- kernel_sup,
- log_server,
- mandel_server,
- mesh_sup,
- mesh_server,
- mnesia_checkpoint_sup,
- mnesia_dumper,
- mnesia_event,
- mnesia_fallback,
- mnesia_init,
- mnesia_kernel_sup,
- mnesia_late_loader,
- mnesia_locker,
- mnesia_monitor,
- mnesia_recover,
- mnesia_snmp_sup,
- mnesia_subscr,
- mnesia_sup,
- mnesia_tm,
- net_kernel,
- net_sup,
- overload,
- perfmon_sampler,
- pxw_server,
- release_handler,
- %% rex, %% Otherwise we won't see tables we've created on other nodes!
- rsh_starter,
- sasl_safe_sup,
- sasl_sup,
- snmp_agent_sup,
- snmp_local_db,
- snmp_master_agent,
- snmp_misc_sup,
- snmp_note_store,
- snmp_supervisor,
- snmp_symbolic_store,
- socket,
- sounder,
- ssl_socket,
- take_over_monitor,
- timer_server,
- tk,
- udp_server,
- user,
- winshell_controller,
- xerl_copy,
- xerl_monitor
- ]).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_mnesia_rpc.erl b/lib/tv/src/tv_mnesia_rpc.erl
deleted file mode 100644
index b2434fcdd3..0000000000
--- a/lib/tv/src/tv_mnesia_rpc.erl
+++ /dev/null
@@ -1,106 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2011. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_mnesia_rpc).
-
-
-
--export([system_info/3,
- table_info/4,
- transaction/3
- ]).
-
-
-
-
-
-
-system_info(_Node, true, Key) ->
- chk(catch mnesia:system_info(Key));
-system_info(Node, false, Key) ->
- chk(catch rpc:block_call(Node, mnesia, system_info, [Key])).
-
-
-
-
-table_info(_Node, true, Tab, Item) ->
- chk(catch mnesia:table_info(Tab, Item));
-table_info(Node, false, Tab, Item) ->
- chk(catch rpc:block_call(Node, mnesia, table_info, [Tab, Item])).
-
-
-
-
-transaction(_Node, true, Fun) ->
- chk(catch mnesia:transaction(Fun));
-transaction(Node, false, Fun) ->
- chk(catch rpc:block_call(Node, mnesia, transaction, [Fun])).
-
-
-
-
-chk(Result) ->
- case Result of
- _Anything when is_list(Result) ->
- Result;
- _Anything when is_atom(Result) ->
- Result;
- _Anything when is_integer(Result) ->
- Result;
- _Anything when is_pid(Result) ->
- Result;
-
- {aborted, {bad_type, _Rec}} ->
- throw(bad_format);
-
- {badrpc,nodedown} ->
- throw(nodedown);
- {'EXIT', nodedown} ->
- throw(nodedown);
-
- {'EXIT', {aborted, {no_exists, _Table, _Arg}}} ->
- throw(no_table);
-
- {'EXIT', {aborted, {node_not_running, _Node}}} ->
- throw(mnesia_not_started);
- {'EXIT', {{badarg, {gen, set_monitor_mode, _Data}}, _Info}} ->
- throw(mnesia_not_started);
- {'EXIT', {'EXIT', {aborted, {node_not_running,_Node}}}} ->
- throw(mnesia_not_started);
- {badrpc, {'EXIT', {aborted, {node_not_running,_Node}}}} ->
- throw(mnesia_not_started);
- {badrpc, {'EXIT', {aborted, {no_exists,_Table,_Args}}}} ->
- throw(mnesia_not_started);
- {badrpc, _Reason} ->
- throw(mnesia_not_started);
- {'EXIT', {undef, {mnesia,_Fcn,_Args,_}}} ->
- throw(mnesia_not_started);
- {'EXIT', {undef, {mnesia,_Fcn,_Args}}} ->
- throw(mnesia_not_started);
-
- {'EXIT', Reason} ->
- throw({unexpected_error, Reason});
-
- Other when is_tuple(Other) ->
- %% For example wild_pattern requests return a tuple!
- Other;
-
- Other ->
- io:format("Unexpected return value: ~p~n", [Other])
- end.
-
-
diff --git a/lib/tv/src/tv_new_table.erl b/lib/tv/src/tv_new_table.erl
deleted file mode 100644
index 779835d78a..0000000000
--- a/lib/tv/src/tv_new_table.erl
+++ /dev/null
@@ -1,666 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%k
--module(tv_new_table).
--compile([{nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,checkbutton,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,radiobutton,3}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/2,
- init/3
- ]).
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
--define(FONT, {screen, 12}).
-
--define(WIN_WIDTH, 400).
--define(WIN_HEIGHT, 555). %% 510
-
--define(FRAME_WIDTH, 400).
--define(FRAME1_HEIGHT, 170).
--define(FRAME2_HEIGHT, 260).
--define(FRAME3_HEIGHT, 125). %% 80
--define(BW, 2).
-
--define(FRAME_X, 0).
--define(FRAME1_Y, 0).
--define(FRAME2_Y, 170).
--define(FRAME3_Y, 430).
-
-
--define(LBL_HEIGHT, 30).
--define(NODE_LBL_WIDTH, 45).
--define(NAME_LBL_WIDTH, 85).
--define(TYPE_LBL_WIDTH, 45).
--define(PROT_LBL_WIDTH, 85).
--define(KEYPOS_LBL_WIDTH, 95).
-
--define(LBL_X, 10).
--define(NODE_LBL_Y, 20).
--define(NAME_LBL_Y, 80).
--define(TYPE_LBL_Y, 10).
--define(PROT_LBL_Y, 100).
--define(KEYPOS_LBL_Y, 200).
-
-
--define(ENTRY_HEIGHT, 30).
--define(NODE_ENTRY_WIDTH, 275).
--define(NAME_ENTRY_WIDTH, 275).
--define(KEYPOS_ENTRY_WIDTH, 50).
-
--define(ENTRY_X1, 110).
--define(ENTRY_X2, 110).
--define(NODE_ENTRY_Y, 20).
--define(NAME_ENTRY_Y, 80).
--define(KEYPOS_ENTRY_Y, 200).
-
--define(RBTN_HEIGHT, 30).
--define(RBTN_WIDTH1, 105).
--define(RBTN_WIDTH2, 115).
-
--define(RBTN_X1, 60).
--define(RBTN_X2, 165).
--define(RBTN_X3, 270).
--define(RBTN_Y1, 40).
--define(RBTN_Y1PLUS, 70).
--define(RBTN_Y2, 130).
-
-
--define(CBTN_HEIGHT, 30).
--define(NAMED_TABLE_CBTN_WIDTH, 100).
--define(OPEN_BROWSER_CBTN_WIDTH, 105).
-
--define(NAMED_TABLE_CBTN_X, 110).
--define(NAMED_TABLE_CBTN_Y, 120).
-
--define(OPEN_BROWSER_CBTN_X, 85). %% 215
--define(OPEN_BROWSER_CBTN_Y, 10). %% 200
-
-
--define(BTN_WIDTH, 100).
--define(BTN_HEIGHT, 30).
-
--define(BTN_X1, 85).
--define(BTN_X2, 225).
--define(BTN_Y, 65). %% 30
-
-
--define(VLINE_LBL_WIDTH, (380 - 2 * ?BW)).
--define(VLINE_LBL_HEIGHT, 1).
--define(HLINE_LBL_WIDTH, 1).
--define(HLINE_LBL_HEIGHT, 70).
-
--define(VLINE_LBL_X, (10 - ?BW)).
--define(VLINE_LBL_Y1, 85).
--define(VLINE_LBL_Y2, 180).
--define(HLINE_LBL_X, 188).
--define(HLINE_LBL_Y, 180).
-
-
--define(DEFAULT_NAME, my_table).
--define(DEFAULT_TYPE, set).
--define(DEFAULT_PROT, public).
--define(DEFAULT_KEYPOS, 1).
-
-
-
-
-start(Node, ErrMsgMode) ->
- spawn_link(?MODULE, init, [Node, ErrMsgMode, self()]).
-
-
-
-
-
-init(Node, ErrMsgMode, MPid) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- create_window(Node),
- loop(false, ?DEFAULT_TYPE, ?DEFAULT_PROT, true, MPid).
-
-
-
-
-
-loop(NamedTab, Type, Prot, OpenBrowser, MPid) ->
- receive
-
- {gs, ok, click, _Data, _Args} ->
- gs:config(win, [{cursor, busy}]),
- case create_table(NamedTab, Type, Prot, OpenBrowser, MPid) of
- ok ->
- exit(normal);
- error ->
- gs:config(win, [{cursor, arrow}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
- end;
-
-
- {gs, cancel, click, _Data, _Args} ->
- exit(normal);
-
-
- {gs, set, click, _Data, _Args} ->
- loop(NamedTab, set, Prot, OpenBrowser, MPid);
-
-
- {gs, ordered_set, click, _Data, _Args} ->
- loop(NamedTab, ordered_set, Prot, OpenBrowser, MPid);
-
-
- {gs, bag, click, _Data, _Args} ->
- loop(NamedTab, bag, Prot, OpenBrowser, MPid);
-
-
- {gs, duplicate_bag, click, _Data, _Args} ->
- loop(NamedTab, duplicate_bag, Prot, OpenBrowser, MPid);
-
-
- {gs, public, click, _Data, _Args} ->
- gs:config(open_browser, [{enable, true}, {select, OpenBrowser}]),
- loop(NamedTab, Type, public, OpenBrowser, MPid);
-
-
- {gs, protected, click, _Data, _Args} ->
- gs:config(open_browser, [{enable, true}, {select, OpenBrowser}]),
- loop(NamedTab, Type, protected, OpenBrowser, MPid);
-
-
- {gs, private, click, _Data, _Args} ->
- gs:config(open_browser, [{select, false}, {enable, false}]),
- loop(NamedTab, Type, private, OpenBrowser, MPid);
-
-
- {gs, named_table, click, Data, _Args} ->
- gs:config(named_table, [{data, not(Data)}]),
- loop(Data, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, open_browser, click, Data, _Args} ->
- gs:config(open_browser, [{data, not(Data)}]),
- loop(Data, Type, Prot, Data, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 0 | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, forward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 1 | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, backward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Down' | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, forward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, EntryId, keypress, _Data, ['Up' | _T]} ->
- case get_entry_term(EntryId) of
- {ok, _Term} ->
- gs:config(next_entry(EntryId, backward), [{setfocus, true},
- {select, {0, 100000000}}]);
- error ->
- done
- end,
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, _EntryId, keypress, _Data, ['Return' | _T]} ->
- gs:config(win, [{cursor, busy}]),
- case create_table(NamedTab, Type, Prot, OpenBrowser, MPid) of
- ok ->
- exit(normal);
- error ->
- gs:config(win, [{cursor, arrow}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
- end;
-
-
- {gs, win, configure, _Data, _Args} ->
- gs:config(win, [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT}]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {gs, win, destroy, _Data, _Args} ->
- exit(normal);
-
-
- raise ->
- gs:config(win, [raise]),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {error_msg_mode, ErrMsgMode} ->
- put(error_msg_mode, ErrMsgMode),
- loop(NamedTab, Type, Prot, OpenBrowser, MPid);
-
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
-
- _Other ->
- loop(NamedTab, Type, Prot, OpenBrowser, MPid)
-
- end.
-
-
-
-
-create_table(NamedTab, Type, Prot, OpenBrowser, MPid) ->
- case get_entry_term(node_entry) of
- error ->
- error;
- {ok, Node} ->
- case get_entry_term(name_entry) of
- error ->
- error;
- {ok, TabName} ->
- case get_entry_term(keypos_entry) of
- error ->
- error;
- {ok, KeyPos} ->
- Options =
- [Type, Prot, {keypos, KeyPos}] ++
- case NamedTab of
- true ->
- [named_table];
- false ->
- []
- end,
- {Readable, NewOpenBrowser} =
- case Prot of
- private ->
- {false, false};
- _Other ->
- {true, OpenBrowser}
- end,
- MPid ! {tv_new_table, self(), Node, TabName, Options, ets,
- Readable, NewOpenBrowser},
- receive
- ok ->
- ok;
- error ->
- show_error_msg(),
- error
- after
- 5000 ->
- show_error_msg(),
- error
- end
- end
- end
- end.
-
-
-
-
-
-show_error_msg() ->
- Msg =
- case get(error_msg_mode) of
- normal ->
- ["Couldn't create a table using",
- "the specified settings!"];
- haiku ->
- ["The table you want",
- "Could maybe be created.",
- "But I don't know how."]
- end,
- tv_utils:notify(win, "TV Notification", Msg).
-
-
-
-
-
-
-
-get_entry_term(Id) ->
- EditedStr = gs:read(Id, text),
- case tv_db_search:string_to_term(EditedStr) of
- {ok, NewTerm} when Id =:= node_entry, is_atom(NewTerm) ->
- {ok,NewTerm};
- {ok, NewTerm} when Id =:= name_entry, is_atom(NewTerm) ->
- {ok,NewTerm};
- {ok, NewTerm} when Id =:= keypos_entry, is_integer(NewTerm), NewTerm > 0 ->
- {ok,NewTerm};
- _Other ->
- NewMsg =
- case get(error_msg_mode) of
- normal ->
- case Id of
- node_entry ->
- ["Please enter a valid node name!"];
- name_entry ->
- ["Please enter a valid table name!"];
- keypos_entry ->
- ["Please enter a valid key position!"]
- end;
- haiku ->
- E1 = "Aborted effort",
- L =
- case Id of
- node_entry ->
- ["Reflect, repent and retype:",
- "Enter valid node."];
- name_entry ->
- ["Reflect, repent and retype:",
- "Enter valid name."];
- keypos_entry ->
- ["Reflect, repent and retype",
- "Key position, please."]
- end,
- [E1 | L]
- end,
- gs:config(Id, [beep, {select, {0, 100000000}}, {setfocus, true}]),
- tv_utils:notify(win, "TV Notification", NewMsg),
- error
- end.
-
-
-
-
-
-next_entry(node_entry, forward) ->
- name_entry;
-next_entry(node_entry, backward) ->
- keypos_entry;
-next_entry(name_entry, forward) ->
- keypos_entry;
-next_entry(name_entry, backward) ->
- node_entry;
-next_entry(keypos_entry, forward) ->
- node_entry;
-next_entry(keypos_entry, backward) ->
- name_entry.
-
-
-
-
-create_window(Node) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?WIN_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Create New ETS Table"},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- gs:frame(frame1, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME1_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME1_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
- gs:frame(frame2, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME2_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME2_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
- gs:frame(frame3, win, [{width, ?FRAME_WIDTH},
- {height, ?FRAME3_HEIGHT},
- {x, ?FRAME_X},
- {y, ?FRAME3_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {bw, ?BW}]),
-
- gs:label(frame1, [{width, ?NODE_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?NODE_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Node:"}}
- ]),
- gs:label(frame1, [{width, ?NAME_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?NAME_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Table name:"}}
- ]),
- gs:label(frame2, [{width, ?TYPE_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?TYPE_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Type:"}}
- ]),
- gs:label(frame2, [{width, ?PROT_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?PROT_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Protection:"}}
- ]),
- gs:label(frame2, [{width, ?KEYPOS_LBL_WIDTH},
- {height, ?LBL_HEIGHT},
- {x, ?LBL_X},
- {y, ?KEYPOS_LBL_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align, w},
- {font, ?FONT},
- {label, {text, "Key position:"}}
- ]),
-
- gs:entry(node_entry, frame1, [{width, ?NODE_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X1},
- {y, ?NODE_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {text, "'" ++ atom_to_list(Node) ++ "'"},
- {keypress, true}
- ]),
- gs:entry(name_entry, frame1, [{width, ?NAME_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X1},
- {y, ?NAME_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {text, atom_to_list(?DEFAULT_NAME)},
- {keypress, true},
- {setfocus, true},
- {select, {0,100000000}}
- ]),
- gs:entry(keypos_entry, frame2, [{width, ?KEYPOS_ENTRY_WIDTH},
- {height, ?ENTRY_HEIGHT},
- {x, ?ENTRY_X2},
- {y, ?KEYPOS_ENTRY_Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {font, ?FONT},
- {enable, true},
- {keypress, true},
- {text, integer_to_list(?DEFAULT_KEYPOS)}
- ]),
-
- gs:radiobutton(set, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y1},
- {align, w},
- {label, {text, "set"}},
- {group, type}
- ]),
- gs:radiobutton(ordered_set, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y1},
- {align, w},
- {label, {text, "ordered_set"}},
- {group, type}
- ]),
- gs:radiobutton(bag, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y1PLUS},
- {align, w},
- {label, {text, "bag"}},
- {group, type}
- ]),
- gs:radiobutton(duplicate_bag, frame2, [{width, ?RBTN_WIDTH2},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y1PLUS},
- {align, w},
- {label, {text, "duplicate_bag"}},
- {group, type}
- ]),
-
- gs:radiobutton(public, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X1},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "public"}},
- {group, protection}
- ]),
- gs:radiobutton(protected, frame2, [{width, ?RBTN_WIDTH1},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X2},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "protected"}},
- {group, protection}
- ]),
- gs:radiobutton(private, frame2, [{width, ?RBTN_WIDTH2},
- {height, ?RBTN_HEIGHT},
- {x, ?RBTN_X3},
- {y, ?RBTN_Y2},
- {align, w},
- {label, {text, "private"}},
- {group, protection}
- ]),
-
- gs:checkbutton(named_table, frame1, [{width, ?NAMED_TABLE_CBTN_WIDTH},
- {height, ?CBTN_HEIGHT},
- {x, ?NAMED_TABLE_CBTN_X},
- {y, ?NAMED_TABLE_CBTN_Y},
- {align, w},
- {label, {text, "Named table"}},
- {select, false},
- {data, true}
- ]),
-
- gs:checkbutton(open_browser, frame3, [{width, ?OPEN_BROWSER_CBTN_WIDTH},
- {height, ?CBTN_HEIGHT},
- {x, ?OPEN_BROWSER_CBTN_X},
- {y, ?OPEN_BROWSER_CBTN_Y},
- {align, w},
- {label, {text, "Open browser"}},
- {select, true},
- {data, false}
- ]),
-
-%% gs:label(frame2, [{width, ?VLINE_LBL_WIDTH},
-%% {height, ?VLINE_LBL_HEIGHT},
-%% {x, ?VLINE_LBL_X},
-%% {y, ?VLINE_LBL_Y1},
-%% {bg, {0,0,0}}
-%% ]),
-%% gs:label(frame2, [{width, ?VLINE_LBL_WIDTH},
-%% {height, ?VLINE_LBL_HEIGHT},
-%% {x, ?VLINE_LBL_X},
-%% {y, ?VLINE_LBL_Y2},
-%% {bg, {0,0,0}}
-%% ]),
-%% gs:label(frame2, [{width, ?HLINE_LBL_WIDTH},
-%% {height, ?HLINE_LBL_HEIGHT},
-%% {x, ?HLINE_LBL_X},
-%% {y, ?HLINE_LBL_Y},
-%% {bg, {0,0,0}}
-%% ]),
-%%
- gs:button(ok, frame3, [{width, ?BTN_WIDTH},
- {height, ?BTN_HEIGHT},
- {x, ?BTN_X1},
- {y, ?BTN_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {label, {text, "OK"}}
- ]),
- gs:button(cancel, frame3, [{width, ?BTN_WIDTH},
- {height, ?BTN_HEIGHT},
- {x, ?BTN_X2},
- {y, ?BTN_Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {label, {text, "Cancel"}}
- ]),
-
- gs:config(?DEFAULT_TYPE, [{select, true}]),
- gs:config(?DEFAULT_PROT, [{select, true}]),
-
- gs:config(win, [{map, true}]).
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_nodewin.erl b/lib/tv/src/tv_nodewin.erl
deleted file mode 100644
index 8376c4a7aa..0000000000
--- a/lib/tv/src/tv_nodewin.erl
+++ /dev/null
@@ -1,412 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_nodewin).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,listbox,3}},
- {nowarn_deprecated_function,{gs,menu,3}},
- {nowarn_deprecated_function,{gs,menubar,3}},
- {nowarn_deprecated_function,{gs,menubutton,3}},
- {nowarn_deprecated_function,{gs,menuitem,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/2, init/3]).
-
-
--include("tv_int_msg.hrl").
-
-
-
--define(WINDOW_WIDTH, 230).
--define(WINDOW_HEIGHT, 260).
--define(DEFAULT_BG_COLOR, {217,217,217}).
--define(POLL_INTERVAL, 5000).
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-start(CurrNode, ErrMsgMode) ->
- spawn_link(?MODULE, init, [self(), CurrNode, ErrMsgMode]).
-
-
-
-
-
-init(Pid, CurrNode, ErrMsgMode) ->
- process_flag(trap_exit, true),
- net_kernel:monitor_nodes(true),
- put(error_msg_mode, ErrMsgMode),
- gs:start(),
- NewCurrNode = update_node_listbox(CurrNode, false),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), false).
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-init_window(CurrNode, Pid) ->
- create_window(),
- NewCurrNode = update_node_listbox(CurrNode, true),
- tell_master(NewCurrNode, CurrNode, Pid),
- gs:config(win, [{map,true}]),
- NewCurrNode.
-
-
-
-
-handle_error(nodedown) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification", ["The selected node is down!"]);
- haiku ->
- Msg = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin);
-handle_error(distributed) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification",
- ["The system has become distributed!"]);
- haiku ->
- Msg = [],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin);
-handle_error(undistributed) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification",
- ["The system is no longer distributed!"]);
- haiku ->
- Msg = ["The system you see",
- "Is not a distributed",
- "system anymore."],
- tv_utils:notify(errorwin, "TV Notification", Msg)
- end,
- gs:destroy(errorwin).
-
-get_node_lists(CurrNode) ->
- NodeDataList = lists:sort([node() | nodes()]),
- NodeTextList = lists:map(fun(Item) ->
- " " ++ atom_to_list(Item)
- end,
- NodeDataList),
-
- %% It *may* be possible that CurrNode has disappeared!
- %% If this is the case, use the node where TV resides
- %% as new current node.
- %% This also covers the case when our own node (or some
- %% other node) suddenly goes distributed.
-
- NewCurrNode = case lists:member(CurrNode, NodeDataList) of
- true ->
- CurrNode;
- false ->
- node()
- end,
-
- %% Now get the index that shall be marked in the node listbox.
- %% Remember that the first item has number 0 (zero)!
- NodeMarkIndex = get_node_mark_index(NewCurrNode, NodeDataList, 0),
-
- {NewCurrNode, NodeDataList, NodeTextList, NodeMarkIndex}.
-
-
-
-
-%% We know that CurrNode is *somewhere* in the list, since we have checked.
-%% If the original CurrNode wasn't there, then we are using node() instead,
-%% which definitely is in the list. (node() may have gone distributed in the
-%% meantime, but it *IS* in the list!) :-)
-
-get_node_mark_index(CurrNode, [H | T], Acc) when CurrNode =/= H ->
- get_node_mark_index(CurrNode, T, Acc + 1);
-get_node_mark_index(CurrNode, [CurrNode | _], Acc) ->
- Acc. %% Acc tells the index of the current head. :-)
-
-
-
-
-
-check_selected_node('nonode@nohost', _OldNode, _WinCreated) when node() =:= 'nonode@nohost' ->
- %% Not distributed, OK!
- 'nonode@nohost';
-check_selected_node(_Node, _OldNode, WinCreated) when node() =:= 'nonode@nohost' ->
- %% No longer distributed, but previously was!
- handle_error(undistributed),
- update_node_listbox('nonode@nohost', WinCreated);
-check_selected_node(Node, _OldNode, _WinCreated) when Node =:= node() ->
- %% We are distributed, but on
- %% our own node! Since we
- % still are running, the node
- %% is up.
- Node;
-check_selected_node(Node, 'nonode@nohost', WinCreated) ->
- %% The system has been distributed!
- net_kernel:monitor_nodes(true),
- handle_error(distributed),
- update_node_listbox(Node, WinCreated);
-check_selected_node(Node, _OldNode, WinCreated) ->
- %% We are distributed, and a new node has been chosen!
- %% We better check this node!
- case net_adm:ping(Node) of
- pong ->
- Node;
- _Other ->
- handle_error(nodedown),
- update_node_listbox(Node, WinCreated)
- end.
-
-
-
-available_nodes() ->
- lists:sort([node() | nodes()]).
-
-
-
-loop(Pid, CurrNode, HomeNode, WinCreated) ->
- receive
-
- {nodedown, _Node} ->
- flush_nodedown_messages(),
- flush_nodeup_messages(),
- case lists:member(CurrNode, available_nodes()) of
- true ->
- done;
- false when node() =:= 'nonode@nohost', CurrNode =/= 'nonode@nohost' ->
- handle_error(undistributed);
- false ->
- handle_error(nodedown)
- end,
- NewCurrNode = update_node_listbox(CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {nodeup, _Node} ->
- flush_nodeup_messages(),
- flush_nodedown_messages(),
- case lists:member(CurrNode, available_nodes()) of
- true ->
- done;
- false when node() =:= 'nonode@nohost', CurrNode =/= 'nonode@nohost' ->
- handle_error(undistributed);
- false when CurrNode =:= 'nonode@nohost' ->
- net_kernel:monitor_nodes(true),
- handle_error(distributed);
- false ->
- handle_error(nodedown)
- end,
- NewCurrNode = update_node_listbox(CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {gs, node_listbox, click, Data, [Idx, _Txt | _]} ->
- NewCurrNode = check_selected_node(lists:nth(Idx + 1, Data), CurrNode, WinCreated),
- tell_master(NewCurrNode, CurrNode, Pid),
- loop(Pid, NewCurrNode, node(), WinCreated);
-
-
- {gs, win, configure, _, _} ->
- gs:config(win, [{width, ?WINDOW_WIDTH}, {height, ?WINDOW_HEIGHT}]),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- show_window when WinCreated->
- gs:config(win, [raise]),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
- show_window when not WinCreated ->
- init_window(CurrNode, Pid),
- loop(Pid, CurrNode, HomeNode, true);
-
- {gs, _Id, click, close_menu, _Args} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, [c, _, 0, 1 | _]} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, ['C', _, 1, 1 | _]} ->
- gs:destroy(win),
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {gs, _Id, keypress, _Data, _Args} ->
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- {gs, _, destroy, _, _} ->
- loop(Pid, CurrNode, HomeNode, false);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
- {'EXIT', Pid, _Reason} ->
- net_kernel:monitor_nodes(false),
- exit(normal);
-
-
- {'EXIT', _OtherPid, _Reason} ->
- loop(Pid, CurrNode, HomeNode, WinCreated);
-
-
- _Other ->
- io:format("Node window received message ~p ~n", [_Other]),
- loop(Pid, CurrNode, HomeNode, WinCreated)
-
- after
- 1000 ->
- NewHomeNode = case node() of
- HomeNode ->
- HomeNode;
- Other ->
- self() ! {nodeup, Other}
- end,
- loop(Pid, CurrNode, NewHomeNode, WinCreated)
- end.
-
-
-
-
-tell_master(NewNode, NewNode, _Pid) ->
- done;
-tell_master(NewNode, _OldNode, Pid) ->
- Pid ! {tv_new_node, self(), NewNode}.
-
-
-
-
-flush_nodedown_messages() ->
- receive
- {nodedown,_Node} ->
- flush_nodedown_messages()
- after
- 0 ->
- done
- end.
-
-
-
-
-flush_nodeup_messages() ->
- receive
- {nodeup,_Node} ->
- flush_nodeup_messages()
- after
- 0 ->
- done
- end.
-
-
-
-
-update_node_listbox(Node, WinCreated) ->
- {NewNode, NodeDataList, NodeTextList, MarkIndex} = get_node_lists(Node),
- case WinCreated of
- false ->
- done;
- true ->
- catch gs:config(node_listbox, [{data, NodeDataList},
- {items, NodeTextList},
- {selection, MarkIndex}
- ])
- end,
- NewNode.
-
-
-
-
-
-create_window() ->
- gs:window(win, gs:start(), [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Connected nodes"},
- {configure, true},
- {destroy, true},
- {cursor, arrow},
- {keypress, true}
- ]),
- gs:menubar(menubar, win, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- gs:menubutton(mbutt, menubar, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- {label, {text, " File "}},
- {underline, 1}
- ]),
-
- % Create the actual menu!
- gs:menu(menu, mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}]),
- gs:menuitem(menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, " Close Ctrl-C "}},
- {data, close_menu},
- {underline, 1}
- ]),
-
- Xpos = 4,
- Ypos = 40,
- gs:listbox(node_listbox, win, [{x, Xpos},
- {y, Ypos},
- {width, ?WINDOW_WIDTH - 2 * Xpos},
- {height, ?WINDOW_HEIGHT - Ypos - Xpos},
- {bg, {255,255,255}},
- {vscroll, right},
- {hscroll, true},
- {click, true}
- ]).
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pb.erl b/lib/tv/src/tv_pb.erl
deleted file mode 100644
index 81e7e7e2d1..0000000000
--- a/lib/tv/src/tv_pb.erl
+++ /dev/null
@@ -1,663 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pb).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,frame,2}}]).
-
-
-
--export([pb/1]).
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_msg.hrl").
--include("tv_pb_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pb.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the grid buttons on the display.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pb(ParentPid) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{parent_pid = ParentPid},
- loop(ProcVars).
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters:
-%%======================================================================
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #pb_update_vbtns{} ->
- NewProcVars = update_vbtns(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_key_info{} ->
- NewProcVars = update_keys(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_update_hbtns{} ->
- NewProcVars = update_hbtns(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_set_sort_col{} ->
- NewProcVars = set_sort_col(Msg, ProcVars),
- loop(NewProcVars);
-
- #pb_remove_marks{} ->
- NewProcVars = remove_marks(ProcVars),
- loop(NewProcVars);
-
- #pb_init_btns{} ->
- NewProcVars = init_btns(Msg, ProcVars),
- loop(NewProcVars);
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- loop(NewProcVars);
-
-
- {'EXIT', Pid, Reason} ->
- ParentPid = ProcVars#process_variables.parent_pid,
- exit_signals({Pid, Reason}, ParentPid, ProcVars),
- loop(ProcVars);
-
- _Other ->
- loop(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(ExitInfo, ParentPid, _ProcVars) ->
- case ExitInfo of
- {ParentPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {Id, click, {hbtn, RealCol, VirtualCol}, _Args} ->
- handle_col_marking(Id, RealCol, VirtualCol, ProcVars);
-
- {Id, buttonpress, {resbtn, RealCol, VirtualCol, Xpos}, [1 | _Tail]} ->
- handle_col_resizing(Id, RealCol, VirtualCol, Xpos, ProcVars),
- ProcVars;
-
- {_Id, click, {vbtn, RealRow, VirtualRow}, _Args} ->
- handle_row_marking(RealRow, VirtualRow, ProcVars);
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-remove_marks(ProcVars) ->
- #process_variables{col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = BtnId,
- virtual_col_marked = VirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- case BtnId of
- undefined ->
- done;
- _AnyId ->
- case VirtualCol of
- SortCol ->
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]);
- _Other ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ])
- end
- end,
-
- NewRowMarkP = RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined
- },
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP,
- row_mark_params = NewRowMarkP
- }.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_col_marking(BtnId, RealCol, VirtualCol, ProcVars) ->
- #process_variables{parent_pid = PdPid,
- col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = OldBtnId,
- virtual_col_marked = OldVirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {ColMarked, NewColMarkP} = mark_col_btn(BtnId, OldBtnId, VirtualCol,
- OldVirtualCol, RealCol, SortCol,
- ColMarkP),
-
- PdPid ! #pb_col_marked{sender = self(),
- col_marked = ColMarked,
- real_col = RealCol,
- virtual_col = VirtualCol
- },
-
- NewRowMarkP = RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP,
- row_mark_params = NewRowMarkP
- }.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_row_marking(RealRow, VirtualRow, ProcVars) ->
- #process_variables{parent_pid = PdPid,
- col_mark_params = ColMarkP,
- row_mark_params = RowMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = OldBtnId,
- virtual_col_marked = OldVirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {_ColMarked, NewColMarkP} = mark_col_btn(OldBtnId, OldBtnId, OldVirtualCol,
- OldVirtualCol, undefined, SortCol,
- ColMarkP),
-
- #row_mark_params{virtual_row_marked = OldVirtualRow} = RowMarkP,
-
- % Check if row shall be marked or unmarked!
- {RowMarked, NewRowMarkP} = check_marked_row(VirtualRow, OldVirtualRow, RealRow,
- RowMarkP),
-
- PdPid ! #pb_row_marked{sender = self(),
- row_marked = RowMarked,
- real_row = RealRow,
- virtual_row = VirtualRow
- },
-
- ProcVars#process_variables{row_mark_params = NewRowMarkP,
- col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-%% Three cases: no button previously clicked, or same button clicked,
-%% or some other button clicked.
-
-check_marked_row(NewVirtRow, undefined, RealRow, RowMarkP) ->
- % No btn already pressed!
- {true, RowMarkP#row_mark_params{virtual_row_marked = NewVirtRow,
- real_row_marked = RealRow}};
-check_marked_row(NewVirtRow, OldVirtRow, _RealRow, RowMarkP) when NewVirtRow =:= OldVirtRow ->
- % The button previously pressed has been pressed again!
- {false, RowMarkP#row_mark_params{virtual_row_marked = undefined,
- real_row_marked = undefined}};
-check_marked_row(NewVirtRow, _OldVirtRow, RealRow, RowMarkP) ->
- % A new btn has been pressed!
- {true, RowMarkP#row_mark_params{virtual_row_marked = NewVirtRow,
- real_row_marked = RealRow}}.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sort_col(Msg, ProcVars) ->
- #pb_set_sort_col{virtual_col = SortCol} = Msg,
- tv_pb_funcs:set_new_sort_col(SortCol, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-%% Three cases: no button previously clicked, or same button clicked,
-%% or some other button clicked.
-
-mark_col_btn(NewId, undefined, NewVirtCol, _OldVirtCol, _RealCol, _SortCol, ColMarkP) ->
- % No btn already pressed!
- gs:config(NewId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ]),
- {true, ColMarkP#col_mark_params{col_btn_id = NewId,
- virtual_col_marked = NewVirtCol}};
-mark_col_btn(NewId, _OldId, NewVirtCol, OldVirtCol, _RealCol, SortCol, ColMarkP) when NewVirtCol =:= OldVirtCol, NewVirtCol =:= SortCol ->
- % The button previously pressed has been pressed again!
- gs:config(NewId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {false, ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined}};
-mark_col_btn(NewId, _OldId, NewVirtCol, OldVirtCol, _RealCol, _SortCol, ColMarkP) when NewVirtCol =:= OldVirtCol ->
- % The button previously pressed has been pressed again!
- gs:config(NewId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {false, ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined}};
-mark_col_btn(NewId, OldId, NewVirtCol, _OldVirtCol, _RealCol, _SortCol, ColMarkP) ->
- % A new btn has been pressed!
- gs:config(OldId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- gs:config(NewId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ]),
- {true, ColMarkP#col_mark_params{col_btn_id = NewId,
- virtual_col_marked = NewVirtCol}}.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_col_resizing(RbtnId, RealCol, VirtualCol, Xpos, ProcVars) ->
- gs:config(RbtnId, [{motion, true}]),
- #process_variables{parent_pid = ParentPid,
- grid_frame_id = GrFrId,
- grid_frame_height = Height,
- hbtn_height = HbtnH,
- resbtn_width = RbtnW,
- cols_shown = ColsShown} = ProcVars,
-
- LineId = gs:frame(GrFrId, [{width, 1},
- {height, Height - HbtnH},
- {x, Xpos},
- {y, HbtnH - 1},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
- MinColWidth = RbtnW,
-
- OldColWidth = lists:nth(RealCol, ColsShown),
- Xdiff = get_xdiff(RbtnId, 1, 0, LineId, Xpos, MinColWidth - OldColWidth),
-
- ParentPid ! #pb_new_colwidth{sender = self(),
- real_col = RealCol,
- virtual_col = VirtualCol,
- xdiff = Xdiff},
-
- gs:config(RbtnId, [{motion, false}]),
- gs:destroy(LineId).
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff) ->
- receive
- {gs, Id, motion, {resbtn, _RealCol, _VirtCol, _OldXpos}, [NewXdiff | _T]} ->
- UsedXdiff = erlang:max(MinAllowedXdiff, NewXdiff),
- gs:config(LineId, [{x, LineXpos + UsedXdiff}]),
- get_xdiff(Id, Btn, UsedXdiff, LineId, LineXpos, MinAllowedXdiff);
- {gs, Id, buttonrelease, _Data, [Btn | _T]} ->
- LastXdiff;
- {gs, Id, buttonrelease, _Data, _Args} ->
- get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff);
- {gs, Id, buttonpress, _Data, _Args} ->
- get_xdiff(Id, Btn, LastXdiff, LineId, LineXpos, MinAllowedXdiff)
- end.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_btns(Msg, ProcVars) ->
- #pb_init_btns{parent_id = ParentId,
- parent_width = Width,
- parent_height = Height,
- ypos = Ypos,
- hbtn_height = HbtnH,
- resbtn_width = RbtnW,
- vbtn_width = VbtnW,
- nof_rows = NofRows,
- row_height = RowHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown} = Msg,
-
- NewProcVars = tv_pb_funcs:init_btns(ParentId, Ypos, HbtnH, VbtnW, RbtnW,
- FirstColShown, ColsShown, NofRows,
- RowHeight, ProcVars),
-
- gs:frame(ParentId, [{bg, {0, 0, 0}},
- {bw, 0},
- {width, 1300},
- {height, 1},
- {x, 0},
- {y, Ypos - 1}
- ]),
- NewProcVars#process_variables{grid_frame_width = Width,
- grid_frame_height = Height
- }.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(Msg, ProcVars) ->
- #pb_update_hbtns{parent_width = Width,
- parent_height = Height,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown} = Msg,
-
- NewProcVars = tv_pb_funcs:update_hbtns(FirstColShown, ColsShown, ProcVars),
-
- NewProcVars#process_variables{grid_frame_width = Width,
- grid_frame_height = Height
- }.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(Msg, ProcVars) ->
- #pb_update_vbtns{color_list = Colors,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = BlinkEnabled} = Msg,
-
- tv_pb_funcs:update_vbtns(NofRowsShown, FirstRowShown, Colors, BlinkEnabled,
- ProcVars).
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys(Msg, ProcVars) ->
- #pb_key_info{list_of_keys = KeyList} = Msg,
- tv_pb_funcs:update_keys(KeyList, ProcVars).
diff --git a/lib/tv/src/tv_pb_funcs.erl b/lib/tv/src/tv_pb_funcs.erl
deleted file mode 100644
index 24d1120597..0000000000
--- a/lib/tv/src/tv_pb_funcs.erl
+++ /dev/null
@@ -1,1056 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pb_funcs).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,canvas,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
--export([init_btns/10,
- update_hbtns/3,
- update_vbtns/5,
- update_keys/2,
- set_new_sort_col/2]).
-
-
--include("tv_int_def.hrl").
--include("tv_pb_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-
-init_btns(ParentId, Ypos, HbtnH,
- VbtnW, ResbtnW, FirstColShown, ColsShown, NofRows, RowH, ProcVars) ->
-
- #process_variables{key_numbers = KeyNos,
- key_ids = KeyIds} = ProcVars,
-
-% C = gs:canvas(ParentId, [{width, VbtnW - 1},
-% {height, HbtnH},
-% {x, 0},
-% {y, HbtnH + 1},
-% {bg, white}
-% ]),
-% gs:create(image, C, [{load_gif, "erlang.gif"}]),
-
- {HbtnsShown, ResBtnsShown} = update_hbtns(ColsShown, [], [],
- FirstColShown, ParentId, Ypos,
- HbtnH, ResbtnW, VbtnW),
-
- NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1, HbtnsShown,
- ParentId, []),
-
- VbtnsShown = create_vbtns(ParentId, Ypos, NofRows, RowH, VbtnW, HbtnH),
- ProcVars#process_variables{grid_frame_id = ParentId,
- ypos = Ypos,
- hbtn_height = HbtnH,
- vbtn_width = VbtnW,
- resbtn_width = ResbtnW,
- first_col_shown = FirstColShown,
- hbtns_shown = HbtnsShown,
- resbtns_shown = ResBtnsShown,
- vbtns_shown = VbtnsShown,
- cols_shown = ColsShown,
- key_ids = NewKeyIds
- }.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(FirstColShown, ColsShown, ProcVars) ->
- #process_variables{grid_frame_id = ParentId,
- first_col_shown = OldFirstColShown,
- cols_shown = OldColsShown,
- ypos = Ypos,
- hbtn_height = HbtnH,
- vbtn_width = VbtnW,
- resbtn_width = ResbtnW,
- hbtns_shown = HbtnsShown,
- resbtns_shown = ResbtnsShown,
- key_numbers = KeyNos,
- key_ids = KeyIds,
- col_mark_params = ColMarkP} = ProcVars,
-
- % Only if the grid has been scrolled horizontally need we move the
- % col mark!
- case FirstColShown of
- OldFirstColShown ->
- done;
- _NewValue ->
- #col_mark_params{col_btn_id = MarkedBtnId,
- virtual_col_marked = ColMarked,
- sort_btn_id = SortBtnId,
- virtual_sort_col = SortCol} = ColMarkP,
- unmark_marked_col(MarkedBtnId, ColMarked, SortCol),
- unmark_sort_col(SortBtnId, ColMarked, SortCol)
- end,
-
- {NewHbtns, NewResbtns, NewKeys} =
- case {FirstColShown, ColsShown} of
- {OldFirstColShown, OldColsShown} ->
- {HbtnsShown, ResbtnsShown, KeyIds};
- _Other ->
- {NewHbtnsShown, NewResbtnsShown} = update_hbtns(ColsShown,
- HbtnsShown,
- ResbtnsShown,
- FirstColShown,
- ParentId,
- Ypos,
- HbtnH,
- ResbtnW,
- VbtnW),
- NewKeyIds = update_keys(KeyNos, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1,
- NewHbtnsShown, ParentId, []),
- {NewHbtnsShown, NewResbtnsShown, NewKeyIds}
- end,
-
- % Now mark the marked column again!
- NewColMarkP = mark_marked_col(NewHbtns, FirstColShown, ColMarkP),
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- hbtns_shown = NewHbtns,
- resbtns_shown = NewResbtns,
- cols_shown = ColsShown,
- key_ids = NewKeys,
- col_mark_params = NewColMarkP
- }.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(NofRowsShown, FirstRowShown, Colors, BlinkEnabled, ProcVars) ->
- #process_variables{vbtns_shown = Vbtns,
- blink_color_list = BlinkList} = ProcVars,
-
- update_vbtns(1, NofRowsShown, FirstRowShown, Vbtns, Colors, BlinkEnabled, BlinkList),
- NewProcVars = update_sort_btn_mark(ProcVars),
- NewProcVars.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_new_sort_col(SortCol, ProcVars) ->
- #process_variables{hbtns_shown = HbtnsShown,
- col_mark_params = ColMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = MarkedColBtnId,
- sort_btn_id = OldSortBtnId} = ColMarkP,
-
- % Set the new color of the sort btn, and remove the mark, if it is the same
- % column!
-
- case MarkedColBtnId of
- undefined ->
- done;
- _AnyId ->
- gs:config(MarkedColBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- SortBtnId = get_btn_id(SortCol, HbtnsShown),
- case SortBtnId of
- undefined ->
- % The btn isn't visible, or no sorting shall be performed!
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]);
- _Other ->
- % Unmark the old sort btn id!
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]),
- gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = undefined,
- virtual_col_marked = undefined,
- sort_btn_id = SortBtnId,
- virtual_sort_col = SortCol
- },
- ProcVars#process_variables{col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys(KeyList, ProcVars) ->
- #process_variables{key_numbers = OldKeyList,
- key_ids = KeyIds,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- hbtns_shown = HbtnsShown,
- grid_frame_id = ParentId} = ProcVars,
-
- NewKeyIds = case KeyList of
- OldKeyList ->
- KeyIds;
- NewKeyList ->
- update_keys(NewKeyList, KeyIds, FirstColShown,
- FirstColShown + length(ColsShown) - 1,
- HbtnsShown, ParentId, [])
- end,
-
- ProcVars#process_variables{key_numbers = KeyList,
- key_ids = NewKeyIds
- }.
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_sort_col(undefined, _ColMarked, _SortCol) ->
- done;
-unmark_sort_col(SortBtnId, _ColMarked, _SortCol) ->
- gs:config(SortBtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_marked_col(HbtnsShown, _FirstColShown, ColMarkP) ->
- #col_mark_params{virtual_col_marked = VirtualCol,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {NewMarkBtnId, NewSortBtnId} =
- case VirtualCol of
- SortCol ->
- % Same btn!
- BtnId = get_btn_id(VirtualCol,
- HbtnsShown),
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ]),
- {BtnId, BtnId};
- _OtherCol ->
- MarkBtnId = get_btn_id(VirtualCol, HbtnsShown),
- case MarkBtnId of
- undefined ->
- done;
- _Else ->
- gs:config(MarkBtnId, [{bg, ?COL_MARK_COLOR},
- {fg, {255, 255, 255}}
- ])
- end,
-
- SortBtnId = get_btn_id(SortCol, HbtnsShown),
- case SortBtnId of
- undefined ->
- done;
- _OtherId ->
- gs:config(SortBtnId, [{bg, ?SORT_MARK_COLOR},
- {fg, {0, 0, 0}}
- ])
- end,
-
- {MarkBtnId, SortBtnId}
- end,
-
- ColMarkP#col_mark_params{col_btn_id = NewMarkBtnId,
- sort_btn_id = NewSortBtnId}.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_marked_col(undefined, _ColMarked, _SortCol) ->
- done;
-unmark_marked_col(BtnId, _ColMarked, _SortCol) ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_sort_btn_mark(ProcVars) ->
- #process_variables{hbtns_shown = HbtnsShown,
- col_mark_params = ColMarkP} = ProcVars,
-
- #col_mark_params{col_btn_id = MarkedColBtnId,
- virtual_col_marked = ColMarked,
- sort_btn_id = OldSortBtnId,
- virtual_sort_col = SortCol} = ColMarkP,
-
- {NewMarkedColBtnId, NewColMarked} = case ColMarked of
- SortCol ->
- {undefined, undefined};
- _Other ->
- {MarkedColBtnId, ColMarked}
- end,
-
- NewSortBtnId = set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown),
-
- NewColMarkP = ColMarkP#col_mark_params{col_btn_id = NewMarkedColBtnId,
- virtual_col_marked = NewColMarked,
- sort_btn_id = NewSortBtnId},
-
- ProcVars#process_variables{col_mark_params = NewColMarkP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_btn_id(VirtualCol, HbtnsShown) ->
- case lists:keysearch(VirtualCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- HbtnRec#hbtn.id
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sort_btn_color(undefined, SortCol, HbtnsShown) ->
- case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- BtnId = HbtnRec#hbtn.id,
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]),
- BtnId
- end;
-set_sort_btn_color(BtnId, undefined, _HbtnsShown) ->
- gs:config(BtnId, [{bg, ?DEFAULT_BG_COLOR}]);
-set_sort_btn_color(OldSortBtnId, SortCol, HbtnsShown) ->
- case gs:read(OldSortBtnId, bg) of
- SortCol ->
- % Btn is already marked!
- OldSortBtnId;
- _OtherColor ->
- % Unmark old btn, mark new btn, if visible.
- gs:config(OldSortBtnId, [{bg, ?DEFAULT_BG_COLOR}]),
- case lists:keysearch(SortCol, #hbtn.virtual_col, HbtnsShown) of
- false ->
- undefined;
- {value, HbtnRec} ->
- BtnId = HbtnRec#hbtn.id,
- gs:config(BtnId, [{bg, ?SORT_MARK_COLOR}]),
- BtnId
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_vbtns(N, NofRowsShown, _VirtualRowNo,
- _Vbtns, _Colors, _BlinkEnabled, _BlinkList) when N > NofRowsShown ->
- done;
-update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], [], _BlinkEnabled, _BlinkList) ->
- done;
-update_vbtns(_N, _NofRowsShown, _VirtualRowNo, [], _Colors, _BlinkEnabled, _BlinkList) ->
- % Right now we don't bother with dynamically creating row buttons:
- % we ought too know in advance the maximum number of rows that can
- % be visible.
- io:format("Configuration error: too few rows in grid.~n"),
- done;
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [], BlinkEnabled, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- gs:config(VbtnId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, ?BLACK},
- {label, {text, integer_to_list(VirtualRowNo)}},
- {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row
- ]),
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1,VT, [], BlinkEnabled,
- BlinkList);
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [Color | CT], true, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo),
- case lists:member(Color, BlinkList) of
- true ->
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}}, % Real + virtual row
- flash
- ]);
- false ->
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}} % Real + virtual row
- ])
- end,
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, true, BlinkList);
-update_vbtns(N, NofRowsShown,
- VirtualRowNo, [VbtnRec | VT], [Color | CT], false, BlinkList) ->
- VbtnId = VbtnRec#vbtn.id,
- {Text, TextColor} = get_vbtn_text_and_textcolor(Color, VirtualRowNo),
- gs:config(VbtnId, [{bg, Color},
- {fg, TextColor},
- {label, {text, Text}},
- {data, {vbtn, N, VirtualRowNo}} % Real row + virtual row
- ]),
- update_vbtns(N + 1, NofRowsShown, VirtualRowNo + 1, VT, CT, false, BlinkList).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_vbtn_text_and_textcolor(?BLACK, N) ->
- {integer_to_list(N), ?WHITE};
-get_vbtn_text_and_textcolor(?RED1, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED2, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED3, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED4, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?RED5, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN1, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN2, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN3, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN4, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(?GREEN5, N) ->
- {integer_to_list(N), ?BLACK};
-get_vbtn_text_and_textcolor(_AnyOtherColor, N) ->
- {integer_to_list(N), ?BLACK}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_vbtns(ParentId, Ypos, NofRows, RowHeight, VbtnW, HbtnH) ->
- create_vbtns(1, NofRows, RowHeight, ParentId, VbtnW, Ypos + HbtnH, []).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_vbtns(N, NofRows, _RowHeight, _ParId, _VbtnW, _Ypos, VAcc) when N > NofRows ->
- lists:reverse(VAcc);
-create_vbtns(N, NofRows, RowHeight, ParId, VbtnW, Ypos, VAcc) ->
- VHeight = RowHeight + 1,
- VInfo = create_one_vbtn(ParId, VHeight, VbtnW, Ypos, N),
- create_vbtns(N + 1, NofRows, RowHeight, ParId, VbtnW, Ypos + VHeight,
- [VInfo | VAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_vbtn(ParentId, Height, VbtnW, Ypos, N) ->
- Id = gs:button(ParentId, [{width, VbtnW},
- {height, Height},
- {x, 0},
- {y, Ypos},
- {font, ?BTN_FONT},
- {bg, ?DEFAULT_BG_COLOR},
- {align, center},
- {label, {text,integer_to_list(N)}},
- {data, {vbtn, N, N}} % Real row + virtual row
- ]),
- #vbtn{virtual_row = N,
- real_row = N,
- id = Id,
- height = Height,
- ypos = Ypos}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns([], _HBtnsShown,
- _ResBtns, _VirtualColNo, _FrId, _Ypos, _HbtnH, _ResBtnW, _VbtnW) ->
- {[], []};
-update_hbtns(ColsShown, HBtns,
- ResBtns, VirtualColNo, FrId, Ypos, HbtnH, ResBtnW, VbtnW) ->
- update_hbtns(1, ColsShown, HBtns, ResBtns, HbtnH, ResBtnW, VbtnW,
- VirtualColNo, FrId, 0, Ypos, [], []).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_hbtns(_N, [],
- [], [], _HbtnH, _ResBtnW, _VbtnW, _ColNo, _FrId, _Xpos, _Ypos, HAcc, RAcc) ->
- {lists:reverse(HAcc), lists:reverse(RAcc)};
-
-update_hbtns(N, [], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- % If too many buttons, i.e., if the ColsShown list
- % has become empty.
- gs:destroy(HInfo#hbtn.id),
- gs:destroy(RInfo#resbtn.id),
- update_hbtns(N, [], HT, RT, HbtnH, ResBtnW, VbtnW, ColNo, FrId,
- Xpos, Ypos, HAcc, RAcc);
-
-update_hbtns(1, [ColW | T], [], [],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) ->
- % The first button has to be bigger than the others.
- {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 2,
- HbtnH, VbtnW - 1,
- Ypos, ResBtnW, 1, ColNo),
- update_hbtns(2, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos, [HInfo | HAcc],
- [RInfo | RAcc]);
-
-update_hbtns(N, [ColW | T], [], [],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- {HInfo, RInfo} = create_one_hbtn_and_resbtn(FrId, ColW - 4,
- HbtnH, Xpos,
- Ypos, ResBtnW, N, ColNo),
- update_hbtns(N + 1, T, [], [], HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [HInfo | HAcc],
- [RInfo | RAcc]);
-
-update_hbtns(1, [ColW | T], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, _Xpos, Ypos, HAcc, RAcc) ->
- {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo,
- ColW - 2,
- VbtnW - 1,
- 1, ColNo),
- update_hbtns(2, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, VbtnW - 1 + ColW - 2 + ResBtnW, Ypos,
- [NewHInfo | HAcc], [NewRInfo | RAcc]);
-
-update_hbtns(N, [ColW | T], [HInfo | HT], [RInfo | RT],
- HbtnH, ResBtnW, VbtnW, ColNo, FrId, Xpos, Ypos, HAcc, RAcc) ->
- {NewHInfo, NewRInfo} = config_one_hbtn_and_resbtn(HInfo, RInfo,
- ColW - 4,
- Xpos, N,
- ColNo),
- update_hbtns(N + 1, T, HT, RT, HbtnH, ResBtnW, VbtnW, ColNo + 1,
- FrId, Xpos + ColW - 4 + ResBtnW, Ypos, [NewHInfo | HAcc],
- [NewRInfo | RAcc]).
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_hbtn_and_resbtn(ParId, HWidth, HHeight, HXpos, Ypos, RWidth, N, ColNo) ->
- HId = gs:button(ParId, [{width, HWidth},
- {height, HHeight},
- {x, HXpos},
- {y, Ypos},
- {font, ?BTN_FONT},
- {bg, ?DEFAULT_BG_COLOR},
- {data, {hbtn, N, ColNo}},
- {label, {text, integer_to_list(ColNo)}}
- ]),
- RId = gs:button(ParId, [{width, RWidth},
- {height, HHeight},
- {x, HXpos + HWidth},
- {y, Ypos},
- {cursor, resize},
- {buttonpress, true},
- {buttonrelease, true},
- {data, {resbtn, N, ColNo, (HXpos + HWidth + RWidth div 2)}},
- {bg, ?BLACK}
- ]),
- HInfo = #hbtn{virtual_col = ColNo,
- real_col = N,
- id = HId,
- width = HWidth,
- xpos = HXpos},
- RInfo = #resbtn{virtual_col = ColNo,
- real_col = N,
- id = RId,
- width = RWidth,
- xpos = HXpos + HWidth},
- {HInfo, RInfo}.
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_one_hbtn_and_resbtn(HInfo, RInfo, HWidth, HXpos, N, ColNo) ->
- gs:config(HInfo#hbtn.id, [{width, HWidth},
- {x, HXpos},
- {data, {hbtn, N, ColNo}},
- {label, {text, integer_to_list(ColNo)}}
- ]),
- gs:config(RInfo#resbtn.id, [{x, HXpos + HWidth},
- {data, {resbtn, N, ColNo,
- (HXpos + HWidth + RInfo#resbtn.width div 2)}}
- ]),
- NewHInfo = HInfo#hbtn{virtual_col = ColNo,
- width = HWidth,
- xpos = HXpos},
- NewRInfo = RInfo#resbtn{virtual_col = ColNo,
- xpos = HXpos + HWidth},
- {NewHInfo, NewRInfo}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_keys([], [], _FirstCol, _LastCol, _HBtns, _ParentId, KeyIdsAcc) ->
- lists:reverse(KeyIdsAcc);
-
-update_keys([], [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- gs:config(KeyId, [{x, 1200}]),
- update_keys([], IdT, FirstCol, LastCol, HBtns, ParentId,
- [KeyId | KeyIdsAcc]);
-
-update_keys([KeyNo | KT], [], FirstCol, LastCol,
- HBtns,ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol ->
- {_Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns),
- NewKeyId = create_key(ParentId, Xpos, 1),
- update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId,
- [NewKeyId | KeyIdsAcc]);
-
-update_keys([_KeyNo | KT], [], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- update_keys(KT, [], FirstCol, LastCol, HBtns, ParentId,
- KeyIdsAcc);
-
-update_keys([KeyNo | KT], [KeyId | IdT], FirstCol, LastCol,
- HBtns, ParentId, KeyIdsAcc) when KeyNo >= FirstCol, KeyNo =< LastCol ->
- {Width, Xpos} = get_keywidth_and_pos(KeyNo, FirstCol, HBtns),
- gs:config(KeyId, [{width, Width},
- {x, Xpos}
- ]),
- update_keys(KT, IdT, FirstCol, LastCol, HBtns, ParentId,
- [KeyId | KeyIdsAcc]);
-
-update_keys([_KeyNo | KT],
- [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId, KeyIdsAcc) ->
- update_keys(KT, [KeyId | IdT], FirstCol, LastCol, HBtns, ParentId,
- KeyIdsAcc).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_keywidth_and_pos(VirtualCol, FirstCol, HBtns) ->
- RealColNo = VirtualCol - FirstCol + 1,
- HBtnR = lists:nth(RealColNo, HBtns),
- #hbtn{width = Width,
- xpos = Xpos} = HBtnR,
- KeyWidth = 10,
- % Compute the x position for the key!
- KeyXpos = (Xpos + (Width div 2) - (KeyWidth div 2)),
- {KeyWidth, KeyXpos}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_key(ParentId, Xpos, Ypos) ->
- PicDir = code:priv_dir(tv),
- C = gs:canvas(ParentId, [{width, 10},
- {height, 18},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR}
- ]),
- gs:create(image, C, [{bitmap, PicDir ++ "/key.xbm"}]),
- C.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pb_int_def.hrl b/lib/tv/src/tv_pb_int_def.hrl
deleted file mode 100644
index 0fe9df193a..0000000000
--- a/lib/tv/src/tv_pb_int_def.hrl
+++ /dev/null
@@ -1,99 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-
--define(WHITE, {255,255,255}).
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
-
--define(COL_MARK_COLOR, {0, 0, 0}).
--define(SORT_MARK_COLOR, {255,215,0}).
-
--define(BLINK_COLOR1, {255,0,0}).
--define(BLINK_COLOR2, {0,255,0}).
--define(BLINK_COLOR3, {0,0,0}).
--define(BTN_FONT, {courier,12}).
-
-
-
-
--record(col_mark_params, {col_btn_id,
- virtual_col_marked,
- sort_btn_id,
- virtual_sort_col
- }).
-
-
-
--record(row_mark_params, {virtual_row_marked,
- real_row_marked
- }).
-
-
-
-
--record(process_variables, {parent_pid,
- grid_frame_id,
- grid_frame_width,
- grid_frame_height,
- ypos,
- hbtn_height,
- vbtn_width,
- resbtn_width,
- first_col_shown,
- hbtns_shown = [],
- vbtns_shown = [],
- resbtns_shown = [],
- cols_shown = [],
- key_numbers = [],
- key_ids = [],
- blink_color_list = [?BLINK_COLOR1,
- ?BLINK_COLOR2,
- ?BLINK_COLOR3],
- col_mark_params = #col_mark_params{},
- row_mark_params = #row_mark_params{}
- }).
-
-
-
--record(hbtn, {virtual_col,
- real_col,
- id,
- width,
- xpos
- }).
-
-
-
--record(resbtn, {virtual_col,
- real_col,
- id,
- width,
- xpos
- }).
-
-
-
--record(vbtn, {virtual_row,
- real_row,
- id,
- height,
- ypos
- }).
-
-
-
diff --git a/lib/tv/src/tv_pc.erl b/lib/tv/src/tv_pc.erl
deleted file mode 100644
index e0612e13eb..0000000000
--- a/lib/tv/src/tv_pc.erl
+++ /dev/null
@@ -1,795 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: pc part of the table tool, i.e., the process
-%%% controlling all other processes, and managing
-%%% the actions to take.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pc).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pc/7,
- send_data/2
- ]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function: pc.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the processes 'pd', 'pw', 'dbs' and 'etsread'.
-%% After necessary initialisations, an eternal loop is
-%% entered, where window created messages are received and
-%% handled, as well as user input.
-%%
-%% Parameters:
-%%======================================================================
-
-
-pc(Master, Node, LocalNode, TableId, KindOfTable, TableName, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- ProcVars = prepare_and_open_table(Node, LocalNode, TableId, KindOfTable, TableName,
- false, #process_variables{parent_pid=Master}),
- loop(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-prepare_and_open_table(Node, LocalNode, TabId, TabType, TabName, Raise, ProcVars) ->
- IpPid = spawn(tv_ip, ip, [self()]),
- show_progress(IpPid, 5, "Initializing graphics..."),
-
- TmpProcVars = start_procs(IpPid, ProcVars),
-
- show_progress(IpPid, 5, "Loading table..."),
- NewProcVars = ?MENU_FUNC_FILE:open_table(Node, LocalNode, TabId, TabType, TabName,
- Raise, TmpProcVars),
-
- IpPid ! #ip_quit{sender = self()},
- % Now make window visible!
- WinP = NewProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [{map, true}]),
- NewProcVars.
-
-
-
-
-
-start_procs(IpPid, ProcVars) ->
- ErrorMsgMode = get(error_msg_mode),
- PwPid = spawn_link(tv_pw, pw, [self()]),
- PdPid = spawn_link(tv_pd, pd, [self(), ErrorMsgMode]),
- DbsPid = spawn_link(tv_db, dbs, [self(), ErrorMsgMode]),
- EtsreadPid = spawn_link(tv_etsread, etsread, [self(), ErrorMsgMode]),
-
- show_progress(IpPid, 5, "Initializing graphics..."),
- NewWinP = init_pw(PwPid, ProcVars),
-
- show_progress(IpPid, 5, "Initializing graphics..."),
- init_pd(PdPid, NewWinP),
- ProcVars#process_variables{pw_pid = PwPid,
- pd_pid = PdPid,
- dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- current_node = node(), %% Will be replaced, when table opened.
- local_node = true,
- window_params = NewWinP
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-show_progress(IpPid, NofElements, Text) ->
- IpPid ! #ip_update{sender = self(),
- nof_elements_to_mark = NofElements,
- text = Text
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- % Normal messages!
- #dbs_subset{} ->
- NewProcVars1 = send_data(Msg, ProcVars),
- NewProcVars2 = check_time_to_poll_table(Msg, NewProcVars1),
- loop(NewProcVars2);
-
- #pc_poll_table{} ->
- TmpProcVars = check_node(ProcVars),
- NewProcVars = ?MENU_FUNC_FILE:poll_table(TmpProcVars),
- loop(NewProcVars);
-
- #pc_search_req{} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_search_req{sender=self()},
- loop(ProcVars);
-
- #pc_set_sorting_mode{} ->
- set_sorting_mode(Msg, ProcVars),
- loop(ProcVars);
-
-
- #pc_data_req{element = Pos, nof_elements = Length} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_subset_req{sender = self(),
- subset_pos = Pos,
- subset_length = Length
- },
- loop(ProcVars);
-
-
- #pc_marked_row{row_no=RowNo, object=Obj, color=Color} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_marked_row{sender = self(),
- row_no = RowNo
- },
- NewProcVars = ProcVars#process_variables{marked_row = RowNo,
- marked_object = Obj,
- marked_color = Color},
- loop(NewProcVars);
-
-
- #pc_menu_msg{} ->
- Fcn = Msg#pc_menu_msg.data,
- NewProcVars = ?MENU_FUNC_FILE:Fcn(ProcVars),
- loop(NewProcVars);
-
-
- #pd_updated_object{object=Obj,old_object=OldObj,old_color=Color,obj_no=ObjNo} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_updated_object{sender = self(),
- object = Obj,
- old_object = OldObj,
- old_color = Color,
- obj_no = ObjNo},
- loop(ProcVars);
-
-
- #pd_new_object{object=Obj} ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_new_object{sender = self(),
- object = Obj},
- loop(ProcVars);
-
-
- #pc_show_table_info{} ->
- NewProcVars = ?MENU_FUNC_FILE:table_info(ProcVars),
- loop(NewProcVars);
-
- #pc_win_conf{} ->
- NewProcVars = ?GRAPH_FUNC_FILE:win_conf(Msg, ProcVars),
- loop(NewProcVars);
-
- #pc_help{} ->
- NewProcVars = ?MENU_FUNC_FILE:help_button(ProcVars),
- loop(NewProcVars);
-
- #pc_dead_table{automatic_polling = AutoPoll} ->
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The table no longer exists!"]);
- haiku ->
- ErrMsg1 = ["A table that big?",
- "It might be very useful.",
- "But now it is gone."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg1)
- end,
- NewProcVars =
- case AutoPoll of
- true ->
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The automatic polling is turned off!"]);
- haiku ->
- ErrMsg2 = ["Previously on",
- "The polling is now idled.",
- "That's the way it is."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg2)
- end,
- ProcVars#process_variables{poll_interval = infinity};
- false ->
- ProcVars
- end,
- loop(NewProcVars);
-
- #pc_nodedown{automatic_polling = AutoPoll} ->
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The node is down, and the",
- "table cannot be reached."]);
- haiku ->
- ErrMsg1 = ["With searching comes loss",
- "And the presence of absence:",
- "Node is down."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg1)
- end,
- NewProcVars =
- case AutoPoll of
- true ->
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The automatic polling is turned off!"]);
- haiku ->
- ErrMsg = ["Previously on,",
- "The polling is now idled.",
- "That's the way it is."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- ProcVars#process_variables{poll_interval = infinity};
- false ->
- ProcVars
- end,
- loop(NewProcVars);
-
-
- {pc_edit_object, _Sender} ->
- NewProcVars = ?MENU_FUNC_FILE:insert_object(ProcVars),
- loop(NewProcVars);
-
-
- check_node ->
- NewProcVars = check_node(ProcVars),
- loop(NewProcVars);
-
-
- raise ->
- WinP = ProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [raise]),
- loop(ProcVars);
-
-
- {error_msg_mode, Mode} ->
- ProcVars#process_variables.dbs_pid ! {error_msg_mode, Mode},
- ProcVars#process_variables.etsread_pid ! {error_msg_mode, Mode},
- ProcVars#process_variables.pd_pid ! {error_msg_mode, Mode},
- put(error_msg_mode, Mode),
- loop(ProcVars);
-
- % Exit messages!
- {'EXIT', Sender, Reason} ->
- exit_signals({Sender, Reason}, ProcVars);
-
-
- _Other ->
- loop(ProcVars)
-
- end
- end.
-
-
-
-
-
-
-check_node(ProcVars) ->
- #process_variables{pw_pid = PwPid,
- current_node = OldCurrNode,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- table_name = TableName} = ProcVars,
-
- HomeNode = node(),
- case net_adm:ping(OldCurrNode) of
- pong ->
- ProcVars;
- pang when not LocalNode ->
- ProcVars;
- pang when LocalNode ->
- %% XXX [siri] Will this ever happen? I thought local_node
- %% indicated if current_node was the node where tv was
- %% started. If so, we are pinging ourselves here, and
- %% a pang can never happen??
- WinTitle = ?MENU_FUNC_FILE:get_window_title(TableType,HomeNode,TableId,TableName),
- PwPid ! #pw_set_window_title{sender = self(),
- win_title = WinTitle},
- ProcVars#process_variables{current_node = HomeNode}
- end.
-
-
-
-
-
-
-
-send_data(Msg, ProcVars) ->
- #process_variables{pd_pid = PdPid,
- parent_pid = ParentPid,
- table_id = Table,
- table_type = Type,
- current_node = Node} = ProcVars,
-
- ParentPid ! {tv_update_infowin, Table, Node, Type},
-
- #dbs_subset{data = DbData,
- subset_pos = ScalePos,
- db_length = DbLength,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- requested_row = ReqRowData} = Msg,
-
- Range = case ScalePos of
- 0 ->
- {0, 0};
- _Other ->
- {1, DbLength}
- end,
-
- PdPid ! #pc_data{sender = self(),
- scale_pos = ScalePos,
- scale_range = Range,
- elementlist = DbData,
- list_of_keys = ListOfKeys,
- max_elem_size = MaxElemSize,
- marked_row = ReqRowData
- },
-
- {MarkedObject, MarkedColor} =
- case ReqRowData of
- [] ->
- {undefined, undefined};
- [Data] ->
- Data
- end,
- ProcVars#process_variables{marked_object = MarkedObject,
- marked_color = MarkedColor}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_sorting_mode(Msg, ProcVars) ->
- #pc_set_sorting_mode{sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortKeyNo} = Msg,
-
- DbsPid = ProcVars#process_variables.dbs_pid,
- PdPid = ProcVars#process_variables.pd_pid,
- PwPid = ProcVars#process_variables.pw_pid,
- TableType = ProcVars#process_variables.table_type,
-
- NewSortKeyNo =
- case SortKeyNo of
- undefined ->
- if
- TableType =:= mnesia ->
- 2;
- true ->
- 1
- end;
- _Other ->
- SortKeyNo
- end,
-
- Menu =
- case Sorting of
- true ->
- case Reverse of
- true ->
- sort_falling_order;
- false ->
- sort_rising_order
- end;
- false ->
- no_sorting
- end,
-
- PwPid ! #pw_select_menu{sender = self(),
- menu = Menu},
-
- DbsPid ! #dbs_sorting_mode{sender = self(),
- sorting = Sorting,
- reverse = Reverse,
- sort_key_no = NewSortKeyNo
- },
-
- PdPid ! #pc_set_sorting_mode_cfm{sender = self(),
- sort_key_no = NewSortKeyNo
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: init_pw.
-%%
-%% Return Value: Tuple containing the Pid of the pw process, and the id of
-%% the window created by the pw process.
-%%
-%% Description: Starts the pw process, and orders it to create a window.
-%% (The size of the window may be given as option.)
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-
-init_pw(PwPid, ProcVars) ->
- #process_variables{window_params = WinP} = ProcVars,
-
- % Now deblock pw, and order it to create a window!
- PwPid ! #pw_deblock{sender = self(),
- win_title = ?APPLICATION_NAME,
- win_width = ?DEFAULT_WINDOW_WIDTH,
- win_height = ?DEFAULT_WINDOW_HEIGHT,
- min_win_width = ?DEFAULT_MIN_WINDOW_WIDTH,
- min_win_height = ?DEFAULT_MIN_WINDOW_HEIGHT
- },
-
-
- receive
- #pw_deblock_cfm{win_id = WindowId} ->
- ?MENU_FUNC_FILE:create_menus(PwPid),
-
- % Store the window id as well as the size of it.
- WinP#window_params{window_id = WindowId,
- window_width = ?DEFAULT_WINDOW_WIDTH,
- window_height = ?DEFAULT_WINDOW_HEIGHT
- }
-
-
- after 180000 -> % A timeout of 1000 ms is too short, at least the first
- % time the system is started!
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_pd(PdPid, WinP) ->
- #window_params{window_id = WindowId,
- window_width = WindowWidth,
- window_height = WindowHeight} = WinP,
-
- % Now deblock pd, and order it to create a canvas and a scale!
- PdPid ! #pd_deblock{sender = self(),
- win = WindowId,
- win_width = WindowWidth,
- win_height = WindowHeight,
- scale = true
- },
-
- receive
- #pd_deblock_cfm{} ->
- done
- after 180000 ->
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: exit_signals.
-%%
-%% Return Value: None.
-%%
-%% Description: Decides, given an error message, action to take, i.e., whether
-%% operation shall procede, any process shall be restarted, or
-%% the table tool terminated.
-%%
-%% Parameters: Exit_info: tuple containing sender of the error message, and the
-%% reason.
-%%======================================================================
-
-
-exit_signals(ExitInfo, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- pd_pid = PdPid,
- pw_pid = PwPid,
- dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- table_id = TabId,
- table_type = TabType,
- table_name = TabName,
- current_node = Node,
- local_node = LocalNode
- } = ProcVars,
-
- case ExitInfo of
- {ParentPid, Reason} ->
- exit(Reason);
-
- {PwPid, normal} ->
- exit(normal);
-
- {PwPid, error} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, EtsreadPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {PdPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PwPid, EtsreadPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {DbsPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, PwPid, EtsreadPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {EtsreadPid, _Reason} ->
- io:format("Internal error... restarting. ~n"),
- kill_procs(normal, [PdPid, PwPid, DbsPid]),
- NewProcVars = pc(ParentPid, Node, LocalNode, TabId, TabType, TabName,
- get(error_msg_mode)),
- loop(NewProcVars);
-
- {_Sender, _OtherReason} ->
- loop(ProcVars)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-kill_procs(_Status, []) ->
- done;
-kill_procs(Status, [Pid | Tail]) ->
- exit(Pid, Status),
- kill_procs(Status, Tail).
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_time_to_poll_table(Msg, ProcVars) ->
- #dbs_subset{required_time_etsread = EtsreadTime,
- required_time_dbs = DbsTime} = Msg,
-
- UserSetPollInterval = ProcVars#process_variables.poll_interval,
- WinP = ProcVars#process_variables.window_params,
- WinId = WinP#window_params.window_id,
-
- case too_short_pollinterval_chosen(UserSetPollInterval, EtsreadTime, DbsTime) of
- true ->
- EtsreadPid = ProcVars#process_variables.etsread_pid,
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = infinity},
-
- TimeRequired = trunc(max_time_required(EtsreadTime, DbsTime) / 10 + 0.5) * 10 + 20,
-
- gs:config(WinId, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(WinId, "TV Notification",
- ["The current poll interval is too short!"]),
- Str = "to " ++ lists:flatten(io_lib:write(TimeRequired)) ++ " seconds!",
- tv_utils:notify(WinId, "TV Notification", ["Setting the poll interval", Str]);
- haiku ->
- ErrMsg = ["Being way too short",
- "The interval of polling",
- "Is simply increased."],
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- clear_message_buffer(),
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = TimeRequired},
-
- ProcVars#process_variables{poll_interval = TimeRequired};
- false ->
- ProcVars
- end.
-
-
-
-
-
-
-clear_message_buffer() ->
- receive
- #dbs_subset{} ->
- clear_message_buffer()
- after 100 ->
- done
- end.
-
-
-
-
-
-max_time_required(T1, T2) when is_number(T1), is_number(T2) ->
- if
- T1 > T2 ->
- T1;
- true ->
- T2
- end;
-max_time_required(T1, _T2) when is_number(T1) ->
- T1;
-max_time_required(_T1, T2) ->
- T2.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-too_short_pollinterval_chosen(infinity, _EtsreadTime, _DbsTime) ->
- false;
-too_short_pollinterval_chosen(undefined, _EtsreadTime, _DbsTime) ->
- false;
-too_short_pollinterval_chosen(PollInt, EtsreadTime, _DbsTime) when EtsreadTime >= PollInt, is_number(EtsreadTime) ->
- true;
-too_short_pollinterval_chosen(PollInt, _EtsreadTime, DbsTime) when DbsTime >= PollInt, is_number(DbsTime) ->
- true;
-too_short_pollinterval_chosen(_PollInt, _EtsreadTime, _DbsTime) ->
- false.
diff --git a/lib/tv/src/tv_pc_graph_ctrl.erl b/lib/tv/src/tv_pc_graph_ctrl.erl
deleted file mode 100644
index 3fc3ded565..0000000000
--- a/lib/tv/src/tv_pc_graph_ctrl.erl
+++ /dev/null
@@ -1,120 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pc_graph_ctrl).
-
-
-
--export([create_menu/4, win_conf/2]).
-
-
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_menu(PwPid, MenuTitle, TitleAccPos, MenuList) ->
- PwPid ! #pw_create_menu{sender = self(),
- menutitle = MenuTitle,
- title_acc_pos = TitleAccPos,
- menulist = MenuList
- },
- receive
- #pw_create_menu_cfm{} ->
- done
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: win_conf.
-%%
-%% Return Value: None.
-%%
-%% Description: Configures all objects in the window according to new coordinates.
-%%
-%% Parameters:
-%%======================================================================
-
-
-win_conf(Msg, ProcVars) ->
- #pc_win_conf{width = NewWidth,
- height = NewHeight} = Msg,
-
- #process_variables{pd_pid = PdPid,
- window_params = WinP} = ProcVars,
-
- #window_params{window_width = OldWindowWidth,
- window_height = OldWindowHeight} = WinP,
-
-
- case {NewWidth, NewHeight} of
- {OldWindowWidth, OldWindowHeight} ->
- ProcVars;
- _Other ->
- PdPid ! #pd_win_conf{sender = self(),
- width = NewWidth,
- height = NewHeight
- },
- NewWinP = WinP#window_params{window_width = NewWidth,
- window_height = NewHeight},
-
- ProcVars#process_variables{window_params = NewWinP}
- end.
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pc_int_def.hrl b/lib/tv/src/tv_pc_int_def.hrl
deleted file mode 100644
index 22f8dcd5d8..0000000000
--- a/lib/tv/src/tv_pc_int_def.hrl
+++ /dev/null
@@ -1,62 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Include file for the pc parts of the table tool.
-%%%
-%%%*********************************************************************
-
-
--define(HEAD_FILE, pc).
--define(GRAPH_FUNC_FILE, tv_pc_graph_ctrl).
--define(MENU_FUNC_FILE, tv_pc_menu_handling).
-
-
-
--define(APPLICATION_NAME, "Table Visualizer").
--define(DEFAULT_WINDOW_WIDTH, 750).
--define(DEFAULT_WINDOW_HEIGHT, 600).
--define(DEFAULT_MIN_WINDOW_WIDTH, 300).
--define(DEFAULT_MIN_WINDOW_HEIGHT, 250).
-
-
--record(window_params, {window_id,
- window_width,
- window_height
- }).
-
-
-
--record(process_variables, {parent_pid,
- pw_pid,
- pd_pid,
- dbs_pid,
- etsread_pid,
- current_node,
- local_node,
- table_id = undefined,
- table_type = ets,
- table_name,
- table_protection,
- marked_row,
- marked_object,
- marked_color,
- lists_as_strings = true,
- poll_interval = infinity, % seconds or 'infinity'
- window_params = #window_params{}
- }).
diff --git a/lib/tv/src/tv_pc_menu_handling.erl b/lib/tv/src/tv_pc_menu_handling.erl
deleted file mode 100644
index 64a06743b7..0000000000
--- a/lib/tv/src/tv_pc_menu_handling.erl
+++ /dev/null
@@ -1,489 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pc handling the creation of menus, as well as
-%%% treating the signals these menus results in,
-%%% when chosen.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pc_menu_handling).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([create_menus/1,
- exit_button/1,
- insert_object/1,
- delete_object/1,
- search_object/1,
- open_table/7,
- set_poll_interval/1,
- poll_table/1,
- sort_rising_order/1,
- sort_falling_order/1,
- no_sorting/1,
- lists_as_strings/1,
- lists_as_lists/1,
- table_info/1,
- help_button/1,
- otp_help_button/1,
- get_window_title/4]).
-
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pc_int_def.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-%% Shortcuts currently used, in alphabetical order:
-%%
-%% c -> "Exit"
-%% d -> "Delete Object"
-%% f -> "Sort Falling Order"
-%% h -> "Help"
-%% i -> "Table Info"
-%% n -> "No Sorting"
-%% o -> "Edit Object"
-%% p -> "Poll Table"
-%% r -> "Sort Rising Order"
-%% s -> "Search Object"
-%% v -> "Set Poll Interval"
-%% x -> "Exit"
-
-
-create_menus(PwPid) ->
- %% Due to a bug (or some other reason), only one of the radiobuttons belonging
- %% to a specified group can be selected, even if different processes have created
- %% the radiobuttons! This means that, if we have started more than one tv_main
- %% process, selecting one radiobutton will affect the radiobuttons in the other
- %% tv_main process(es)!!! Since this is a highly undesirable bahaviour, we have to
- %% create unique group names (i.e., atoms).
- %% (We need to group the radiobuttons, since otherwise all created by one process
- %% belongs to the same group, which also is undesirable...)
- SelfStr = pid_to_list(self()),
- SortGroup = list_to_atom("sorting" ++ SelfStr),
- ListGroup = list_to_atom("lists" ++ SelfStr),
-
- % Order pw to create the 'File' menu.
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " File ",
- 1,
- [{" Table Info ", normal, table_info, 7, i},
- separator,
- {" Close ", normal, exit_button, 1, c}
- ]),
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " Edit ",
- 1,
- [{" Edit Object... ", normal, insert_object, 1, o},
- {" Delete Object ", normal, delete_object, 1, d}
- ]),
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " View ",
- 1,
- [{" Lists as Lists ",{radio,false,ListGroup},lists_as_lists,10,no_char},
- {" Lists as Strings ",{radio,true,ListGroup},lists_as_strings,10,no_char}
- ]),
- % Order pw to create the 'Options' menu.
- ?GRAPH_FUNC_FILE:create_menu(PwPid,
- " Options ",
- 1,
- [{" Poll Table ", normal, poll_table, 1, p},
- {" Poll Interval... ",normal,set_poll_interval,6,no_char},
- separator,
- {" Search Object ", normal, search_object, 1, s},
- separator,
- {" Sort Ascending Order ",{radio,false,SortGroup},sort_rising_order,6,no_char},
- {" Sort Descending Order ",{radio,false,SortGroup},sort_falling_order,6,no_char},
- {" No Sorting ",{radio,true,SortGroup},no_sorting,1,no_char}
- ]).
-
-
-
-
-
-exit_button(_ProcVars) ->
- exit(normal).
-
-
-
-help_button(ProcVars) ->
- WinP = ProcVars#process_variables.window_params,
- HelpFile = filename:join([code:lib_dir(tv), "doc", "html", "index.html"]),
- tool_utils:open_help(WinP#window_params.window_id, HelpFile),
- ProcVars.
-
-
-
-
-otp_help_button(ProcVars) ->
- WinP = ProcVars#process_variables.window_params,
- IndexFile = filename:join([code:root_dir(), "doc", "index.html"]),
-
- tool_utils:open_help(WinP#window_params.window_id, IndexFile),
- ProcVars.
-
-
-
-
-table_info(ProcVars) ->
- #process_variables{table_id = TableId,
- current_node = Node,
- local_node = LocalNode,
- table_type = Type,
- parent_pid = ParentPid} = ProcVars,
-
- case TableId of
- undefined ->
- done;
- _OtherValue ->
- ParentPid ! {tv_start_infowin, TableId, Node, LocalNode, Type}
- end,
- ProcVars.
-
-
-
-sort_rising_order(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, true, false),
- ProcVars.
-
-
-sort_falling_order(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, true, true),
- ProcVars.
-
-
-no_sorting(ProcVars) ->
- request_sort_settings(ProcVars#process_variables.pd_pid, false, false),
- ProcVars.
-
-
-set_poll_interval(ProcVars) ->
- #process_variables{etsread_pid = EtsreadPid,
- poll_interval = PollInterval} = ProcVars,
-
- case tv_poll_dialog:start(PollInterval) of
- cancel ->
- ProcVars;
- NewPollInterval ->
- EtsreadPid ! #etsread_set_poll_interval{sender = self(),
- interval = NewPollInterval},
- ProcVars#process_variables{poll_interval = NewPollInterval}
- end.
-
-
-
-poll_table(ProcVars) ->
- EtsreadPid = ProcVars#process_variables.etsread_pid,
- EtsreadPid ! #etsread_poll_table{sender = self()},
- ProcVars.
-
-
-search_object(ProcVars) ->
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #dbs_search_req{sender=self()},
- ProcVars.
-
-
-
-lists_as_strings(ProcVars) ->
- PdPid = ProcVars#process_variables.pd_pid,
- PdPid ! #pc_list_info{sender=self(), lists_as_strings=true},
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #pc_list_info{sender=self(), lists_as_strings=true},
- ProcVars#process_variables{lists_as_strings=true}.
-
-
-
-
-lists_as_lists(ProcVars) ->
- PdPid = ProcVars#process_variables.pd_pid,
- PdPid ! #pc_list_info{sender=self(), lists_as_strings=false},
- DbsPid = ProcVars#process_variables.dbs_pid,
- DbsPid ! #pc_list_info{sender=self(), lists_as_strings=false},
- ProcVars#process_variables{lists_as_strings=false}.
-
-
-
-
-
-
-insert_object(ProcVars) ->
- #process_variables{pd_pid = PdPid,
- current_node = Node,
- local_node = LocalNode,
- table_type = TabType,
- table_name = TabName,
- table_protection = Protection,
- window_params = WinP} = ProcVars,
-
- case Protection of
- public ->
- case TabType of
- mnesia ->
- case catch tv_mnesia_rpc:table_info(Node, LocalNode, TabName, attributes) of
- nodedown ->
- handle_error(nodedown);
- no_table ->
- handle_error(nodedown);
- mnesia_not_started ->
- handle_error(mnesia_not_started);
- {unexpected_error,Reason} ->
- handle_error({unexpected_error,Reason});
- AttrList ->
- PdPid ! #pd_rec_edit{sender = self(),
- attributes = AttrList
- }
- end;
- ets ->
- PdPid ! #pd_rec_edit{sender = self(),
- attributes = [tuple]
- }
- end;
- _OtherProtection ->
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- ErrMsg =
- case get(error_msg_mode) of
- normal ->
- ["The table is protected and",
- " cannot be edited."];
- haiku ->
- ["The table you see",
- "Is cunningly protected:",
- "You can only watch."]
- end,
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end,
- ProcVars.
-
-
-
-
-
-
-delete_object(ProcVars) ->
- #process_variables{dbs_pid = DbsPid,
- table_protection = Protection,
- marked_row = MarkedRow,
- marked_object = MarkedObject,
- marked_color = MarkedColor,
- window_params = WinP} = ProcVars,
-
- case MarkedRow of
- undefined ->
- done;
- _AnyRow ->
- case Protection of
- public ->
- DbsPid ! #dbs_delete_object{sender = self(),
- object = MarkedObject,
- color = MarkedColor,
- obj_no = MarkedRow};
- _OtherProtection ->
- WinId = WinP#window_params.window_id,
- gs:config(WinId, [beep]),
- ErrMsg =
- case get(error_msg_mode) of
- normal ->
- ["The table is protected and",
- " cannot be edited."];
- haiku ->
- ["The table you see",
- "Is cunningly protected:",
- "You can only watch."]
- end,
- tv_utils:notify(WinId, "TV Notification", ErrMsg)
- end
- end,
- ProcVars.
-
-
-
-
-
-
-open_table(CurrNode, LocalNode, TableId, TableType, TableName, Raise, ProcVars) ->
- #process_variables{dbs_pid = DbsPid,
- etsread_pid = EtsreadPid,
- pw_pid = PwPid,
- pd_pid = PdPid,
- poll_interval = PollInterval,
- window_params = WinP} = ProcVars,
-
- case Raise of
- true ->
- gs:config(WinP#window_params.window_id, [raise]);
- false ->
- done
- end,
-
- {Type, KeyPos, Protection} = init_etsread(EtsreadPid, DbsPid, CurrNode, LocalNode, TableId,
- TableType, PollInterval),
- WinTitle = get_window_title(TableType, CurrNode, TableId, TableName),
- PwPid ! #pw_set_window_title{sender = self(),
- win_title = WinTitle},
- Writable =
- case Protection of
- public ->
- true;
- _Other ->
- false
- end,
- RecordName =
- case TableType of
- mnesia ->
- tv_mnesia_rpc:table_info(CurrNode, LocalNode, TableId, record_name);
- ets ->
- undefined
- end,
- PdPid ! #pd_new_table{sender = self(),
- table_type = TableType,
- table_name = TableName,
- record_name = RecordName,
- writable = Writable},
- init_dbs(DbsPid, Type, KeyPos, EtsreadPid),
- ProcVars#process_variables{current_node = CurrNode,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- table_name = TableName,
- table_protection = Protection}.
-
-
-
-
-
-
-get_window_title(ets, Node, TableId, TableName) ->
- NameStr = lists:flatten(io_lib:write(TableName)),
- TableStr = case TableId of
- {TableName, _Pid} ->
- NameStr;
- TableName ->
- NameStr;
- _Other ->
- lists:flatten(io_lib:write(TableId)) ++ " (" ++ NameStr ++ ")"
- end,
-
- WinTitleSuffix = " Node: " ++ atom_to_list(Node),
- "ETS: " ++ TableStr ++ WinTitleSuffix;
-get_window_title(mnesia, Node, _TableId, TableName) ->
- TableNameStr = lists:flatten(io_lib:write(TableName)),
- WinTitleSuffix = " Node: " ++ atom_to_list(Node),
- "Mnesia: " ++ TableNameStr ++ WinTitleSuffix.
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-init_etsread(EtsreadPid, DbsPid, Node, LocalNode, TableId, TableType, PollInterval) ->
- EtsreadPid ! #etsread_deblock{sender = self(),
- dbs_pid = DbsPid,
- node = Node,
- local_node = LocalNode,
- table_id = TableId,
- table_type = TableType,
- poll_interval = PollInterval
- },
- receive
- #etsread_deblock_cfm{type=Type, keypos=KeyPos, protection=Protection} ->
- {Type, KeyPos, Protection}
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-init_dbs(DbsPid, Type, KeyPos, EtsreadPid) ->
- DbsPid ! #dbs_deblock{sender = self(),
- etsread_pid = EtsreadPid,
- type = Type,
- keypos = KeyPos,
- sublist_length = ?ITEMS_TO_DISPLAY
- },
- receive
- #dbs_deblock_cfm{} ->
- done
- after 10000 ->
- exit(error)
- end.
-
-
-
-
-
-
-request_sort_settings(PdPid, Sorting, Reverse) ->
- PdPid ! #pd_get_sort_settings{sender = self(),
- sorting = Sorting,
- reverse = Reverse
- }.
-
-
-
-
-
-
-handle_error(mnesia_not_started) ->
- gs:window(errorwin, gs:start(), []),
- gs:config(errorwin, [beep]),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(errorwin, "TV Notification", ["Mnesia not started!"]);
- haiku ->
- tv_utils:notify(errorwin, "TV Notification", ["Mnesia is stopped.",
- "We wish to reach all data",
- "But we never will."])
- end,
- gs:destroy(errorwin);
-handle_error(nodedown) ->
- done; %% Main process handles this!
-handle_error({unexpected_error,Cause}) ->
- gs:window(errorwin, gs:start(), []),
- io:format("Unexpected error: ~p~n", [Cause]),
- gs:config(errorwin, [beep]),
- gs:destroy(errorwin).
-
-
diff --git a/lib/tv/src/tv_pd.erl b/lib/tv/src/tv_pd.erl
deleted file mode 100644
index 6c38148fdd..0000000000
--- a/lib/tv/src/tv_pd.erl
+++ /dev/null
@@ -1,1127 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Code for pd, i.e., the data displaying part of the table
-%%% tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pd).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,destroy,1}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([pd/2]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pd.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the display part of the window,
-%% i.e., showing diagrams and handling the scale used for scrolling.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pd(Master, ErrMsgMode) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- PgPid = spawn_link(tv_pg, pg, [self()]),
- PbPid = spawn_link(tv_pb, pb, [self()]),
-
- ProcVars = #process_variables{master_pid = Master,
- pg_pid = PgPid,
- pb_pid = PbPid},
- blocked(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: blocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When started or explicitly blocked, pd enters this state,
-%% where nothing is performed until the module explicitly is
-%% deblocked.
-%%
-%% Parameters:
-%%======================================================================
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- #pd_deblock{} ->
- deblock(Msg, ProcVars);
-
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- blocked(ProcVars);
-
-
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblock.
-%%
-%% Return Value: None.
-%%
-%% Description: When deblocked, a canvas and scale shall be created according to
-%% specification received in pd_deblock message.
-%%
-%% Parameters: Rec: received pd_deblock message.
-%%======================================================================
-
-
-
-deblock(Msg, ProcVars) ->
- #pd_deblock{win = WindowId,
- win_width = WindowWidth,
- win_height = WindowHeight} = Msg,
-
- NewProcVars = ?DISP_FUNC_FILE:init_display(WindowId, WindowWidth, WindowHeight,
- ProcVars),
- receive
-
- #pg_ready{} ->
- Sender = Msg#pd_deblock.sender,
- Sender ! #pd_deblock_cfm{sender = self()},
- deblocked_loop(NewProcVars)
-
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblocked_loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters: Master: Pid to the 'pc' process.
-%% Win: Id of the window created.
-%%======================================================================
-
-
-
-deblocked_loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- deblocked_loop(NewProcVars);
-
- _Other ->
- NewProcVars = tv_messages(Msg, ProcVars),
- deblocked_loop(NewProcVars)
- end
- end.
-
-
-
-
-
-tv_messages(Msg, ProcVars) ->
- WinId = ProcVars#process_variables.window_id,
-
- case Msg of
- #pg_cell_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_cell_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pc_data{} ->
- mark_busy(WinId),
- NewProcVars = show_data(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pc_list_info{} ->
- handle_list_info(Msg, ProcVars);
-
- #pb_col_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_col_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pb_row_marked{} ->
- mark_busy(WinId),
- NewProcVars = handle_row_marked(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pb_new_colwidth{} ->
- mark_busy(WinId),
- NewProcVars = resize_column(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_get_sort_settings{sorting = Sorting, reverse = Reverse} ->
- mark_busy(WinId),
- NewProcVars =
- case send_sort_info_signal(Sorting, Reverse, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(Sorting, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_new_table{table_type=TabType,table_name=TabName,
- record_name=RecName,writable=Writable} ->
- mark_busy(WinId),
- ToolP = ProcVars#process_variables.toolbar_params,
- ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- mark_nonbusy(WinId),
- ProcVars#process_variables{table_type = TabType,
- table_name = TabName,
- record_name = RecName,
- writable = Writable};
-
- #pd_win_conf{} ->
- mark_busy(WinId),
- NewProcVars = resize_window(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
- #pd_rec_edit{} ->
- mark_busy(WinId),
- NewProcVars = open_rec_edit(Msg, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {updated_object, UpdObj} ->
- get_updated_elem2(true, UpdObj, ProcVars),
- ProcVars;
-
- {new_object, NewObj} ->
- get_updated_elem2(true, NewObj, ProcVars),
- ProcVars;
-
- {error_msg_mode, Mode} ->
- put(error_msg_mode, Mode),
- ProcVars;
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, ProcVars);
-
- _Other ->
- ProcVars
- end.
-
-
-
-
-
-
-exit_signals(ExitInfo, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- pg_pid = PgPid,
- pb_pid = PbPid,
- rec_pid = RecPid} = ProcVars,
-
- case ExitInfo of
- {MasterPid, _Reason} ->
- exit(normal);
- {PgPid, _Reason} ->
- exit(normal);
- {PbPid, _Reason} ->
- exit(normal);
- {RecPid, _Reason} ->
- ProcVars#process_variables{rec_pid = undefined};
- _Other ->
- ProcVars
- end.
-
-
-
-
-open_rec_edit(Msg, ProcVars) ->
- #pd_rec_edit{attributes = AttrList} = Msg,
-
- #process_variables{rec_pid = RecPid,
- table_type = TabType,
- table_name = TabName,
- record_name = RecordName,
- lists_as_strings = ListsAsStr,
- mark_params = MarkP} = ProcVars,
-
- #mark_params{marked_object = MarkedObject} = MarkP,
-
- TabOrRecName =
- case TabType of
- mnesia ->
- RecordName;
- ets ->
- TabName
- end,
-
- case RecPid of
- undefined ->
- NewRecPid =
- case MarkedObject of
- undefined ->
- tv_rec_edit:start(TabType, TabOrRecName, AttrList, ListsAsStr,
- get(error_msg_mode));
- _Other ->
- AttrVals =
- case TabType of
- mnesia ->
- tl(tuple_to_list(MarkedObject));
- ets ->
- [MarkedObject]
- end,
- tv_rec_edit:start(TabType, TabOrRecName, AttrList, AttrVals, ListsAsStr,
- get(error_msg_mode))
- end,
- ProcVars#process_variables{rec_pid = NewRecPid};
- _AnyPid ->
- RecPid ! raise,
- ProcVars
- end.
-
-
-
-
-
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {editentry, keypress, _Data, ['Tab' | _T]} ->
- gs:config(editentry, [{select, {0,100000000}}]),
- ProcVars;
-
- {editentry, keypress, _Data, ['Return' | _T]} ->
- get_updated_elem(ProcVars),
- ProcVars;
-
- {Id, enter, {toolbar, Btn, Str}, _} ->
- gs:config(Id, [{motion, true}]),
- NewProcVars = handle_toolbar_buttons(Id, Btn, Str, false, 0, 0,
- ProcVars),
- NewProcVars;
-
-
- {_Id, buttonpress, _Data, [3 | _Rest]} ->
- ProcVars;
-
-
- {_Id, buttonpress, vscale, [MouseBtn | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:scroll_vertically(MouseBtn, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- % The order of messages from gs ought to be
- % 1. 'buttonpress'
- % 2. 'click' and
- % 3. 'buttonrelease'
- % However, quite often the 'click' message comes last, meaning we have
- % to check for this. :-(
-
- {_Id, click, vscale, [NewScalePos | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:perform_vertical_scroll(NewScalePos,
- ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, buttonpress, hscale, [MouseBtn | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:scroll_horizontally(MouseBtn, ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, hscale, [NewScalePos | _Tail]} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = ?DISP_FUNC_FILE:perform_horizontal_scroll(NewScalePos,
- ProcVars),
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, poll_table, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_poll_table{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, select_browser, _Str}, _Arg} ->
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_select{sender = self()},
- ProcVars;
-
-
- {_Id, click, {toolbar, help_button, _Str}, _Arg} ->
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_help{sender = self()},
- ProcVars;
-
-
-
- {_Id, click, {toolbar, insert_object, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! {pc_edit_object, self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, search_object, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_search_req{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {_Id, click, {toolbar, sort_rising_order, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = case send_sort_info_signal(true, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, sort_falling_order, _Str}, _Arg} ->
- WinId = ProcVars#process_variables.window_id,
- mark_busy(WinId),
- NewProcVars = case send_sort_info_signal(true, true, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
-
- {_Id, click, {toolbar, no_sorting, _Str}, _Arg} ->
- NewProcVars = case send_sort_info_signal(false, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(false, TempNewProcVars)
- end,
- NewProcVars;
-
-
- {Id, click, {toolbar, table_info, _Str}, _Arg} ->
- ToolP = ProcVars#process_variables.toolbar_params,
- F = ToolP#toolbar_params.pop_up_frame_id,
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_show_table_info{sender = self()},
- ProcVars;
-
-
- {Id, click, {labelbtn, pop_up}, _Arg} ->
- gs:config(Id, [{data, {labelbtn, pop_down}}]),
- NewProcVars = ?DISP_FUNC_FILE:show_toolbar_editor(ProcVars),
- NewProcVars;
-
-
- {Id, click, {labelbtn, pop_down}, _Arg} ->
- gs:config(Id, [{data, {labelbtn, pop_up}}]),
- NewProcVars = ?DISP_FUNC_FILE:hide_toolbar_editor(ProcVars),
- NewProcVars;
-
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-get_updated_elem(ProcVars) ->
- EditedStr = gs:read(editentry, text),
- case tv_db_search:string_to_term(EditedStr) of
- {error, {_Reason, Msg}} ->
- gs:config(editentry, [beep]),
- gs:window(pdwin, gs:start(), []),
- tv_utils:notify(pdwin, "TV Notification", Msg),
- gs:destroy(pdwin),
- ProcVars;
- {ok, NewTerm} ->
- get_updated_elem2(false, NewTerm, ProcVars)
- end.
-
-
-
-
-
-get_updated_elem2(FromRecEdit, NewTerm, ProcVars) ->
- #process_variables{table_type = TableType,
- record_name = RecordName,
- mark_params = MarkP,
- master_pid = PcPid} = ProcVars,
-
- #mark_params{marked_object = ObjToUpdate,
- marked_color = ObjColor,
- virtual_row_no = VirtualRow,
- cell_col_no = VirtualCol} = MarkP,
-
- case ObjToUpdate of
- undefined ->
- case new_object_ok(TableType, RecordName, NewTerm) of
- true ->
- PcPid ! #pd_new_object{sender = self(),
- object = NewTerm},
- ProcVars;
- {false, Msg} ->
- gs:window(pdwin, gs:start(), []),
- tv_utils:notify(pdwin, "TV Notification", Msg),
- gs:destroy(pdwin),
- ProcVars
- end;
- _AnyObj ->
- %% We need to know if the object has been deleted!
- NewObj =
- case VirtualCol of
- undefined ->
- NewTerm;
- _AnyCol when FromRecEdit ->
- NewTerm;
- _AnyCol ->
- if
- is_tuple(ObjToUpdate) ->
- erlang:setelement(VirtualCol, ObjToUpdate, NewTerm);
- true ->
- NewTerm
- end
- end,
- %% Is the update OK?
- case update_ok(TableType, ObjToUpdate, NewObj) of
- true ->
- PcPid ! #pd_updated_object{sender = self(),
- object = NewObj,
- old_object = ObjToUpdate,
- old_color = ObjColor,
- obj_no = VirtualRow},
- ProcVars;
- false ->
- gs:window(pdwin, gs:start(), []),
- case get(error_msg_mode) of
- normal ->
- tv_utils:notify(pdwin, "TV Notification",
- ["The record name cannot be changed!"]);
- haiku ->
- tv_utils:notify(pdwin, "TV Notification",
- ["The attempt to change",
- "The permanent record name",
- "Is simply ignored."])
- end,
- gs:destroy(pdwin),
- ProcVars
- end
- end.
-
-
-
-
-new_object_ok(ets, _RecordName, NewTerm) when is_tuple(NewTerm) ->
- true;
-new_object_ok(ets, _RecordName, _NewTerm) ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Object is not a tuple!"];
- haiku ->
- ["Yes, it is a term.",
- "It is pretty, but it's not",
- "A proper tuple."]
- end,
- {false, Msg};
-new_object_ok(mnesia, RecordName, NewTerm) when is_tuple(NewTerm) ->
- NewRecName = element(1, NewTerm),
- case NewRecName of
- RecordName ->
- true;
- _OtherName ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Erroneous record name!"];
- haiku ->
- ["The attempt to use",
- "An invalid record name",
- "Is simply ignored."]
- end,
- {false, Msg}
- end;
-new_object_ok(mnesia, _RecordName, _NewTerm) ->
- Msg = case get(error_msg_mode) of
- normal ->
- ["Object is not a record!"];
- haiku ->
- ["Yes, it is a term.",
- "It is pretty, but it's not",
- "The proper record."]
- end,
- {false, Msg}.
-
-
-
-
-update_ok(ets, _ObjectToUpdate, _NewObject) ->
- true;
-update_ok(mnesia, ObjectToUpdate, NewObject) ->
- OldRecName = element(1, ObjectToUpdate),
- NewRecName = element(1, NewObject),
- case NewRecName of
- OldRecName ->
- true;
- _Other ->
- false
- end.
-
-
-
-
-handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars) ->
- WinId = ProcVars#process_variables.window_id,
- ToolP = ProcVars#process_variables.toolbar_params,
- F = ToolP#toolbar_params.pop_up_frame_id,
-
- receive
-
- {gs, Id, motion, _Data, [NewX, NewY | _]} ->
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, NewX, NewY,
- ProcVars);
-
- {gs, editentry, keypress, _Data, ['Tab' | _T]} ->
- gs:config(editentry, [{select, {0,100000000}}]),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- {gs, editentry, keypress, _Data, ['Return' | _T]} ->
- get_updated_elem(ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- {gs, Id, leave, {toolbar, Btn, Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- ProcVars;
-
- {gs, Id, click, {toolbar, poll_table, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_poll_table{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
- {gs, Id, click, {toolbar, select_browser, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_select{sender = self()},
- ProcVars;
-
- {gs, Id, click, {toolbar, help_button, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_help{sender = self()},
- ProcVars;
-
- {gs, Id, click, {toolbar, insert_object, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! {pc_edit_object, self()},
- mark_nonbusy(WinId),
- ProcVars;
-
-
- {gs, Id, click, {toolbar, search_object, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_search_req{sender = self()},
- mark_nonbusy(WinId),
- ProcVars;
-
- {gs, Id, click, {toolbar, sort_rising_order, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(true, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- {gs, Id, click, {toolbar, sort_falling_order, _Str}, _Arg} ->
- mark_busy(WinId),
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(true, true, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(true, TempNewProcVars)
- end,
- mark_nonbusy(WinId),
- NewProcVars;
-
- {gs, Id, click, {toolbar, no_sorting, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- NewProcVars =
- case send_sort_info_signal(false, false, ProcVars) of
- ignore ->
- ProcVars;
- TempNewProcVars ->
- set_sort_col(false, TempNewProcVars)
- end,
- NewProcVars;
-
- {gs, Id, click, {toolbar, table_info, _Str}, _Arg} ->
- gs:config(F, [{y, -30}]),
- gs:config(Id, [{motion, false}]),
- PcPid = ProcVars#process_variables.master_pid,
- PcPid ! #pc_show_table_info{sender = self()},
- ProcVars;
-
- {'EXIT', Pid, Reason} ->
- exit_signals({Pid, Reason}, ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, ProcVars);
-
- OtherMsg ->
- NewProcVars = tv_messages(OtherMsg, ProcVars),
- handle_toolbar_buttons(Id, Btn, Str, LabelShown, X, Y, NewProcVars)
-
- after 600 ->
- case LabelShown of
- false ->
- FrameP = ProcVars#process_variables.frame_params,
- L = ToolP#toolbar_params.pop_up_label_id,
-
- #frame_params{toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight} = FrameP,
-
- BtnHeight = gs:read(Id, height),
- BtnXpos = gs:read(Id, x),
- BtnYpos = gs:read(Id, y),
- FrameHeight = gs:read(F, height),
- FontUsed = gs:read(L, font),
- {StringWidth, _H} = gs:read(L, {font_wh, {FontUsed, Str}}),
-
- Width = StringWidth + 6,
- Xpos = BtnXpos + X,
- LblXpos = if
- Xpos + Width > TWidth ->
- Xpos - Width;
- true ->
- Xpos
- end,
- % Ypos = BtnYpos + Y + 15,
- Ypos = BtnYpos + BtnHeight + 6,
- LblYpos = if
- Ypos + FrameHeight > THeight ->
- Ypos - FrameHeight - 25;
- true ->
- Ypos
- end,
- gs:config(L, [{width, Width - 2},
- {label, {text, Str}}]),
- gs:config(F, [{width, Width},
- {x, LblXpos},
- {y, LblYpos}
- ]);
- true ->
- done
- end,
- handle_toolbar_buttons(Id, Btn, Str, true, X, Y, ProcVars)
- end.
-
-
-
-
-
-
-set_sort_col(SortingOn, ProcVars) ->
- #process_variables{pb_pid = PbPid,
- mark_params = MarkP} = ProcVars,
-
- SortCol = case SortingOn of
- true ->
- MarkP#mark_params.col_no;
- false ->
- undefined
- end,
- PbPid ! #pb_set_sort_col{sender = self(),
- virtual_col = SortCol
- },
- remove_all_marks(SortCol, ProcVars).
-
-
-
-
-
-send_sort_info_signal(Sorting, Reverse, ProcVars) ->
- #process_variables{master_pid = PcPid,
- mark_params = MarkP} = ProcVars,
-
- SortColNo = MarkP#mark_params.col_no,
-
- PcPid ! #pc_set_sorting_mode{sender = self(),
- sorting = Sorting,
- reverse = Reverse,
- sort_key_no = SortColNo
- },
- receive
- #pc_set_sorting_mode_cfm{sort_key_no = FinalSortColNo} ->
- NewMarkP = MarkP#mark_params{col_no = FinalSortColNo},
- ProcVars#process_variables{mark_params = NewMarkP};
-
- #pd_ignore{} ->
- ignore
-
- end.
-
-
-
-
-
-show_data(Msg, ProcVars) ->
- #pc_data{scale_pos = Pos,
- scale_range = Range,
- list_range = MaxValue,
- elementlist = List,
- list_of_keys = KeyList,
- max_elem_size = MaxElemSize,
- marked_row = MarkedRowData} = Msg,
-
- ?DISP_FUNC_FILE:display_data(Pos, Range, MaxValue, List, KeyList, MaxElemSize,
- MarkedRowData, ProcVars).
-
-
-
-
-
-
-handle_list_info(Msg, ProcVars) ->
- ListAsStr = Msg#pc_list_info.lists_as_strings,
- PgPid = ProcVars#process_variables.pg_pid,
- PgPid ! #pg_list_info{sender = self(),
- lists_as_strings = ListAsStr},
- ProcVars#process_variables{lists_as_strings = ListAsStr}.
-
-
-
-
-
-handle_col_marked(Msg, ProcVars) ->
- #pb_col_marked{col_marked = ColMarked,
- virtual_col = VirtualCol} = Msg,
-
- #process_variables{master_pid = MasterPid,
- pg_pid = PgPid,
- rec_pid = RecPid,
- writable = Writable,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
- SortCol = MarkP#mark_params.sort_col_no,
-
- PgPid ! #pg_remove_marks{sender = self()},
-
- case ColMarked of
- true ->
- PgPid ! #pg_col_marked{sender = self(),
- virtual_col = VirtualCol};
- false ->
- done
- end,
-
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
-
- ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- send_to_rec_edit(RecPid, insert_mode),
-
- NewMarkP =
- if
- ColMarked ->
- MarkP#mark_params{col_no = VirtualCol};
- true ->
- if
- SortCol =:= undefined ->
- MarkP;
- true ->
- MarkP#mark_params{col_no = SortCol}
- end
- end,
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-remove_all_marks(SortCol, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- pb_pid = PbPid,
- pg_pid = PgPid,
- toolbar_params = ToolP} = ProcVars,
-
- PgPid ! #pg_remove_marks{sender = self()},
- PbPid ! #pb_remove_marks{sender = self()},
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
-%% ?DISP_FUNC_FILE:update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- ?DISP_FUNC_FILE:update_toolbar_editor(ToolP#toolbar_params.editor_id, notext),
-%% send_to_rec_edit(RecPid, insert_mode),
- ProcVars#process_variables{mark_params = #mark_params{sort_col_no = SortCol,
- cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined}
- }.
-
-
-
-
-
-
-handle_row_marked(Msg, ProcVars) ->
- #pb_row_marked{row_marked = RowMarked,
- virtual_row = VirtualRow,
- real_row = RealRow} = Msg,
-
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- pg_pid = PgPid,
- data_list = DataList,
- color_list = ColorList,
- writable = Writable,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
-
- PgPid ! #pg_remove_marks{sender = self()},
-
- case RowMarked of
- true ->
- PgPid ! #pg_row_marked{sender = self(),
- virtual_row = VirtualRow};
- false ->
- done
- end,
-
- {DataElement, NewMarkP} =
- if
- RowMarked ->
- {MarkedRowOrCol, RowObj} =
- ?DISP_FUNC_FILE:get_data_element(row, DataList, RealRow, undefined),
-
- MarkedRowColor =
- case MarkedRowOrCol of
- notext ->
- undefined;
- _OtherObject ->
- lists:nth(RealRow, ColorList)
- end,
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = VirtualRow,
- object = RowObj,
- color = MarkedRowColor
- },
- send_to_rec_edit(RecPid, {update_mode,RowObj}),
- {MarkedRowOrCol, MarkP#mark_params{virtual_row_no = VirtualRow,
- row_no = RealRow,
- cell_col_no = undefined,
- col_no = undefined,
- marked_object = RowObj,
- marked_color = MarkedRowColor}};
- true ->
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- send_to_rec_edit(RecPid, insert_mode),
- {notext, MarkP#mark_params{virtual_row_no = undefined,
- row_no = undefined,
- cell_col_no = undefined,
- col_no = undefined,
- marked_object = undefined,
- marked_color = undefined}}
- end,
-
- ?DISP_FUNC_FILE:update_toolbar_label(DataElement, ToolP, VirtualRow,
- undefined, Writable),
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-handle_cell_marked(Msg, ProcVars) ->
- #pg_cell_marked{cell_marked = CellMarked,
- virtual_col = VirtualCol,
- real_row = RealRow,
- virtual_row = VirtualRow} = Msg,
-
- % We are interested in the real row number, since we only have a sublist
- % stored in pd.
- ?DISP_FUNC_FILE:marked_cell(CellMarked, VirtualCol, RealRow, VirtualRow,
- ProcVars).
-
-
-
-
-resize_window(Msg, ProcVars) ->
- #pd_win_conf{width = NewWindowWidth,
- height = NewWindowHeight} = Msg,
-
- ?DISP_FUNC_FILE:resize_display(NewWindowWidth, NewWindowHeight, ProcVars).
-
-
-
-
-resize_column(Msg, ProcVars) ->
- #pb_new_colwidth{real_col = RealCol,
- virtual_col = VirtualCol,
- xdiff = Xdiff} = Msg,
-
- ?DISP_FUNC_FILE:resize_column(RealCol, VirtualCol, Xdiff, ProcVars).
-
-
-
-
-mark_busy(Id) ->
- gs:config(Id, [{cursor, busy}]).
-
-
-
-
-mark_nonbusy(Id) ->
- gs:config(Id, [{cursor, arrow}]).
-
-
-
-
-send_to_rec_edit(undefined, _Msg) ->
- done;
-send_to_rec_edit(RecPid, Msg) ->
- RecPid ! Msg.
-
diff --git a/lib/tv/src/tv_pd_display.erl b/lib/tv/src/tv_pd_display.erl
deleted file mode 100644
index 804180da16..0000000000
--- a/lib/tv/src/tv_pd_display.erl
+++ /dev/null
@@ -1,1066 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pd controlling the graphics.
-%%%
-%%%*********************************************************************
-
--module(tv_pd_display).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,editor,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
-
--export([init_display/4,
- display_data/8,
- resize_display/3,
- resize_column/4,
- scroll_horizontally/2,
- scroll_vertically/2,
- perform_horizontal_scroll/2,
- perform_vertical_scroll/2,
- marked_cell/5,
- update_toolbar_label/5,
- update_toolbar_editor/2,
- get_data_element/4,
- hide_toolbar_editor/1,
- show_toolbar_editor/1]).
-
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pd_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function: init_display.
-%%
-%% Return Value: Id of the display (here:canvas) created.
-%%
-%% Description: Creates the canvas and the scale.
-%%
-%% Parameters: Id of the window the display shall be created in.
-%%======================================================================
-
-
-init_display(WindowId, WindowWidth, WindowHeight, ProcVars) ->
- % Get all necessary window parameters!
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP,
- scale_params = ScaleP,
- toolbar_params = ToolP} = ProcVars,
-
- NewFrameP = tv_pd_frames:create_display_frames(WindowId, WindowWidth,
- WindowHeight, FrameP),
-
- #frame_params{grid_frame_id = GridParentId,
- grid_frame_width = GridParentWidth,
- grid_frame_height = GridParentHeight} = NewFrameP,
-
- PgPid ! #pg_init_grid{sender = self(),
- parent_id = GridParentId,
- width = GridParentWidth,
- height = GridParentHeight,
- xpos = ?VBTN_WIDTH - 1,
- ypos = ?KEY_MARK_AREA_HEIGHT + ?HBTN_HEIGHT - 1,
- nof_rows = ?NOF_GRIDROWS,
- row_height = ?ROW_HEIGHT
- },
-
-
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_init_btns{sender = self(),
- parent_id = GridParentId,
- parent_width = GridParentWidth,
- parent_height = GridParentHeight,
- ypos = ?KEY_MARK_AREA_HEIGHT,
- hbtn_height = ?HBTN_HEIGHT,
- resbtn_width = ?RESBTN_WIDTH,
- vbtn_width = ?VBTN_WIDTH,
- nof_rows = ?NOF_GRIDROWS,
- row_height = ?ROW_HEIGHT,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- NewScaleP = tv_pd_scale:init_scale(NewFrameP, ScaleP),
-
- NewToolP = init_toolbar(NewFrameP, ToolP),
-
- ProcVars#process_variables{window_id = WindowId,
- window_width = WindowWidth,
- window_height = WindowHeight,
- first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- frame_params = NewFrameP,
- scale_params = NewScaleP,
- toolbar_params = NewToolP
- }
- end.
-
-
-
-
-
-resize_display(NewWinW, NewWinH, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- color_list = ColorList,
- first_row_shown = FirstRowShown,
- frame_params = FrameP,
- scale_params = ScaleP,
- toolbar_params = ToolP} = ProcVars,
-
- NewFrameP = tv_pd_frames:resize_display_frames(NewWinW, NewWinH, FrameP),
-
- #frame_params{grid_frame_width = GridParentWidth,
- grid_frame_height = GridParentHeight} = NewFrameP,
-
- PgPid ! #pg_resize_grid{sender = self(),
- width = GridParentWidth,
- height = GridParentHeight
- },
-
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{sender = self(),
- parent_width = GridParentWidth,
- parent_height = GridParentHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- PbPid ! #pb_update_vbtns{sender = self(),
- color_list = ColorList,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = false
- },
-
- NewScaleP = tv_pd_scale:resize_scale(NewFrameP, ScaleP),
-
- NewToolP = resize_toolbar(NewFrameP, ToolP),
-
- ProcVars#process_variables{window_width = NewWinW,
- window_height = NewWinH,
- first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- frame_params = NewFrameP,
- scale_params = NewScaleP,
- toolbar_params = NewToolP
- }
- end.
-
-
-
-
-
-
-
-resize_column(RealCol, VirtualCol, Xdiff, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP} = ProcVars,
-
- PgPid ! #pg_resize_grid_col{sender = self(),
- real_col_no = RealCol,
- virtual_col_no = VirtualCol,
- xdiff = Xdiff
- },
-
- #frame_params{grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{parent_width = GridFrameWidth,
- parent_height = GridFrameHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown
- }
- end.
-
-
-
-
-
-
-
-
-display_data(Pos, Range, _MaxValue, List, KeyList, MaxElemSize, MarkedRowData,ProcVars) ->
- #process_variables{master_pid = PcPid,
- rec_pid = RecPid,
- pg_pid = PgPid,
- pb_pid = PbPid,
- writable = Writable,
- sorting_on = SortingOn,
- nof_rows_shown = NofRowsShown,
- scale_params = ScaleP,
- toolbar_params = ToolP,
- mark_params = MarkP} = ProcVars,
-
- {DataList, ColorList} = split_dblist(List, [], []),
-
- NewMarkP = update_marks(SortingOn, DataList, ColorList, MarkedRowData, Pos, NofRowsShown,
- Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP),
-
- PgPid ! #pg_data{sender = self(),
- data = DataList,
- first_row_shown = Pos
- },
-
- PbPid ! #pb_update_vbtns{sender = self(),
- color_list = ColorList,
- first_row_shown = Pos,
- nof_rows_shown = NofRowsShown,
- blinking_enabled = false
- },
-
- PbPid ! #pb_key_info{sender = self(),
- list_of_keys = KeyList
- },
-
- % May be new number of elements in the total list!
- ?SCALE_FUNC_FILE:set_scale_range(vscale, Range, ScaleP),
- % May be new vertical scale position required!
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(vscale, Pos, ScaleP),
- % May be new maximum size of elements!
- ?SCALE_FUNC_FILE:set_scale_range(hscale, {1, MaxElemSize}, NewScaleP),
-
- ProcVars#process_variables{data_list = DataList,
- color_list = ColorList,
- first_row_shown = Pos,
- initialising = false,
- scale_params = NewScaleP,
- mark_params = NewMarkP
- }.
-
-
-
-
-
-
-
-scroll_vertically(MouseBtn, ProcVars) ->
- #process_variables{scale_params = ScaleP} = ProcVars,
-
- OldScalePos = ScaleP#scale_params.vscale_pos,
- NewScalePos = get_new_scalepos(MouseBtn, OldScalePos),
-
- case NewScalePos of
- OldScalePos ->
- ProcVars;
- NewValue ->
- perform_vertical_scroll(NewValue, ProcVars)
- end.
-
-
-
-
-
-
-
-scroll_horizontally(MouseBtn, ProcVars) ->
- #process_variables{scale_params = ScaleP} = ProcVars,
-
- OldScalePos = ScaleP#scale_params.hscale_pos,
- NewScalePos = get_new_scalepos(MouseBtn, OldScalePos),
-
- case NewScalePos of
- OldScalePos ->
- ProcVars;
- NewValue ->
- perform_horizontal_scroll(NewValue, ProcVars)
- end.
-
-
-
-
-
-
-
-
-perform_vertical_scroll(NewScalePos, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- initialising = Init,
- scale_params = ScaleP} = ProcVars,
-
- %% To avoid erroneous scrollbar signals during creation of the display.
- case Init of
- true ->
- done;
- false ->
- MasterPid ! #pc_data_req{sender = self(),
- element = NewScalePos,
- nof_elements = ?NOF_GRIDROWS}
- end,
-
- % Since the order of click/buttonrelease messages isn't
- % precise, set the scale to the returned pos (may otherwise
- % differ one unit).
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(vscale,
- NewScalePos,
- ScaleP),
-
- ProcVars#process_variables{scale_params = NewScaleP}.
-
-
-
-
-
-
-
-perform_horizontal_scroll(NewScalePos, ProcVars) ->
- #process_variables{pg_pid = PgPid,
- pb_pid = PbPid,
- frame_params = FrameP,
- scale_params = ScaleP} = ProcVars,
-
- % Since the order of click/buttonrelease messages isn't
- % precise, set the scale to the returned pos (may otherwise
- % differ one unit).
- NewScaleP = ?SCALE_FUNC_FILE:set_scale_pos(hscale,
- NewScalePos,
- ScaleP),
-
- PgPid ! #pg_horizontal_scroll{sender = self(),
- leftmost_virtual_col = NewScalePos
- },
-
- #frame_params{grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
- receive
- #pg_col_info{first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown} ->
-
- PbPid ! #pb_update_hbtns{parent_width = GridFrameWidth,
- parent_height = GridFrameHeight,
- first_col_shown = FirstColShown,
- cols_shown = ColsShown
- },
-
- ProcVars#process_variables{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown,
- scale_params = NewScaleP
- }
- end.
-
-
-
-
-
-
-
-
-marked_cell(true, VirtualCol, RealRow, VirtualRow, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- data_list = DataList,
- color_list = ColorList,
- writable = Writable,
- mark_params = MarkP,
- toolbar_params = ToolP} = ProcVars,
-
- {DataElement, MarkedRowObject} = get_data_element(cell, DataList, RealRow, VirtualCol),
- update_toolbar_label(DataElement, ToolP, VirtualRow, VirtualCol, Writable),
- send_to_rec_edit(RecPid, {update_mode,MarkedRowObject}),
-
- MarkedRowColor = lists:nth(RealRow, ColorList),
-
- MasterPid ! #pc_marked_row{sender = self(),
- row_no = VirtualRow,
- object = MarkedRowObject,
- color = MarkedRowColor
- },
- NewMarkP = MarkP#mark_params{cell_col_no = VirtualCol,
- row_no = RealRow,
- virtual_row_no = VirtualRow,
- marked_object = MarkedRowObject,
- marked_color = MarkedRowColor
- },
- ProcVars#process_variables{mark_params = NewMarkP
- };
-marked_cell(false, VirtualCol, _RealRow, VirtualRow, ProcVars) ->
- #process_variables{master_pid = MasterPid,
- rec_pid = RecPid,
- pb_pid = PbPid,
- writable = Writable,
- mark_params = MarkP} = ProcVars,
-
- PbPid ! #pb_remove_marks{sender = self()},
-
- case VirtualRow of
- undefined ->
- done;
- _AnyRow ->
- update_toolbar_label(notext, ProcVars#process_variables.toolbar_params,
- VirtualRow, VirtualCol, Writable),
- send_to_rec_edit(RecPid, insert_mode)
- end,
- MasterPid ! #pc_marked_row{sender = self(),
- %% row_no = VirtualRow
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- NewMarkP = MarkP#mark_params{cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined
- },
- ProcVars#process_variables{mark_params = NewMarkP
- }.
-
-
-
-
-
-
-
-
-update_toolbar_label(notext, ToolP, _VirtualRowNo, _VirtualColNo, Writable) ->
- #toolbar_params{row_col_label_id = RowColLblId,
- fg_label_id = FgLblId,
- editor_id = EdId} = ToolP,
- gs:config(RowColLblId, [{label, {text,""}}]),
- gs:config(FgLblId, [{enable,true}]),
- gs:config(FgLblId, [{delete, {0,1000000000}}]),
- gs:config(FgLblId, [{insert, {0, ""}}]),
- case Writable of
- true ->
- gs:config(FgLblId, [{cursor, text},
- {setfocus, true}]);
- false ->
- gs:config(FgLblId, [{enable, false},
- {cursor, arrow},
- {setfocus, false}])
- end,
- update_toolbar_editor(EdId, notext);
-update_toolbar_label({DataToShow}, ToolP, VirtualRowNo, VirtualColNo, Writable) ->
- #toolbar_params{row_col_label_id = RowColLblId,
- fg_label_id = FgLblId,
- editor_id = EdId} = ToolP,
-
- case VirtualRowNo of
- undefined ->
- %% No row - nothing can possibly be marked!
- case Writable of
- true ->
- gs:config(FgLblId, [{setfocus,true},
- {cursor, text}]);
- false ->
- gs:config(FgLblId, [{enable,false},
- {setfocus, false},
- {cursor, arrow}])
- end;
- _AnyRow ->
- RowStr = "R" ++ integer_to_list(VirtualRowNo),
- ColStr = case VirtualColNo of
- undefined ->
- "";
- _AnyCol ->
- " x C" ++ integer_to_list(VirtualColNo)
- end,
- DataStr = lists:flatten(tv_io_lib:format("~p", [DataToShow])),
- gs:config(RowColLblId, [{label, {text,RowStr++ColStr}}]),
- gs:config(FgLblId, [{enable,true}]),
- gs:config(FgLblId, [{delete, {0,10000000}}]),
- gs:config(FgLblId, [{insert, {0,DataStr}}]),
- case Writable of
- true ->
- gs:config(FgLblId, [{setfocus,true},
- {cursor, text}]);
- false ->
- gs:config(FgLblId, [{enable,false},
- {setfocus, false},
- {cursor, arrow}])
- end,
- update_toolbar_editor(EdId, {DataToShow})
- end.
-
-
-
-
-
-
-
-
-get_data_element(row, DataList, RowNo, _VirtualCol) ->
- if
- length(DataList) < RowNo ->
- {notext, undefined};
- true ->
- RowObj = lists:nth(RowNo, DataList),
- {{RowObj}, RowObj}
- end;
-get_data_element(cell, DataList, RowNo, ColNo) ->
- %% It's the responsibility of pg to ensure that there is a data item
- %% for the cell marked, meaning we don't *have* to check the length of
- %% the data items. However, since we in the future may want to edit
- %% even empty cells, we check it!
- if
- length(DataList) < RowNo ->
- {notext, undefined};
- true ->
- DataItem = lists:nth(RowNo, DataList),
- if
- is_tuple(DataItem) ->
- if size(DataItem) < ColNo ->
- {notext, DataItem};
- true ->
- {{element(ColNo, DataItem)}, DataItem}
- end;
- true ->
- {{DataItem}, DataItem}
- end
- end.
-
-
-
-
-
-
-
-
-show_toolbar_editor(ProcVars) ->
- #process_variables{frame_params = FrameP,
- toolbar_params = ToolP} = ProcVars,
-
- #frame_params{toolbar_frame_height = THeight} = FrameP,
-
- #toolbar_params{editor_frame_id = EdFrameId} = ToolP,
-
- Xpos = 0,
- Ypos = THeight - 8 - ?ROW_COL_LBL_HEIGHT + 1,
- gs:config(EdFrameId, [{x, Xpos},
- {y, Ypos}
- ]),
- ProcVars.
-
-
-
-
-
-
-
-
-hide_toolbar_editor(ProcVars) ->
- #process_variables{toolbar_params = ToolP} = ProcVars,
-
- #toolbar_params{editor_frame_id = EdFrameId} = ToolP,
-
- Xpos = 0,
- Ypos = (-1) * gs:read(EdFrameId, height) - 50,
- gs:config(EdFrameId, [{x, Xpos},
- {y, Ypos}
- ]),
- ProcVars.
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-update_toolbar_editor(EdId, notext) ->
- gs:config(EdId, [{enable, true}]),
- gs:config(EdId, [clear]),
- gs:config(EdId, [{enable, false}]);
-update_toolbar_editor(EdId, {DataToShow}) ->
- Str = io_lib:format("~n~p~n", [DataToShow]),
- gs:config(EdId, [{enable, true}]),
- gs:config(EdId, [clear]),
- gs:config(EdId, [{overwrite, {insert, Str}}]),
- gs:config(EdId, [{enable, false}]).
-
-
-
-
-
-
-update_marks(true, _DataList, _ColorList, _MarkedRowData,
- _Pos, _NofRowsShown, _Writable, _Range, PcPid, PgPid, RecPid, ToolP, MarkP) ->
- PgPid ! #pg_remove_marks{sender = self()},
- %% Too much trouble trying to find the marked object again!
- %% On the other hand, is the mark based on the row number
- %% or the row content? Probably different strategies now, depending
- %% on where in the code we are... :-(
- %% update_toolbar_label(notext, ToolP, undefined, undefined, Writable),
- update_toolbar_editor(ToolP#toolbar_params.editor_id, notext),
- send_to_rec_edit(RecPid, insert_mode),
- PcPid ! #pc_marked_row{sender = self(),
- row_no = undefined,
- object = undefined,
- color = undefined
- },
- MarkP#mark_params{cell_col_no = undefined,
- row_no = undefined,
- virtual_row_no = undefined,
- marked_object = undefined,
- marked_color = undefined
- };
-update_marks(false, DataList, ColorList, MarkedRowData,
- Pos, NofRowsShown, Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP) ->
- #mark_params{cell_col_no = CellColNo,
- virtual_row_no = VirtualRowNo} = MarkP,
-
- % Marked row data contains the color also!
- {RowData, RowColors} = split_dblist(MarkedRowData, [], []),
-
- case VirtualRowNo of
- undefined ->
- MarkP;
- _AnyRow ->
- if
- VirtualRowNo > element(2, Range) ->
- %% Mark outside the existing list! Uh-uh, remove the mark immediately! 8-0
- update_marks(true, DataList, ColorList, MarkedRowData, Pos, NofRowsShown,
- Writable, Range, PcPid, PgPid, RecPid, ToolP, MarkP);
- true ->
- {DataElement, RowObj} = choose_data_to_show(VirtualRowNo, CellColNo, RowData,
- DataList, Pos),
- {_, RowObjColor} = choose_data_to_show(VirtualRowNo, CellColNo, RowColors,
- ColorList, Pos),
- case DataElement of
- notext ->
- %% send_to_rec_edit(RecPid, insert_mode);
- done;
- _OtherElement ->
- %% send_to_rec_edit(RecPid, {update_mode, RowObj})
- send_to_rec_edit(RecPid, {reset_info, RowObj})
- end,
-
- %% case RowObj of
- %% OldMarkedObj ->
- %% done;
- %% _NewObj ->
- %% update_toolbar_label(DataElement, ToolP, VirtualRowNo,
- %% CellColNo, Writable)
- %% end,
-
- %% update_toolbar_label(DataElement,ToolP,VirtualRowNo,CellColNo,Writable),
-
- update_toolbar_editor(ToolP#toolbar_params.editor_id, DataElement),
- MarkP#mark_params{marked_object = RowObj,
- marked_color = RowObjColor}
- end
- end.
-
-
-
-
-
-choose_data_to_show(VirtualRowNo, undefined, _RowData, DataList, Pos) when VirtualRowNo >= Pos, VirtualRowNo =< (Pos + length(DataList) - 1) ->
- get_data_element(row, DataList, VirtualRowNo - Pos + 1, undefined);
-choose_data_to_show(_VirtualRowNo, undefined, RowData, _DataList, _Pos) ->
- get_data_element(row, RowData, 1, undefined);
-choose_data_to_show(VirtualRowNo, CellColNo, _RowData, DataList, Pos)
- when VirtualRowNo >= Pos, VirtualRowNo =< (Pos + length(DataList) - 1) ->
- get_data_element(cell, DataList, VirtualRowNo - Pos + 1, CellColNo);
-choose_data_to_show(_VirtualRowNo, CellColNo, RowData, _DataList, _Pos) ->
- get_data_element(cell, RowData, 1, CellColNo).
-
-
-
-
-
-
-get_new_scalepos(Btn, LastScalePos) ->
- receive
- {gs, _Id, click, _Data, [NewScalePos | _T]} ->
- get_new_scalepos(Btn, NewScalePos);
-
- {gs, _Id, buttonrelease, _Data, [Btn | _T]} ->
- LastScalePos;
-
- {gs, _Id, buttonrelease, _Data, _Args} ->
- get_new_scalepos(Btn, LastScalePos);
-
- {gs, _Id, buttonpress, _Data, _Args} ->
- get_new_scalepos(Btn, LastScalePos)
-
- end.
-
-
-
-
-
-
-
-split_dblist([], DataAcc, ColorAcc) ->
- {lists:reverse(DataAcc), lists:reverse(ColorAcc)};
-split_dblist([{Data, Color} | Tail], DataAcc, ColorAcc) ->
- split_dblist(Tail, [Data | DataAcc], [Color | ColorAcc]).
-
-
-
-
-
-
-
-
-init_toolbar(FrameP, ToolP) ->
- #frame_params{display_id = DispId,
- toolbar_frame_id = TId,
- toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight,
- grid_frame_width = GWidth} = FrameP,
-
- NewToolP = init_toolbar_btns(TId, ToolP),
- {RowColLblId, BgLabelId, FgLabelId, BtnId} =
- init_toolbar_label(TId, TWidth, THeight, GWidth),
-
- PopUpFrame = gs:frame(TId, [{width, 80},
- {height, 20},
- {x, 0},
- {y, -30},
- {bg, {0, 0, 0}}
- ]),
-
- PopUpLabel = gs:label(PopUpFrame, [{width, 78},
- {height, 18},
- {bg, {255,255,190}},
- {x,1},
- {y,1},
- {align, center},
- {label, {text,""}},
- {font,{screen,12}}]),
-
- {EditorFrameId, EditorId} = init_toolbar_editor(DispId, TWidth, THeight),
-
- NewToolP#toolbar_params{parent_id = TId,
- row_col_label_id = RowColLblId,
- bg_label_id = BgLabelId,
- fg_label_id = FgLabelId,
- label_btn_id = BtnId,
- pop_up_frame_id = PopUpFrame,
- pop_up_label_id = PopUpLabel,
- editor_frame_id = EditorFrameId,
- editor_id = EditorId
- }.
-
-
-
-
-
-
-init_toolbar_btns(TId, ToolP) ->
- PicDir = code:priv_dir(tv),
-% PicDir = "../priv",
- % Toolbar btns are 25x25, the bitmaps are 20x20.
- create_one_toolbar_btn(TId, 1, PicDir ++ "/edit1.xbm",
- {toolbar, insert_object, "Edit Object"}),
- create_one_toolbar_btn(TId, 3, PicDir ++ "/search.xbm",
- {toolbar, search_object, "Search Object"}),
- create_one_toolbar_btn(TId, 5, PicDir ++ "/sort.xbm",
- {toolbar, sort_rising_order, "Sort Ascending"}),
- create_one_toolbar_btn(TId, 6, PicDir ++ "/no_sort.xbm",
- {toolbar, no_sorting,"No Sorting"}),
- create_one_toolbar_btn(TId, 7, PicDir ++ "/sort_reverse.xbm",
- {toolbar, sort_falling_order,"Sort Descending"}),
- create_one_toolbar_btn(TId, 9, PicDir ++ "/poll.xbm",
- {toolbar, poll_table,"Poll Table"}),
- create_one_toolbar_btn(TId, 11, PicDir ++ "/info.xbm",
- {toolbar, table_info,"Table Info"}),
- create_one_toolbar_btn(TId, 13, PicDir ++ "/help.xbm",
- {toolbar, help_button, "Help"}),
- ToolP.
-
-
-
-
-
-
-
-
-create_one_toolbar_btn(ParentId, N, Image, Data) ->
- BtnWidth = 25,
- BtnHeight = 25,
- StartXpos = 0,
- BtnXpos = StartXpos + ((N - 1) * BtnWidth),
- BtnYpos = 2,
- BgColor = ?DEFAULT_BG_COLOR,
- FgColor = {178,34,34}, % Firebrick
-
- gs:button(ParentId, [{width, BtnWidth},
- {height, BtnHeight},
- {x, BtnXpos},
- {y, BtnYpos},
- {enter, true},
- {leave, true},
- {label, {image, Image}},
- {data, Data},
- {fg, FgColor},
- {bg, BgColor}
- ]).
-
-
-
-
-
-resize_toolbar(FrameP, ToolP) ->
- #frame_params{toolbar_frame_width = TWidth,
- toolbar_frame_height = THeight,
- grid_frame_width = GWidth} = FrameP,
-
- #toolbar_params{bg_label_id = BgId,
- fg_label_id = FgId,
- row_col_label_id = RowColId,
- label_btn_id = BtnId,
- editor_frame_id = FrId,
- editor_id = EdId} = ToolP,
-
- resize_toolbar_label(BgId, FgId, RowColId, BtnId, TWidth, THeight, GWidth),
- resize_toolbar_editor(FrId, EdId, TWidth, THeight),
- ToolP.
-
-
-
-
-
-
-
-
-init_toolbar_label(ParentId, ParentWidth, ParentHeight, GWidth) ->
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos, BtnWidth,
- BtnHeight, BtnXpos, BtnYpos} =
- get_toolbar_label_coords(ParentWidth, ParentHeight),
-
- BgId = gs:label(ParentId, [{width, BgWidth},
- {height, BgHeight},
- {x, BgXpos},
- {y, BgYpos},
- {bg, {0, 0, 0}},
- {fg, {0, 0, 0}}
- ]),
-
-
- RowColLblHeight = ?ROW_COL_LBL_HEIGHT,
- RowColLblWidth = GWidth - ?VBTN_WIDTH,
- RowColLblYpos = BgYpos + RowColLblHeight + 18,
-
- RowColLblId = gs:label(ParentId, [{width, RowColLblWidth},
- {height, RowColLblHeight},
- {x, ?VBTN_WIDTH},
- {y, RowColLblYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {178,34,34}},
- {align,center},
- {font,{screen,12}},
- {label, {text,""}}
- ]),
-
- FgId = gs:entry(editentry, ParentId, [{width, FgWidth},
- {height, FgHeight},
- {x, FgXpos},
- {y, FgYpos},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font,{screen,12}},
- {justify, left},
- {cursor, arrow},
- {setfocus, false},
- {enable, false},
- {keypress,true}
- ]),
-
- PicDir = code:priv_dir(tv),
- BtnId = gs:button(ParentId, [{width, BtnWidth},
- {height, BtnHeight},
- {x, BtnXpos},
- {y, BtnYpos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {label, {image, PicDir ++ "/more.xbm"}},
- {data, {labelbtn, pop_up}}
- ]),
-
- {RowColLblId, BgId, FgId, BtnId}.
-
-
-
-
-
-
-
-init_toolbar_editor(DispId, TWidth, THeight) ->
- {BgWidth, BgHeight, BgXpos, BgYpos, Width, Height, Xpos, Ypos} =
- get_toolbar_editor_coords(TWidth, THeight),
-
- EditorFrame = gs:frame(DispId, [{width, BgWidth},
- {height, BgHeight},
- {x, BgXpos},
- {y, BgYpos},
- {bg, {0, 0, 0}}
- ]),
-
- Editor = gs:editor(EditorFrame, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {vscroll, right},
- {wrap, word},
- {bg, {255, 255, 255}},
- {fg, {0, 0, 0}},
- {enable, false}
- ]),
-
- {EditorFrame, Editor}.
-
-
-
-
-
-
-
-get_toolbar_editor_coords(TWidth, _THeight) ->
- BgWidth = TWidth,
- BgHeight = 200,
- BgXpos = 0,
- BgYpos = (-1) * BgHeight - 50,
- FgWidth = BgWidth - 2,
- FgHeight = BgHeight - 2,
- FgXpos = 1,
- FgYpos = 1,
-
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos}.
-
-
-
-
-
-
-resize_toolbar_editor(FrId, EdId, TWidth, THeight) ->
- {BgWidth, BgHeight, _BgXpos, _BgYpos, FgWidth, FgHeight, _FgXpos, _FgYpos} =
- get_toolbar_editor_coords(TWidth, THeight),
- gs:config(FrId, [{width, BgWidth},
- {height, BgHeight}
- ]),
-
- gs:config(EdId, [{width, FgWidth},
- {height, FgHeight}
- ]).
-
-
-
-
-
-
-resize_toolbar_label(BgId, FgId, RowColId, BtnId, ParentWidth, ParentHeight, GWidth) ->
- {BgWidth, BgHeight, _BgXpos, _BgYpos, FgWidth, FgHeight, _FgXpos, _FgYpos, _BtnWidth,
- _BtnHeight, BtnXpos, BtnYpos} =
- get_toolbar_label_coords(ParentWidth, ParentHeight),
-
- gs:config(RowColId, [{width, GWidth - ?VBTN_WIDTH}]),
-
- gs:config(BgId, [{width, BgWidth},
- {height, BgHeight}
- ]),
-
- gs:config(BtnId, [{x, BtnXpos},
- {y, BtnYpos}
- ]),
-
- gs:config(FgId, [{width, FgWidth},
- {height, FgHeight}
- ]).
-
-
-
-
-
-get_toolbar_label_coords(ParentWidth, ParentHeight) ->
- BtnWidth = 19,
- BgWidth = ParentWidth,
- BgHeight = 26,
- BgXpos = 0,
- BgYpos = ParentHeight - BgHeight - 8 - ?ROW_COL_LBL_HEIGHT + 2,
- FgHeight = BgHeight - 2,
- FgWidth = BgWidth - BtnWidth - 3,
- FgXpos = BgXpos + 1,
- FgYpos = BgYpos + 1,
- BtnHeight = BgHeight - 2,
- BtnXpos = FgWidth + 2,
- BtnYpos = BgYpos + 1,
-
- {BgWidth, BgHeight, BgXpos, BgYpos, FgWidth, FgHeight, FgXpos, FgYpos, BtnWidth,
- BtnHeight, BtnXpos, BtnYpos}.
-
-
-
-
-
-
-send_to_rec_edit(undefined, _Msg) ->
- done;
-send_to_rec_edit(RecPid, Msg) ->
- RecPid ! Msg.
-
-
-
-
diff --git a/lib/tv/src/tv_pd_frames.erl b/lib/tv/src/tv_pd_frames.erl
deleted file mode 100644
index aab40e2bba..0000000000
--- a/lib/tv/src/tv_pd_frames.erl
+++ /dev/null
@@ -1,482 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pd_frames).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,frame,2}}]).
-
-
-
--export([create_display_frames/4, resize_display_frames/3]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_display_frames(WindowId, WindowWidth, WindowHeight, FrameP) ->
- {DisplayId, DisplayWidth, DisplayHeight} =
- create_frame(WindowId,
- get_display_coords(WindowWidth, WindowHeight),
- ?DEFAULT_BG_COLOR,
- 0),
-
- {ToolbarId, ToolbarWidth, ToolbarHeight} = create_toolbar_frame(DisplayId,
- DisplayWidth),
-
- {SheetFrameId, SheetBgFrameId, SheetFrameWidth, SheetFrameHeight} =
- create_sheet_frames(DisplayId,
- DisplayWidth,
- DisplayHeight),
-
- {GridFrameId, GridBgFrameId, GridFrameWidth, GridFrameHeight} =
- create_grid_frames(SheetFrameId,
- SheetFrameWidth,
- SheetFrameHeight),
-
-
- FrameP#frame_params{display_id = DisplayId,
- toolbar_frame_id = ToolbarId,
- toolbar_frame_width = ToolbarWidth,
- toolbar_frame_height = ToolbarHeight,
- sheet_frame_id = SheetFrameId,
- sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- sheet_bgframe_id = SheetBgFrameId,
- grid_frame_id = GridFrameId,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight,
- grid_bgframe_id = GridBgFrameId
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_display_frames(NewW, NewH, FrameP) ->
- #frame_params{display_id = DispId,
- toolbar_frame_id = ToolbarId,
- sheet_frame_id = SheetFgId,
- sheet_bgframe_id = SheetBgId,
- grid_frame_id = GridFgId,
- grid_bgframe_id = GridBgId} = FrameP,
-
- {NewDispW, NewDispH} = config_frame(DispId, get_display_coords(NewW, NewH)),
- {NewToolW, NewToolH} = resize_toolbar(ToolbarId, NewDispW),
- {NewSheetFgW, NewSheetFgH} = resize_sheet_frames(SheetFgId, SheetBgId, NewDispW,
- NewDispH),
-
- {NewGridFgW, NewGridFgH} = resize_grid_frames(GridFgId, GridBgId, NewSheetFgW,
- NewSheetFgH),
-
- FrameP#frame_params{toolbar_frame_width = NewToolW,
- toolbar_frame_height = NewToolH,
- sheet_frame_width = NewSheetFgW,
- sheet_frame_height = NewSheetFgH,
- grid_frame_width = NewGridFgW,
- grid_frame_height = NewGridFgH
- }.
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_frame(Id, {Width, Height, Xpos, Ypos}) ->
- gs:config(Id, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos}
- ]),
- {Width, Height}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_frame(ParentId, {Width, Height, Xpos, Ypos}, Color, BorderWidth) ->
- Id = gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bw, BorderWidth},
- {bg, Color}
- ]),
- {Id, Width, Height}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_grid_frames(SheetFrameId, SheetFrameWidth, SheetFrameHeight) ->
- {BgId, _W, _H} =
- create_frame(SheetFrameId,
- get_grid_frame_coords(bg, SheetFrameWidth, SheetFrameHeight),
- ?BLACK,
- 0),
- {FgId, FgWidth, FgHeight} =
- create_frame(SheetFrameId,
- get_grid_frame_coords(fg, SheetFrameWidth, SheetFrameHeight),
- ?DEFAULT_BG_COLOR,
- 0),
- {FgId, BgId, FgWidth, FgHeight}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_sheet_frames(DispId, DispWidth, DispHeight) ->
- {BgId, _W, _H} = create_frame(DispId,
- get_sheet_frame_coords(bg, DispWidth, DispHeight),
- ?BLACK,
- 0),
- {FgId, FgWidth, FgHeight} =
- create_frame(DispId,
- get_sheet_frame_coords(fg, DispWidth, DispHeight),
- ?DEFAULT_BG_COLOR,
- 0),
- {FgId, BgId, FgWidth, FgHeight}.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_toolbar_frame(DispId, DispWidth) ->
- create_frame(DispId, get_toolbar_coords(DispWidth), ?DEFAULT_BG_COLOR, 0).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_display_coords(WindowWidth, WindowHeight) ->
- Xpos = 4,
- {WindowWidth - 2 * Xpos, WindowHeight - ?MENUBAR_HEIGHT - Xpos, Xpos, ?MENUBAR_HEIGHT}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_grid_frame_coords(bg, FrameWidth, FrameHeight) ->
- get_grid_frame_coords2(FrameWidth, FrameHeight, 0);
-get_grid_frame_coords(fg, FrameWidth, FrameHeight) ->
- get_grid_frame_coords2(FrameWidth, FrameHeight, 1).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_grid_frame_coords2(FrameWidth, FrameHeight, BorderWidth) ->
- Xpos = 0,
- Ypos = 0,
- Width = FrameWidth - ?VSCALE_WIDTH - Xpos - BorderWidth,
- Height = FrameHeight - ?HSCALE_HEIGHT - Ypos - BorderWidth,
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_sheet_frame_coords(bg, FrameWidth, FrameHeight) ->
- get_sheet_frame_coords2(FrameWidth, FrameHeight, 0);
-get_sheet_frame_coords(fg, FrameWidth, FrameHeight) ->
- get_sheet_frame_coords2(FrameWidth, FrameHeight, 1).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_sheet_frame_coords2(FrameWidth, FrameHeight, BorderWidth) ->
- Xpos = BorderWidth,
- Ypos = ?TOOLBAR_HEIGHT + BorderWidth,
- Width = FrameWidth - 2 * BorderWidth,
- Height = FrameHeight - Ypos - ?MISC_AREA_HEIGHT - BorderWidth,
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_toolbar_coords(DispWidth) ->
- Xpos = 0,
- {DispWidth - 2 * Xpos, ?TOOLBAR_HEIGHT, Xpos, 0}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_frames(FgId, BgId, ParentWidth, ParentHeight) ->
- config_frame(BgId, get_grid_frame_coords(bg, ParentWidth, ParentHeight)),
- config_frame(FgId, get_grid_frame_coords(fg, ParentWidth, ParentHeight)).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_sheet_frames(FgId, BgId, ParentWidth, ParentHeight) ->
- config_frame(BgId, get_sheet_frame_coords(bg, ParentWidth, ParentHeight)),
- config_frame(FgId, get_sheet_frame_coords(fg, ParentWidth, ParentHeight)).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_toolbar(Id, DispWidth) ->
- config_frame(Id, get_toolbar_coords(DispWidth)).
-
-
-
diff --git a/lib/tv/src/tv_pd_int_def.hrl b/lib/tv/src/tv_pd_int_def.hrl
deleted file mode 100644
index 2c76bef892..0000000000
--- a/lib/tv/src/tv_pd_int_def.hrl
+++ /dev/null
@@ -1,139 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pd part of the table tool.
-%%%
-%%%*********************************************************************
-
--define(SCALE_FUNC_FILE, tv_pd_scale).
--define(DISP_FUNC_FILE, tv_pd_display).
-
-
--define(SCALE_WIDTH, 75).
--define(VSCALE_WIDTH, 75).
--define(HSCALE_HEIGHT, 75).
--define(MENUBAR_HEIGHT, 30).
--define(TOOLBAR_HEIGHT, 84). %% 97
--define(DISPLAY_HEIGHT, 849).
--define(MISC_AREA_HEIGHT, 0).
--define(GRID_HEIGHT, 849).
--define(NOF_GRIDROWS, 35). %% 29
--define(NOF_GRIDCOLS, 10).
--define(DEFAULT_COLWIDTH, 100).
--define(ROW_HEIGHT, 20). %% 24
--define(VBTN_WIDTH, 55). %% 18
--define(HBTN_HEIGHT, 20).
--define(RESBTN_WIDTH, 5).
--define(DEFAULT_GRID_BGCOLOR, {255,255,255}).
--define(DEFAULT_GRID_FGCOLOR, {0,0,0}).
--define(GRID_MARK_COLOR, {0,255,255}).
--define(GRID_FONT, {courier,12}).
-
--define(ROW_COL_LBL_WIDTH, 140).
--define(ROW_COL_LBL_HEIGHT, 14).
-
-
-
--define(KEY_MARK_AREA_HEIGHT, 21).
-
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
--define(DEFAULT_ROW_COLOR, {178,34,34}). % Firebrick!
--define(DEFAULT_GRID_COLOR, {0,0,0}).
--define(LIGHT_GRAY, {226,226,226}).
--define(DARK_VIOLET, {148,0,211}).
--define(FIREBRICK, {178,34,34}).
--define(ANTIQUE_WHITE, {255,255,235}).
-
-
--record(frame_params, {display_id,
- toolbar_frame_id,
- toolbar_frame_width,
- toolbar_frame_height,
- sheet_frame_id,
- sheet_frame_width,
- sheet_frame_height,
- sheet_bgframe_id,
- grid_frame_id,
- grid_frame_width,
- grid_frame_height,
- grid_bgframe_id
- }).
-
-
-
-
--record(scale_params, {vscale_id,
- vscale_pos = 0,
- hscale_id,
- hscale_pos = 0
- }).
-
-
-
-
--record(mark_params, {cell_id,
- cell_col_no, % Virtual number!
- row_no, % Real number!
- virtual_row_no,
- col_no, % Virtual number!
- sort_col_no,
- marked_object,
- marked_color
- }).
-
-
-
--record(toolbar_params, {parent_id,
- row_col_label_id,
- bg_label_id,
- fg_label_id,
- label_btn_id,
- pop_up_frame_id,
- pop_up_label_id,
- editor_frame_id,
- editor_id
- }).
-
-
--record(process_variables, {master_pid,
- pg_pid,
- pb_pid,
- rec_pid,
- window_id,
- window_width,
- window_height,
- initialising = true,
- table_type,
- table_name,
- record_name,
- writable = false,
- lists_as_strings = true,
- sorting_on = false,
- first_col_shown = 1,
- first_row_shown = 1,
- nof_rows_shown,
- cols_shown = [],
- data_list = [],
- color_list = [],
- frame_params = #frame_params{},
- scale_params = #scale_params{},
- mark_params = #mark_params{},
- toolbar_params = #toolbar_params{}
- }).
diff --git a/lib/tv/src/tv_pd_int_msg.hrl b/lib/tv/src/tv_pd_int_msg.hrl
deleted file mode 100644
index faf23a9376..0000000000
--- a/lib/tv/src/tv_pd_int_msg.hrl
+++ /dev/null
@@ -1,433 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PG
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_init_grid, {sender,
- parent_id,
- width,
- height,
- xpos,
- ypos,
- nof_rows,
- row_height
- }).
-
-
-
--record(pg_list_info, {sender,
- lists_as_strings}).
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_col_info, {sender,
- first_col_shown,
- width_of_cols_shown,
- nof_rows_shown
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_col_marked, {sender,
- virtual_col
- }).
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_row_marked, {sender,
- virtual_row
- }).
-
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_data, {sender,
- data,
- first_row_shown
- }).
-
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_cell_marked, {sender,
- cell_marked, % true or false
- real_col,
- real_row,
- virtual_col,
- virtual_row,
- cell_text
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_resize_grid, {sender,
- width,
- height
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_resize_grid_col, {sender,
- real_col_no,
- virtual_col_no,
- xdiff
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pg_horizontal_scroll, {sender,
- leftmost_virtual_col
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_ready, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_remove_marks, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_mark_col, {sender,
- virtual_col,
- real_col
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pg_mark_row, {sender,
- virtual_row,
- real_row
- }).
-
-
-
-
-
-
-%%%*********************************************************************
-%%% MESSAGES OWNED BY PB
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
--record(pb_init_btns, {sender,
- parent_id,
- parent_width,
- parent_height,
- ypos,
- hbtn_height,
- resbtn_width,
- vbtn_width,
- nof_rows,
- row_height,
- first_col_shown,
- cols_shown
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_remove_marks, {sender}).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_update_hbtns, {sender,
- parent_width,
- parent_height,
- first_col_shown,
- cols_shown
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_update_vbtns, {sender,
- color_list,
- first_row_shown,
- nof_rows_shown,
- blinking_enabled
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_key_info, {sender,
- list_of_keys
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_new_colwidth, {sender,
- real_col,
- virtual_col,
- xdiff
- }).
-
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_col_marked, {sender,
- col_marked, % 'true' or 'false'
- real_col,
- virtual_col
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_row_marked, {sender,
- row_marked, % 'true' or 'false'
- real_row,
- virtual_row
- }).
-
-
-
-
-%%======================================================================
-%% Message:
-%%
-%% Function:
-%%
-%% Data:
-%%======================================================================
-
-
--record(pb_set_sort_col, {sender,
- virtual_col
- }).
-
-
-
-
diff --git a/lib/tv/src/tv_pd_scale.erl b/lib/tv/src/tv_pd_scale.erl
deleted file mode 100644
index 04af2bb981..0000000000
--- a/lib/tv/src/tv_pd_scale.erl
+++ /dev/null
@@ -1,305 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Part of pd controlling the scale, i.e., the scrollbar
-%%% imitation.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pd_scale).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,scale,2}}]).
-
-
-
--export([init_scale/2,
- resize_scale/2,
- set_scale_range/3,
- set_scale_pos/3]).
-
-
-
--include("tv_int_def.hrl").
--include("tv_pd_int_def.hrl").
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_scale(FrameP, ScaleP) ->
- #frame_params{sheet_frame_id = SheetFrameId,
- sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
-
- VScaleId = create_scale(vscale, SheetFrameId, SheetFrameWidth, GridFrameHeight),
- HScaleId = create_scale(hscale, SheetFrameId, GridFrameWidth, SheetFrameHeight),
-
- ScaleP#scale_params{vscale_id = VScaleId,
- vscale_pos = 0,
- hscale_id = HScaleId,
- hscale_pos = 0
- }.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_scale(FrameP, ScaleP) ->
- #frame_params{sheet_frame_width = SheetFrameWidth,
- sheet_frame_height = SheetFrameHeight,
- grid_frame_width = GridFrameWidth,
- grid_frame_height = GridFrameHeight} = FrameP,
-
- #scale_params{vscale_id = VScaleId,
- hscale_id = HScaleId} = ScaleP,
-
- config_scale(vscale, VScaleId, SheetFrameWidth, GridFrameHeight),
- config_scale(hscale, HScaleId, GridFrameWidth, SheetFrameHeight),
- ScaleP.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_scale_range(vscale, Range, ScaleP) ->
- {Lo, Hi} = Range,
- NewRange = if
- Lo > Hi ->
- {Hi, Hi};
- true ->
- Range
- end,
- VScaleId = ScaleP#scale_params.vscale_id,
- gs:config(VScaleId, [{range, NewRange}]);
-set_scale_range(hscale, Range, ScaleP) ->
- {Lo, Hi} = Range,
- NewRange = if
- Lo > Hi ->
- {Hi, Hi};
- true ->
- Range
- end,
- HScaleId = ScaleP#scale_params.hscale_id,
- gs:config(HScaleId, [{range, NewRange}]).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_scale_pos(_ScaleName, undefined, ScaleP) ->
- ScaleP;
-set_scale_pos(vscale, NewPos, ScaleP) ->
- ScaleId = ScaleP#scale_params.vscale_id,
- gs:config(ScaleId, [{pos, NewPos}]),
- ScaleP#scale_params{vscale_pos = NewPos};
-set_scale_pos(hscale, NewPos, ScaleP) ->
- ScaleId = ScaleP#scale_params.hscale_id,
- gs:config(ScaleId, [{pos, NewPos}]),
- ScaleP#scale_params{hscale_pos = NewPos}.
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-config_scale(ScaleName, ScaleId, FrameWidth, FrameHeight) ->
- {Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
- FrameWidth,
- FrameHeight),
- gs:config(ScaleId, [{height, Height},
- {width, Width},
- {x, Xpos},
- {y, Ypos}
- ]).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_scale(ScaleName, FrameId, FrameWidth, FrameHeight) ->
- {Width, Height, Xpos, Ypos} = get_scale_coords(ScaleName,
- FrameWidth,
- FrameHeight),
- {Orientation, Range} = case ScaleName of
- vscale ->
- {vertical, {1, 1}};
- hscale ->
- {horizontal, {1, 1}}
- end,
- gs:scale(FrameId, [{data, ScaleName},
- {orient, Orientation},
- {buttonpress, true},
- {buttonrelease, true},
- {height, Height},
- {width, Width},
- {x, Xpos},
- {y, Ypos},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {range, Range}
- ]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_scale_coords(hscale, FrameWidth, FrameHeight) ->
- Height = ?HSCALE_HEIGHT,
- Xpos = ?VBTN_WIDTH - 3, % Subtracting 3 makes it look better!
- Ypos = FrameHeight - Height,
- Width = FrameWidth - Xpos + 5, % Adding 5 for better look!
- {Width, Height, Xpos, Ypos};
-get_scale_coords(vscale, FrameWidth, FrameHeight) ->
- Width = ?VSCALE_WIDTH,
- Xpos = (FrameWidth - Width),
- Ypos = ?HBTN_HEIGHT - 3, % Subtracting 3 makes it look better!
- Height = FrameHeight - Ypos + 5, % Adding 5 for better look!
- {Width, Height, Xpos, Ypos}.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pg.erl b/lib/tv/src/tv_pg.erl
deleted file mode 100644
index 7194cfb756..0000000000
--- a/lib/tv/src/tv_pg.erl
+++ /dev/null
@@ -1,430 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pg).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pg/1]).
-
-
--include("tv_int_def.hrl").
--include("tv_pg_int_def.hrl").
--include("tv_pd_int_msg.hrl").
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pg.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the grid part of the display.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-pg(ParentPid) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{parent_pid = ParentPid},
- loop(ProcVars).
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: loop.
-%%
-%% Return Value: None.
-%%
-%% Description: Eternal (well, almost) loop, receiving messages and
-%% handling them.
-%%
-%% Parameters:
-%%======================================================================
-
-
-
-loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
-
- #pg_data{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = update_grid_data(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_list_info{lists_as_strings=ListAsStr} ->
- NewProcVars = tv_pg_gridfcns:handle_list_info(ListAsStr, ProcVars),
- loop(NewProcVars);
-
- #pg_horizontal_scroll{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = scroll_grid_horizontally(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_remove_marks{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = tv_pg_gridfcns:remove_marks(ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_col_marked{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = mark_grid_col(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_row_marked{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = mark_grid_row(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_resize_grid_col{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = resize_grid_column(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_resize_grid{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = resize_grid(Msg, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
- #pg_init_grid{} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = init_grid(Msg, ProcVars),
- mark_nonbusy(GridId),
- PdPid = ProcVars#process_variables.parent_pid,
- PdPid ! #pg_ready{sender = self()},
- loop(NewProcVars);
-
- {gs, Id, Event, Data, Args} ->
- GridId = mark_busy(ProcVars),
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- mark_nonbusy(GridId),
- loop(NewProcVars);
-
-
- {'EXIT', Pid, Reason} ->
- ParentPid = ProcVars#process_variables.parent_pid,
- exit_signals({Pid, Reason}, ParentPid, ProcVars),
- loop(ProcVars);
-
- _Other ->
- loop(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(ExitInfo, ParentPid, _ProcVars) ->
- case ExitInfo of
- {ParentPid, _Reason} ->
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
-
- case Msg of
-
- {Id, buttonpress, {gridcell, RealCol, RealRow, _FrameId}, [1 | _]} ->
- NewProcVars = tv_pg_gridfcns:mark_cell_and_notify(Id, RealCol,
- RealRow, ProcVars),
- NewProcVars;
-
-
- _OtherMessage ->
- ProcVars
-
- end.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_grid(Msg, ProcVars) ->
- #pg_init_grid{parent_id = ParentId,
- width = Width,
- height = Height,
- xpos = Xpos,
- ypos = Ypos,
- nof_rows = NofRows,
- row_height = RowHeight} = Msg,
- tv_pg_gridfcns:init_grid(ParentId, Width, Height, Xpos, Ypos, NofRows,
- RowHeight, ProcVars).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid(Msg, ProcVars) ->
- #pg_resize_grid{width = Width,
- height = Height} = Msg,
- tv_pg_gridfcns:resize_grid(Width, Height, ProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_column(Msg, ProcVars) ->
- #pg_resize_grid_col{real_col_no = RealCol,
- virtual_col_no = VirtualCol,
- xdiff = Xdiff} = Msg,
- tv_pg_gridfcns:resize_grid_column(RealCol, VirtualCol, Xdiff, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-scroll_grid_horizontally(Msg, ProcVars) ->
- FirstColShown = ?COMM_FUNC_FILE:max(1, Msg#pg_horizontal_scroll.leftmost_virtual_col),
- tv_pg_gridfcns:scroll_grid_horizontally(FirstColShown, ProcVars).
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_grid_data(Msg, ProcVars) ->
- #pg_data{data = Data,
- first_row_shown = FirstRowShown} = Msg,
- tv_pg_gridfcns:update_grid_data(Data, FirstRowShown, ProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_grid_col(Msg, ProcVars) ->
- #pg_col_marked{virtual_col = VirtualCol} = Msg,
- tv_pg_gridfcns:mark_col(VirtualCol, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_grid_row(Msg, ProcVars) ->
- #pg_row_marked{virtual_row = VirtualRow} = Msg,
- tv_pg_gridfcns:mark_row(VirtualRow, ProcVars).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_busy(ProcVars) ->
- GridP = ProcVars#process_variables.grid_params,
- GridId = GridP#grid_params.fg_frame,
- gs:config(GridId, [{cursor, busy}]),
- GridId.
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_nonbusy(GridId) ->
- gs:config(GridId, [{cursor, arrow}]).
-
diff --git a/lib/tv/src/tv_pg_gridfcns.erl b/lib/tv/src/tv_pg_gridfcns.erl
deleted file mode 100644
index d037b42294..0000000000
--- a/lib/tv/src/tv_pg_gridfcns.erl
+++ /dev/null
@@ -1,1918 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_pg_gridfcns).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}}]).
-
-
-
-
--export([init_grid/8,
- resize_grid/3,
- resize_grid_column/4,
- update_grid_data/3,
- scroll_grid_horizontally/2,
- mark_cell_and_notify/4,
- remove_marks/1,
- mark_col/2,
- mark_row/2,
- handle_list_info/2
- ]).
-
-
-
-
-
--include("tv_pd_int_msg.hrl").
--include("tv_pg_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init_grid(GridParentId, GridWidth,
- GridHeight, GridXpos, GridYpos, NofRows, RowHeight, ProcVars) ->
-
- % Get the size and ID of the grid-parent frame, i.e., the
- % grid-frame! Do not confuse the base-frames below with
- % the grid-frame!
-
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP} = ProcVars,
-
- #grid_params{fg_color = GridFgColor,
- nof_cols = NofCols,
- col_width = DefaultColWidth,
- first_col_shown = FirstColShown,
- col_widths = ColWidths} = GridP,
-
- % Create the two frames the column frames are placed on!
- % These two frames defines the size of the grid.
- BgFrame = create_base_frame(GridParentId, GridWidth, GridHeight,
- GridXpos, GridYpos, GridFgColor),
- FgFrame = create_base_frame(BgFrame, GridWidth - 1, GridHeight - 1,
- 0, 0, GridFgColor),
-
- % Compute the the colwidths necessary to cover the grid.
- ColsShown = compute_cols_shown(FirstColShown, ColWidths, GridWidth, NofCols,
- DefaultColWidth),
- NofRowsShown = compute_rows_shown(GridHeight, RowHeight),
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewNofCols = erlang:max(length(ColsShown), NofCols),
-
- % The GridColWidths list shall contain the current width of each frame.
- NewColWidths = update_col_widths(ColsShown, ColWidths, FirstColShown,
- DefaultColWidth),
-
- % Create column frames, one for each column, and rows (labels) on each frame.
- {FrameIdList, ColLabelList} = create_col_frames(NewNofCols, NofRows, RowHeight,
- FgFrame, GridP, [], []),
-
- % Get lists of label-ID's for each row. (When we created the column frames,
- % we got the id's of labels placed on each column, i.e., vertically.
- % However, most often we want the id's for one row, i.e., label id's
- % horisontally.)
- RowIdList = get_row_ids(NofRows, ColLabelList, []),
-
- % Update the grid_params record with the new values!
- NewGridP = GridP#grid_params{bg_frame = BgFrame,
- fg_frame = FgFrame,
- grid_width = GridWidth,
- grid_height = GridHeight,
- grid_xpos = GridXpos,
- grid_ypos = GridYpos,
- nof_cols = NewNofCols,
- col_widths = NewColWidths,
- cols_shown = ColsShown,
- nof_rows = NofRows,
- row_height = RowHeight,
- nof_rows_shown = NofRowsShown,
- col_frame_ids = FrameIdList,
- col_ids = ColLabelList,
- row_ids = RowIdList,
- row_data_list = lists:duplicate(NofRows, notext)
- },
-
- ProcVars#process_variables{grid_parent_id = GridParentId,
- grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid(NewWidth, NewHeight, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{bg_frame = BgFrame,
- fg_frame = FgFrame,
- nof_cols = NofCols,
- nof_rows = NofRows,
- col_width = DefaultColWidth,
- first_col_shown = FirstColShown,
- col_widths = ColWidths,
- row_height = RowHeight,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- row_ids = RowIds,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- gs:config(BgFrame, [{width, NewWidth},
- {height, NewHeight}
- ]),
- gs:config(FgFrame, [{width, NewWidth - 1},
- {height, NewHeight - 1}
- ]),
-
- ColsShown = compute_cols_shown(FirstColShown, ColWidths, NewWidth, NofCols,
- DefaultColWidth),
-
- NofRowsShown = compute_rows_shown(NewHeight, RowHeight),
-
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewColWidths = update_col_widths(ColsShown, ColWidths, FirstColShown,
- DefaultColWidth),
-
- NofColsShown = length(ColsShown),
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
- clear_fields(safe_nthtail(NofColsShown, NewColIds),
- safe_nthtail(NofRowsShown, NewRowIds)),
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
-
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- NewGridP = GridP#grid_params{grid_width = NewWidth,
- grid_height = NewHeight,
- nof_cols = NewNofCols,
- nof_rows_shown = NofRowsShown,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds
- },
-
- refresh_marks(NewGridP, MarkP),
-
- ProcVars#process_variables{grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_grid_column(RealCol, VirtualCol, Xdiff, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{grid_width = GridWidth,
- first_col_shown = FirstColShown,
- nof_cols = NofCols,
- col_widths = ColWidths,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- col_width = DefaultColWidth,
- row_ids = RowIds,
- max_col_width = MaxColWidth,
- min_col_width = MinColWidth,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- row_height = RowHeight,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- % Get new width!
- Width = erlang:min(MaxColWidth, erlang:max((lists:nth(VirtualCol, ColWidths) + Xdiff),
- MinColWidth)),
-
- % Resize the column.
- NewWidthOfCol = resize_one_column(RealCol, Width, ColFrameIds, MaxColWidth,
- MinColWidth),
-
- % Update the ColWidths list.
- TempColWidths = lists:sublist(ColWidths, VirtualCol - 1) ++
- [NewWidthOfCol | safe_nthtail(VirtualCol, ColWidths)],
-
- % Check the other columns, whether a new column has to be created.
- ColsShown = compute_cols_shown(FirstColShown, TempColWidths, GridWidth,
- NofCols, DefaultColWidth),
-
- % Get the final ColWidths list, after all updates!
- NewColWidths = update_col_widths(ColsShown, TempColWidths, FirstColShown,
- DefaultColWidth),
-
- % Tell parent about the width of columns shown!
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = FirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- % Get the new number of columns (may have changed).
- NofColsShown = length(ColsShown),
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- NewGridP = GridP#grid_params{nof_cols = NewNofCols,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds
- },
-
- refresh_marks(NewGridP, MarkP),
-
- ProcVars#process_variables{grid_params = NewGridP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-handle_list_info(ListAsStr, ProcVars) ->
- #process_variables{grid_params = GridP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown,
- row_data_list = RowDataList,
- row_ids = RowIds,
- lists_as_strings = OldListAsStr} = GridP,
-
- case ListAsStr of
- OldListAsStr ->
- ProcVars;
- _NewValue ->
- NofColsShown = length(ColsShown),
- RowsToUpdate = lists:sublist(RowIds, NofRowsShown),
- refresh_visible_rows(RowsToUpdate, FirstColShown, NofColsShown,
- RowDataList, ListAsStr),
- NewGridP = GridP#grid_params{lists_as_strings = ListAsStr},
- ProcVars#process_variables{grid_params = NewGridP}
- end.
-
-
-
-
-update_grid_data(Data, FirstRowShown, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds,
- lists_as_strings = ListAsStr} = GridP,
-
- NofColsShown = length(ColsShown),
- RowsToUpdate = lists:sublist(RowIds, NofRowsShown),
-
- NewMarkP = move_marks(FirstColShown, FirstRowShown, GridP, MarkP),
-
- update_visible_rows(RowsToUpdate, FirstColShown, NofColsShown, Data, ListAsStr),
- NewRowDataList = make_row_data_list(1, NofRows, Data),
-
- NewGridP = GridP#grid_params{first_row_shown = FirstRowShown,
- row_data_list = NewRowDataList},
-
- ProcVars#process_variables{grid_params = NewGridP,
- mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-scroll_grid_horizontally(NewFirstColShown, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{grid_width = Width,
- nof_cols = NofCols,
- nof_rows = NofRows,
- nof_rows_shown = NofRowsShown,
- first_row_shown = FirstRowShown,
- col_width = DefaultColWidth,
- max_col_width = MaxColWidth,
- min_col_width = MinColWidth,
- col_widths = ColWidths,
- row_height = RowHeight,
- col_frame_ids = ColFrameIds,
- col_ids = ColIds,
- row_ids = RowIds,
- bg_color = BgColor,
- fg_color = FgColor,
- row_data_list = RowDataList,
- lists_as_strings = ListAsStr} = GridP,
-
- % Probably it is unnecessary to check whether any new columns shall be
- % created or not, but what the heck, we don't want to crash...
- ColsShown = compute_cols_shown(NewFirstColShown, ColWidths, Width, NofCols,
- DefaultColWidth),
- NofColsShown = length(ColsShown),
-
- ParentPid ! #pg_col_info{sender = self(),
- first_col_shown = NewFirstColShown,
- width_of_cols_shown = ColsShown,
- nof_rows_shown = NofRowsShown
- },
-
- NewMarkP = move_marks(NewFirstColShown, FirstRowShown, GridP, MarkP),
-
- NewColWidths = update_col_widths(ColsShown, ColWidths, NewFirstColShown,
- DefaultColWidth),
-
- {NewNofCols, NewColFrameIds, NewColIds, NewRowIds} =
- check_nof_cols(ColsShown, (NofColsShown - NofCols), ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor ),
-
-
- RowsToUpdate = lists:sublist(NewRowIds, NofRowsShown),
- resize_all_grid_columns(1, ColsShown, NewColFrameIds, MaxColWidth, MinColWidth),
-
- refresh_visible_rows(RowsToUpdate, NewFirstColShown, NofColsShown, RowDataList, ListAsStr),
-
- % Clear fields currently not visible.
- clear_fields(safe_nthtail(NofColsShown, NewColIds),
- safe_nthtail(NofRowsShown, NewRowIds)),
-
-
- NewGridP = GridP#grid_params{nof_cols = NewNofCols,
- cols_shown = ColsShown,
- col_widths = NewColWidths,
- col_frame_ids = NewColFrameIds,
- col_ids = NewColIds,
- row_ids = NewRowIds,
- first_col_shown = NewFirstColShown
- },
-
- ProcVars#process_variables{grid_params = NewGridP,
- mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_row(VirtualRow, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds} = GridP,
-
- mark_row(VirtualRow, FirstRowShown, FirstRowShown + NofRowsShown - 1, RowIds,
- ?GRID_MARK_COLOR),
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = undefined,
- virtual_row = VirtualRow
- },
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_col(VirtualCol, ProcVars) ->
- #process_variables{grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- col_ids = ColIds} = GridP,
-
- NofColsShown = length(ColsShown),
- mark_col(VirtualCol, FirstColShown, FirstColShown + NofColsShown - 1, ColIds,
- ?GRID_MARK_COLOR),
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = VirtualCol,
- virtual_row = undefined
- },
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_cell_and_notify(CellId, RealCol, RealRow, ProcVars) ->
- #process_variables{parent_pid = ParentPid,
- grid_params = GridP,
- mark_params = MarkP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- first_row_shown = FirstRowShown} = GridP,
-
- OldCellId = MarkP#mark_params.cell_id,
-
- VirtualCol = FirstColShown + RealCol - 1,
- VirtualRow = FirstRowShown + RealRow - 1,
-
- %% Right now, when the table tool only is passive, i.e., we cannot edit
- %% the table content, we don't want to be able to mark empty cells.
-
- {text, CellText} = gs:read(CellId, label),
-
- CellMarked = case CellText of
- "" -> false;
- _AnyText when CellId=:=OldCellId -> false;
- _AnyText -> true
- end,
-
- remove_marks(ProcVars),
- update_marked_cells(CellId, OldCellId, CellMarked),
-
- notify_about_cell_marked(ParentPid, CellMarked, RealCol, RealRow,
- VirtualCol, VirtualRow, CellText),
-
- NewMarkP = case CellMarked of
- true ->
- MarkP#mark_params{cell_id = CellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow
- };
- false ->
- MarkP#mark_params{cell_id = undefined,
- virtual_col = 0,
- virtual_row = undefined
- }
- end,
-
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-remove_marks(ProcVars) ->
- #process_variables{mark_params = MarkP,
- grid_params = GridP} = ProcVars,
-
- #grid_params{first_col_shown = FirstColShown,
- cols_shown = ColsShown,
- col_ids = ColIds,
- first_row_shown = FirstRowShown,
- nof_rows_shown = NofRowsShown,
- row_ids = RowIds} = GridP,
-
-
- #mark_params{cell_id = CellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- update_marked_cells(CellId, CellId, false);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- unmark_col(VirtualCol, FirstColShown, FirstColShown + NofColsShown - 1,
- ColIds);
- {undefined, _AnyRow} ->
- unmark_row(VirtualRow, FirstRowShown, FirstRowShown + NofRowsShown - 1,
- RowIds);
- _Other ->
- update_marked_cells(CellId, CellId, false)
- end,
-
- NewMarkP = MarkP#mark_params{cell_id = undefined,
- virtual_col = 0,
- virtual_row = undefined
- },
- ProcVars#process_variables{mark_params = NewMarkP}.
-
-
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marks(FirstCol, FirstRow, GridP, MarkP) ->
- #grid_params{first_col_shown = OldFirstCol,
- cols_shown = ColsShown,
- first_row_shown = OldFirstRow,
- nof_rows_shown = NofRowsShown,
- col_ids = ColIds,
- row_ids = RowIds} = GridP,
-
- #mark_params{virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown,
- NofRowsShown, RowIds, MarkP);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- OldLastCol = OldFirstCol + NofColsShown - 1,
- LastCol = FirstCol + NofColsShown - 1,
- move_marked_col(VirtualCol, OldFirstCol, OldLastCol,
- FirstCol, LastCol, ColIds, MarkP);
- {undefined, _AnyRow} ->
- OldLastRow = OldFirstRow + NofRowsShown - 1,
- LastRow = FirstRow + NofRowsShown - 1,
- move_marked_row(VirtualRow, OldFirstRow, OldLastRow,
- FirstRow, LastRow, RowIds, MarkP);
- {_CellCol, _CellRow} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown,
- NofRowsShown, RowIds, MarkP)
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-refresh_marks(GridP, MarkP) ->
- #grid_params{first_col_shown = FirstCol,
- cols_shown = ColsShown,
- first_row_shown = FirstRow,
- nof_rows_shown = NofRowsShown,
- col_ids = ColIds,
- row_ids = RowIds} = GridP,
-
- #mark_params{virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
-
- case {VirtualCol, VirtualRow} of
- {undefined, undefined} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown, NofRowsShown,
- RowIds, MarkP);
- {_AnyCol, undefined} ->
- NofColsShown = length(ColsShown),
- LastCol = FirstCol + NofColsShown - 1,
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?GRID_MARK_COLOR);
- {undefined, _AnyRow} ->
- LastRow = FirstRow + NofRowsShown - 1,
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?GRID_MARK_COLOR);
- {_CellCol, _CellRow} ->
- NofColsShown = length(ColsShown),
- move_marked_cell(FirstCol, FirstRow, NofColsShown, NofRowsShown,
- RowIds, MarkP)
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_col(VirtualCol,
- OldFirstCol, OldLastCol, FirstCol, LastCol, ColIds, MarkP) ->
- unmark_col(VirtualCol, OldFirstCol, OldLastCol, ColIds),
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?GRID_MARK_COLOR),
- MarkP#mark_params{cell_id = undefined}.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_col(VirtualCol, FirstCol, _LastCol, _ColIds, _Color) when VirtualCol < FirstCol ->
- done;
-mark_col(VirtualCol, _FirstCol, LastCol, _ColIds, _Color) when VirtualCol > LastCol ->
- done;
-mark_col(VirtualCol, FirstCol, _LastCol, ColIds, Color) ->
- RealCol = VirtualCol - FirstCol + 1,
- MarkedColIds = lists:nth(RealCol, ColIds),
- mark_all_cells(MarkedColIds, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_col(VirtualCol, FirstCol, LastCol, ColIds) ->
- mark_col(VirtualCol, FirstCol, LastCol, ColIds, ?DEFAULT_GRID_BGCOLOR).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_all_cells([], _Color) ->
- done;
-mark_all_cells([CellId | T], Color) ->
- gs:config(CellId, [{bg, Color}]),
- mark_all_cells(T, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-mark_row(VirtualRow, FirstRow, _LastRow, _RowIds, _Color) when VirtualRow < FirstRow ->
- done;
-mark_row(VirtualRow, _FirstRow, LastRow, _RowIds, _Color) when VirtualRow > LastRow ->
- done;
-mark_row(VirtualRow, FirstRow, _LastRow, RowIds, Color) ->
- RealRow = VirtualRow - FirstRow + 1,
- MarkedRowIds = lists:nth(RealRow, RowIds),
- mark_all_cells(MarkedRowIds, Color).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-unmark_row(VirtualRow, FirstRow, LastRow, RowIds) ->
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?DEFAULT_GRID_BGCOLOR).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_row(VirtualRow,
- OldFirstRow, OldLastRow, FirstRow, LastRow, RowIds, MarkP) ->
- unmark_row(VirtualRow, OldFirstRow, OldLastRow, RowIds),
- mark_row(VirtualRow, FirstRow, LastRow, RowIds, ?GRID_MARK_COLOR),
- MarkP#mark_params{cell_id = undefined}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-move_marked_cell(FirstColShown,
- FirstRowShown, NofColsShown, NofRowsShown, RowIds, MarkP) ->
- #mark_params{cell_id = OldCellId,
- virtual_col = VirtualCol,
- virtual_row = VirtualRow} = MarkP,
-
- case OldCellId of
- undefined ->
- MarkP;
- _OtherId ->
- NewRealCol = VirtualCol - FirstColShown + 1,
- NewRealRow = VirtualRow - FirstRowShown + 1,
- update_marked_cells(undefined, OldCellId, false),
- case check_if_new_mark_visible(NewRealCol, NewRealRow,
- NofColsShown, NofRowsShown) of
- false ->
- MarkP;
- true ->
- NewCellId = lists:nth(NewRealCol,
- lists:nth(NewRealRow, RowIds)),
- update_marked_cells(NewCellId, undefined, true),
- MarkP#mark_params{cell_id = NewCellId}
- end
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_if_new_mark_visible(Col, _Row, NofCols, _NofRows) when Col > NofCols ->
- false;
-check_if_new_mark_visible(Col, _Row, _NofCols, _NofRows) when Col =< 0 ->
- false;
-check_if_new_mark_visible(_Col, Row, _NofCols, NofRows) when Row > NofRows ->
- false;
-check_if_new_mark_visible(_Col, Row, _NofCols, _NofRows) when Row =< 0 ->
- false;
-check_if_new_mark_visible(_Col, _Row, _NofCols, _NofRows) ->
- true.
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_marked_cells(CellId, OldCellId, _MarkedCell) when CellId =:= OldCellId ->
- gs:config(CellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]);
-update_marked_cells(_CellId, undefined, false) ->
- done;
-update_marked_cells(CellId, undefined, true) ->
- gs:config(CellId, [{bg, ?GRID_MARK_COLOR}]);
-update_marked_cells(CellId, OldCellId, true) ->
- gs:config(OldCellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]),
- gs:config(CellId, [{bg, ?GRID_MARK_COLOR}]);
-update_marked_cells(_CellId, OldCellId, false) ->
- gs:config(OldCellId, [{bg, ?DEFAULT_GRID_BGCOLOR}]).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-notify_about_cell_marked(Pid, Marked, RealCol, RealRow, VirtCol, VirtRow, Text) ->
- Pid ! #pg_cell_marked{sender = self(),
- cell_marked = Marked,
- real_col = RealCol,
- real_row = RealRow,
- virtual_col = VirtCol,
- virtual_row = VirtRow,
- cell_text = Text
- }.
-
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to print data in the grid fields.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-refresh_visible_rows([], _FirstColShown, _NofColsShown, _DataList, _ListAsStr) ->
- done;
-refresh_visible_rows(RowIds, _FirstColShown, _NofColsShown, [], _ListAsStr) ->
- clear_cols_or_rows(RowIds);
-refresh_visible_rows([OneRowIds | RemRowIds], FirstColShown, NofColsShown,
- [DataItemList | RemDataItemLists], ListAsStr) ->
- NewDataItemList = get_data_sublist(DataItemList, FirstColShown, NofColsShown),
- update_one_row(lists:sublist(OneRowIds, NofColsShown), NewDataItemList, ListAsStr),
- refresh_visible_rows(RemRowIds, FirstColShown, NofColsShown, RemDataItemLists, ListAsStr).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_visible_rows([], _FirstColShown, _NofColsShown, _DataList, _ListAsStr) ->
- done;
-update_visible_rows(RowIds, _FirstColShown, _NofColsShown, [], _ListAsStr) ->
- clear_cols_or_rows(RowIds);
-update_visible_rows([OneRowIds | RemRowIds], FirstColShown, NofColsShown,
- [DataItem | RemData], ListAsStr) ->
- % We convert the received item to a list! This way we know that
- % '[notext]' shall be printed as 'notext', while 'notext' shall
- % be printed as ''.
- TempDataItemList = item_to_list(DataItem),
- DataItemList = get_data_sublist(TempDataItemList, FirstColShown,
- NofColsShown),
- update_one_row(lists:sublist(OneRowIds, NofColsShown), DataItemList, ListAsStr),
- update_visible_rows(RemRowIds, FirstColShown, NofColsShown, RemData, ListAsStr).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_one_row(OneRowIds, [], _ListAsStr) ->
- clear_one_col_or_row(OneRowIds);
-update_one_row([], _DataItemList, _ListAsStr) ->
- done;
-update_one_row([LabelId | RemLabelIds], [notext | T], ListAsStr) ->
- gs:config(LabelId, [{label, {text, ""}}
- ]),
- update_one_row(RemLabelIds, T, ListAsStr);
-update_one_row([LabelId | RemLabelIds], [DataElem | T], ListAsStr) ->
- Str = case ListAsStr of
- true ->
- tv_io_lib:format(" ~p", [DataElem]);
- false ->
- " " ++ lists:flatten(tv_io_lib:write(DataElem))
- end,
- gs:config(LabelId, [{label, {text, Str}}
- ]),
- update_one_row(RemLabelIds, T, ListAsStr).
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-make_row_data_list(N, NofRows, []) when N > NofRows ->
- [];
-make_row_data_list(N, NofRows, []) ->
- % If NofRows == N, we get the empty list here!
- lists:duplicate(NofRows- N, notext);
-make_row_data_list(N, NofRows, [_DataItem | _RemData]) when N > NofRows ->
- [];
-make_row_data_list(N, NofRows, [DataItem | RemData]) ->
- % We convert the received item to a list! This way we know that
- % '[notext]' shall be printed as 'notext', while 'notext' shall
- % be printed as ''.
- [item_to_list(DataItem) | make_row_data_list(N + 1, NofRows, RemData)].
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-item_to_list(Item) when is_tuple(Item) ->
- tuple_to_list(Item);
-item_to_list(Item) ->
- [Item].
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_data_sublist(DataList, StartPos, Length) ->
- case catch lists:sublist(DataList, StartPos, Length) of
- {'EXIT', _Reason} ->
- [];
- Sublist ->
- Sublist
- end.
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to print data in the grid fields.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to resize the grid columns.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_all_grid_columns(_RealCol, [], _ColFrameIds, _MaxColWidth, _MinColWidth) ->
- done;
-resize_all_grid_columns(RealCol, [ColWidth | Tail], ColFrameIds, MaxColWidth, MinColWidth) ->
-
- resize_one_column(RealCol, ColWidth, ColFrameIds, MaxColWidth, MinColWidth),
- resize_all_grid_columns(RealCol + 1, Tail, ColFrameIds, MaxColWidth,
- MinColWidth).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-resize_one_column(RealCol, Width, ColFrameIds, MaxW, MinW) ->
- NewWidthOfCol = erlang:min(MaxW, erlang:max(Width, MinW)),
- case length(ColFrameIds) of
- RealCol ->
- done;
- _Other ->
- FrameId = lists:nth(RealCol + 1, ColFrameIds),
- gs:config(FrameId, [{x, NewWidthOfCol + 1}])
- end,
- NewWidthOfCol.
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to resize the grid columns.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to update the grid.
-%%%---------------------------------------------------------------------
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_fields(ColIds, RowIds) ->
- clear_cols_or_rows(ColIds),
- clear_cols_or_rows(RowIds).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_cols_or_rows([]) ->
- done;
-clear_cols_or_rows([IdList | RemIdLists]) ->
- clear_one_col_or_row(IdList),
- clear_cols_or_rows(RemIdLists).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-clear_one_col_or_row([]) ->
- done;
-clear_one_col_or_row([LabelId | RemLabelIds]) ->
- gs:config(LabelId, [{label, {text, ""}}
- ]),
- clear_one_col_or_row(RemLabelIds).
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to update the grid.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to compute the part of the grid that has to
-%%% be updated, as well as deciding whether a new column has to be added.
-%%% Old columns (i.e., columns not visible) are not removed, but they
-%%% shall not be updated until they once again becomes visible.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-check_nof_cols(_ColsShown, NofNewCols, ColFrameIds, ColIds, RowIds,
- _NofRows, _RowHeight, _FgColor, _BgColor) when NofNewCols =< 0 ->
- {length(ColFrameIds), ColFrameIds, ColIds, RowIds};
-check_nof_cols(ColsShown, NofNewCols, ColFrameIds, ColIds,
- RowIds, NofRows, RowHeight, FgColor, BgColor) ->
- NewColNo = length(ColFrameIds) + 1,
- % We don't care about the pathological case where no columns have been
- % created. If the gridwidth, or the columnwidth, was set to =< 0 during
- % initialisation, then no columns will have been created. The program
- % will probably also have crashed. If any smart jackass has set invalid
- % values on these important parameters, then he can only blame himself.
- ParentId = lists:nth((NewColNo - 1), ColFrameIds),
- ParentColWidth = lists:nth((NewColNo - 1), ColsShown),
- Xpos = ParentColWidth + 1,
-
- {ColFrameId, LabelIds} = add_one_col_frame(ParentId, NewColNo, Xpos, FgColor,
- BgColor, NofRows, RowHeight),
-
- NewColFrameIds = ColFrameIds ++ [ColFrameId],
- NewColIds = ColIds ++ [LabelIds],
- NewRowIds = update_row_ids(RowIds, LabelIds),
-
- check_nof_cols(ColsShown, NofNewCols - 1, NewColFrameIds, NewColIds, NewRowIds,
- NofRows, RowHeight, FgColor, BgColor).
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_row_ids([], _LabelIds) ->
- [];
-update_row_ids([OneRowIds | RemainingRows], [NewElemId | RemainingElemIds]) ->
- [OneRowIds ++ [NewElemId] | update_row_ids(RemainingRows, RemainingElemIds)].
-
-
-
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-update_col_widths(ColsShown, ColWidths, FirstColShown, DefaultColWidth) ->
- % What we do here is that we first (if necessary) add default
- % column widths to the ColWidth list until it reaches to where
- % ColsShown starts (vitually seen).
- % In the second step we take the appropriate elements from the
- % ColsShown list and add them to the ColWidths list, until it is
- % of sufficient length.
- % Of course this may seem unnecessary - it would suffice to just
- % add default widths to the ColWidths list until it is long enough,
- % since the compute_cols_shown function right now just adds default
- % width columns to the ColsShown list, when the ColWidths list is empty.
- % However, this could change (maybe we some other time want the last
- % column to carry all remaining width, instead of adding new columns).
- % Besides, we don't like hidden dependencies between functions!!!
-
- NofColsShown = length(ColsShown),
- NewColWidths = set_necessary_col_widths_length(FirstColShown, ColWidths,
- DefaultColWidth),
- % Now NofVirtualCols will always be equal to, or greater
- % than, FirstColShown - 1.
-
- NofVirtualCols = length(NewColWidths),
- NecessaryNofVirtualCols = FirstColShown + (NofColsShown - 1),
- if
- NecessaryNofVirtualCols > NofVirtualCols ->
- TailNo = NofVirtualCols - FirstColShown + 1, % Always >= 0 !!!
- NewColWidths ++ safe_nthtail(TailNo, ColsShown);
- true ->
- NewColWidths
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-set_necessary_col_widths_length(FirstColShown, ColWidths, DefaultColWidth) ->
- % First check that (length(ColWidths) - FirstColShown) >= -1.
- % If not, add elements so the relation holds true!
- MissingDefaultWidthElems = FirstColShown - length(ColWidths),
- if
- MissingDefaultWidthElems > 1 ->
- ColWidths ++ lists:duplicate(MissingDefaultWidthElems - 1,
- DefaultColWidth);
- true ->
- ColWidths
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-compute_rows_shown(GridHeight, RowHeight) ->
- (GridHeight div RowHeight) + 1.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-compute_cols_shown(FirstColShown, ColWidths, GridWidth, _NofCols, DefaultColWidth) ->
- ColWidthsLength = length(ColWidths),
- % Normally ColWidths shall be long enough, but just to make sure...
- % (We could have chosen to update ColWidths here to, but right now
- % we do it instead explicitly when resizeing the grid, changing the
- % column size(s), and scrolling horizontally.)
- UsedColWidths = if
- ColWidthsLength < FirstColShown ->
- [];
- true ->
- safe_nthtail(FirstColShown - 1, ColWidths)
- end,
- compute_cols_shown(UsedColWidths, GridWidth, DefaultColWidth).
-
-
-
-
-
-
-compute_cols_shown(_ColWidths, RemainingWidth, _DefColW) when RemainingWidth =< 0 ->
- [];
-compute_cols_shown([], RemainingWidth, DefaultColWidth) ->
- [DefaultColWidth | compute_cols_shown([], RemainingWidth - DefaultColWidth,
- DefaultColWidth)];
-compute_cols_shown([VirtualColWidth | T], RemainingWidth, DefaultColWidth) ->
- [VirtualColWidth | compute_cols_shown(T, RemainingWidth - VirtualColWidth,
- DefaultColWidth)].
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to compute the part of the grid that has to
-%%% be updated, as well as deciding whether a new column has to be added.
-%%%---------------------------------------------------------------------
-
-
-
-
-
-
-
-%%%---------------------------------------------------------------------
-%%% START of functions used to create the grid (baseframes, columns
-%%% and rows), as well as sorting the ID's appropriately.
-%%%---------------------------------------------------------------------
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_base_frame(ParentId, Width, Height, Xpos, Ypos, BgColor) ->
- gs:frame(ParentId, [{width, Width},
- {height, Height},
- {x, Xpos},
- {y, Ypos},
- {bg, BgColor}
- ]).
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_col_frames(0, _NofRows, _RowHeight, _ParentId, _GridP, ColFrameAcc, LabelAcc) ->
- {lists:reverse(ColFrameAcc), lists:reverse(LabelAcc)};
-create_col_frames(N, NofRows, RowHeight, ParentId, GridP, ColFrameAcc, LabelAcc) ->
- % Yes, it *IS* inefficient to copy GridP for each loop.
- % However, it is only done once, and for a limited number of times,
- % and we avoid having a lot of parameters!
- #grid_params{bg_color = BgColor,
- fg_color = FgColor,
- nof_cols = NofCols,
- col_width = ColWidth} = GridP,
- Xpos = if
- N =:= NofCols ->
- 0;
- true ->
- ColWidth + 1
- end,
-
- ColNo = NofCols - N + 1,
- {ColFrameId, LabelIds} = add_one_col_frame(ParentId, ColNo, Xpos, FgColor,
- BgColor, NofRows, RowHeight),
- create_col_frames(N - 1, NofRows, RowHeight, ColFrameId, GridP,
- [ColFrameId | ColFrameAcc], [LabelIds | LabelAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-add_one_col_frame(ParentId, ColNo, Xpos, FgColor, BgColor, NofRows, RowHeight) ->
- ColFrameId = create_one_col_frame(ParentId, Xpos, FgColor),
- FirstRowYpos = 1,
- FirstRowNo = 1,
- LabelIds = create_rows_on_frame(ColFrameId, FirstRowNo, NofRows, RowHeight,
- FirstRowYpos, FgColor, BgColor, ColNo, []),
- {ColFrameId, LabelIds}.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_one_col_frame(ParentId, Xpos, BgColor) ->
- ColFrameWidth = 1200,
- ColFrameHeight = 900,
- Ypos = 0,
- gs:frame(ParentId, [{width, ColFrameWidth},
- {height, ColFrameHeight},
- {x, Xpos},
- {y, Ypos},
- {bg, BgColor}
- ]).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-create_rows_on_frame(_FrameId, RowNo, NofRows, _H, _Y, _Fg, _Bg, _ColNo, Acc) when RowNo > NofRows ->
- lists:reverse(Acc);
-create_rows_on_frame(FrameId, RowNo, NofRows, H, Y, Fg, Bg, ColNo, RAcc) ->
- Width = 1200,
- R = gs:label(FrameId, [{width, Width},
- {height, H},
- {x, 1},
- {y, Y},
- {bg, Bg},
- {fg, Fg},
- {align, w},
- {buttonpress, true},
- {data, {gridcell, ColNo, RowNo, FrameId}}
- ]),
- NextRowNo = RowNo + 1,
- NextY = Y + H +1,
- create_rows_on_frame(FrameId, NextRowNo, NofRows, H, NextY, Fg, Bg, ColNo,
- [R | RAcc]).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-get_row_ids(0, _Cols, RowAcc) ->
- RowAcc;
-get_row_ids(RowNo, Cols, RowAcc) ->
- Row = extract_ids_for_one_row(RowNo, Cols),
- get_row_ids(RowNo - 1, Cols, [Row | RowAcc]).
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-extract_ids_for_one_row(_N, []) ->
- [];
-extract_ids_for_one_row(N, [ColIds | Tail]) ->
- [lists:nth(N, ColIds) | extract_ids_for_one_row(N, Tail)].
-
-
-
-%%%---------------------------------------------------------------------
-%%% END of functions used to create the grid.
-%%%---------------------------------------------------------------------
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-safe_nthtail(_, []) -> [];
-safe_nthtail(1, [_|T]) -> T;
-safe_nthtail(N, [_|T]) when N > 1 ->
- safe_nthtail(N - 1, T);
-safe_nthtail(0, L) when is_list(L) -> L.
diff --git a/lib/tv/src/tv_pg_int_def.hrl b/lib/tv/src/tv_pg_int_def.hrl
deleted file mode 100644
index 6f88053d47..0000000000
--- a/lib/tv/src/tv_pg_int_def.hrl
+++ /dev/null
@@ -1,92 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pd part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--define(GRIDFUNCS, tv_pg_gridfcns).
-
-
-
--define(DEFAULT_COLFRAME_HEIGHT, 870).
--define(DEFAULT_COLWIDTH, 100).
--define(DEFAULT_GRID_BGCOLOR, {255, 255, 255}). % white
--define(DEFAULT_GRID_FGCOLOR, {0, 0, 0}). % black
--define(GRID_MARK_COLOR, {200, 255, 255}).
--define(GRID_FONT, {courier, 12}).
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
--define(DEFAULT_ROW_COLOR, {178, 34, 34}). % Firebrick!
--define(DEFAULT_GRID_COLOR, {0, 0, 0}).
--define(LIGHT_GRAY, {226, 226, 226}).
--define(DARK_VIOLET, {148, 0, 211}).
--define(FIREBRICK, {178, 34, 34}).
--define(ANTIQUE_WHITE, {255, 255, 235}).
-
-
-
-
--record(grid_params, {bg_frame,
- fg_frame,
- grid_width,
- grid_height = ?DEFAULT_COLFRAME_HEIGHT, % Actual height,
- % not the height
- % shown!
- grid_xpos,
- grid_ypos,
- bg_color = ?DEFAULT_GRID_BGCOLOR,
- fg_color = ?DEFAULT_GRID_FGCOLOR,
- nof_cols = 10,
- nof_rows,
- nof_rows_shown,
- row_height,
- col_width = ?DEFAULT_COLWIDTH,
- first_col_shown = 1,
- first_row_shown = 1,
- max_col_width = 1200,
- min_col_width = 5,
- col_widths = [],
- cols_shown = [],
- col_frame_ids = [],
- col_ids = [],
- row_ids = [],
- row_data_list = [],
- current_max_value,
- lists_as_strings = true
- }).
-
-
-
--record(mark_params, {cell_id,
- virtual_col,
- virtual_row
- }).
-
-
-
-
--record(process_variables, {parent_pid,
- grid_parent_id,
- grid_params = #grid_params{},
- mark_params = #mark_params{}
- }).
diff --git a/lib/tv/src/tv_poll_dialog.erl b/lib/tv/src/tv_poll_dialog.erl
deleted file mode 100644
index e33d398898..0000000000
--- a/lib/tv/src/tv_poll_dialog.erl
+++ /dev/null
@@ -1,363 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Code for the "set poll interval" dialog with the user.
-%%%
-%%%*********************************************************************
-
--module(tv_poll_dialog).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,radiobutton,2}},
- {nowarn_deprecated_function,{gs,scale,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,2}}]).
-
-
--export([start/1, init/2]).
-
-
-
--include("tv_int_msg.hrl").
-
-
-
--define(WINDOW_WIDTH, 305).
--define(WINDOW_HEIGHT, 185).
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-start(Pos) ->
- Pid = self(),
- ProcPid = spawn_link(?MODULE, init, [Pid, Pos]),
- receive_answer(ProcPid).
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-init(Pid, Pos) ->
- process_flag(trap_exit, true),
- {ScalePos, ScaleRange, Poll, Color} = case Pos of
- infinity ->
- {0, {20, 20}, false, {255, 255, 255}};
- _Other ->
- {Pos, {20, 300}, true, {0, 0, 0}}
- end,
- S = gs:start(),
- Win = gs:window(S, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT},
- {bg, ?DEFAULT_BG_COLOR},
- {title, "[TV] Set Poll Interval"},
- {configure, true},
- {destroy, true}
- ]),
-
- NoPollBtn = gs:radiobutton(Win, [{height, 30},
- {width, 143},
- {x, 10},
- {y, 10},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {value, no_poll},
- {label, {text, "Manual Polling"}},
- {select, not(Poll)}
- ]),
-
- PollBtn = gs:radiobutton(Win, [{height, 30},
- {width, 163},
- {x, 10},
- {y, 60},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {value, poll},
- {label, {text, "Automatic Polling"}},
- {select, Poll}
- ]),
-
- Lbl = gs:label(Win, [{label, {text, "Poll Interval (seconds):"}},
- {align, center},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, Color},
- {width, 183},
- {height, 30},
- {x, 10},
- {y, 100}
- ]),
-
- Scale = gs:scale(Win, [{bg, ?DEFAULT_BG_COLOR},
- {fg, Color},
- {orient, horizontal},
- {range, ScaleRange},
- {pos, ScalePos},
- {width, 285},
- {height, 50},
- {x, 10},
- {y, 130}
- ]),
-
- OkBtn = gs:button(Win, [{label, {text, "OK"}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {width, 60},
- {height, 30},
- {x, 230},
- {y, 10}
- ]),
-
- CancelBtn = gs:button(Win, [{label, {text, "Cancel"}},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0, 0, 0}},
- {align, center},
- {width, 60},
- {height, 30},
- {x, 230},
- {y, 60}
- ]),
-
- gs:config(Win, {map, true}),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn, CancelBtn, Poll, Pos).
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-receive_answer(ProcPid) ->
- receive_answer(ProcPid, undefined, undefined, undefined, undefined).
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg) ->
- receive Msg ->
- case Msg of
-
- {browser, ProcPid, cancel} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- cancel;
-
- {browser, ProcPid, {true, PollInterval}} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- PollInterval;
-
- {browser, ProcPid, {false, _Pollinterval}} ->
- PcPid = self(),
- PcPid ! DataReqMsg,
- PcPid ! WinConfMsg,
- PcPid ! MarkedRowMsg,
- PcPid ! SubsetMsg,
- infinity;
-
- #pc_data_req{} ->
- receive_answer(ProcPid, Msg, WinConfMsg, MarkedRowMsg, SubsetMsg);
-
- #pc_win_conf{} ->
- receive_answer(ProcPid, DataReqMsg, Msg, MarkedRowMsg, SubsetMsg);
-
- #pc_marked_row{} ->
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, Msg, SubsetMsg);
-
- #dbs_subset{} ->
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, Msg);
-
- #pc_menu_msg{data = exit_button} ->
- self() ! Msg,
- cancel;
-
- #pc_set_sorting_mode{sender = Sender} ->
- Sender ! #pd_ignore{sender = self()},
- ProcPid ! raise_and_beep,
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg);
-
- {'EXIT', _Sender, _Reason} ->
- self() ! Msg,
- cancel;
-
- _Other ->
- ProcPid ! raise_and_beep,
- receive_answer(ProcPid, DataReqMsg, WinConfMsg, MarkedRowMsg, SubsetMsg)
- end
- end.
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn, CancelBtn, Poll, Pos) ->
- receive
- {gs, Scale, click, _, [NewPos | _]} ->
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, NewPos);
-
- {gs, NoPollBtn, click, _, _} ->
- gs:config(Lbl, [{fg, {255, 255, 255}}]),
- gs:config(Scale, [{fg, {255, 255, 255}}, {pos, 0}, {range, {20, 20}}]),
- receive
- {gs, Scale, click, _, _} ->
- done
- after 500 ->
- done
- end,
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, false, Pos);
-
- {gs, PollBtn, click, _, _} ->
- gs:config(Lbl, [{fg, {0, 0, 0}}]),
- gs:config(Scale, [{fg, {0, 0, 0}}, {pos, Pos}, {range, {20, 300}}]),
- receive
- {gs, Scale, click, _, _} ->
- done
- after 500 ->
- done
- end,
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, true, Pos);
-
- {gs, OkBtn, click, _, _} ->
- Pid ! {browser, self(), {Poll, Pos}};
-
- {gs, CancelBtn, click, _, _} ->
- Pid ! {browser, self(), cancel};
-
- {gs, _, destroy, _, _} ->
- Pid ! {browser, self(), cancel};
-
-
- {gs, Win, configure, _, _} ->
- gs:config(Win, [{width, ?WINDOW_WIDTH},
- {height, ?WINDOW_HEIGHT}
- ]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos);
-
-
- raise_and_beep ->
- gs:config(Win, [raise,
- beep]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos);
-
-
- {'EXIT', _Sender, _Reason} ->
- Pid ! {browser, self(), cancel};
-
-
- _Other ->
- io:format("Poll dialog received message ~w ~n", [_Other]),
- browser_loop(Pid, Win, NoPollBtn, PollBtn, Lbl, Scale, OkBtn,
- CancelBtn, Poll, Pos)
-
- end.
-
diff --git a/lib/tv/src/tv_pw.erl b/lib/tv/src/tv_pw.erl
deleted file mode 100644
index 5f88c9f1fd..0000000000
--- a/lib/tv/src/tv_pw.erl
+++ /dev/null
@@ -1,328 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Code for pw, the window controlling part of the table tool.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pw).
--compile([{nowarn_deprecated_function,{gs,config,2}}]).
-
-
-
--export([pw/1]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pw_int_def.hrl").
-
-
-
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: pw.
-%%
-%% Return Value: None.
-%%
-%% Description: Process controlling the graphical window, as well as the
-%% menubuttons.
-%%
-%% Parameters: None.
-%%======================================================================
-
-
-
-pw(Master) ->
- process_flag(trap_exit, true),
- ProcVars = #process_variables{master_pid = Master},
- blocked(ProcVars).
-
-
-
-
-
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-
-
-%%======================================================================
-%% Function: blocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When started or explicitly blocked, pw enters this state,
-%% where nothing is performed until the module explicitly is
-%% deblocked.
-%%
-%% Parameters:
-%%======================================================================
-
-
-blocked(ProcVars) ->
- receive
- Msg ->
- case Msg of
- #pw_deblock{} ->
- deblock(Msg, ProcVars);
- _Other ->
- blocked(ProcVars)
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function: deblocked.
-%%
-%% Return Value: None.
-%%
-%% Description: When deblocked, a window shall be created according to
-%% specification received in pw_deblock message.
-%%
-%% Parameters: Rec: received pw_deblock message.
-%%======================================================================
-
-
-
-deblock(Msg, ProcVars) ->
- #process_variables{window_params = WinP,
- menu_params = MenuP} = ProcVars,
-
- NewWinP = ?WIN_FUNC_FILE:create_window(Msg, WinP),
- NewMenuP = ?WIN_FUNC_FILE:create_menubar(NewWinP, MenuP),
-
- Sender = Msg#pw_deblock.sender,
- Sender ! #pw_deblock_cfm{sender = self(),
- win_id = NewWinP#window_params.window_id
- },
-
- NewProcVars = ProcVars#process_variables{window_params = NewWinP,
- menu_params = NewMenuP
- },
- deblocked_loop(NewProcVars).
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-deblocked_loop(ProcVars) ->
- receive
- Msg ->
- case Msg of
-
- {gs, Id, Event, Data, Args} ->
- NewProcVars = gs_messages({Id, Event, Data, Args}, ProcVars),
- deblocked_loop(NewProcVars);
-
- % Messages from pc!
- #pw_select_menu{menu=Menu} ->
- gs:config(Menu, [{select,true}]),
- deblocked_loop(ProcVars);
-
- #pw_create_menu{} ->
- NewProcVars = ?WIN_FUNC_FILE:create_menu(Msg, ProcVars),
- % Send confirmation...
- Sender = Msg#pw_create_menu.sender,
- Sender ! #pw_create_menu_cfm{sender = self()},
- deblocked_loop(NewProcVars);
-
- #pw_set_window_title{win_title = WinTitle} ->
- WinP = ProcVars#process_variables.window_params,
- gs:config(WinP#window_params.window_id, [{title, "[TV] " ++ WinTitle}]),
- NewWinP = WinP#window_params{window_title = WinTitle},
- NewProcVars = ProcVars#process_variables{window_params = NewWinP},
- deblocked_loop(NewProcVars);
-
- #pw_deblock{} ->
- deblock(Msg, ProcVars);
-
- % Exit signals!
- {'EXIT', Pid, Reason} ->
- MasterPid = ProcVars#process_variables.master_pid,
- exit_signals({Pid, Reason}, MasterPid),
- deblocked_loop(ProcVars);
-
- _Other ->
- deblocked_loop(ProcVars)
-
- end
- end.
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-exit_signals(Exit_info, MasterPid) ->
- case Exit_info of
- {MasterPid, _Reason} -> % When from master, just quit!
- exit(normal);
- _Other ->
- done
- end.
-
-
-
-
-
-
-
-
-
-
-%%======================================================================
-%% Function:
-%%
-%% Return Value:
-%%
-%% Description:
-%%
-%% Parameters:
-%%======================================================================
-
-
-gs_messages(Msg, ProcVars) ->
- MasterPid = ProcVars#process_variables.master_pid,
- case Msg of
-
- {_Id, click, Data, _Args} ->
- MasterPid ! #pc_menu_msg{sender = self(),
- data = Data},
- ProcVars;
-
- {_Win, keypress, _Data, [Key, _ , _, 1 | _T]} ->
- MenuP = ProcVars#process_variables.menu_params,
- ShortcutList = MenuP#menu_params.shortcuts,
- send_shortcut_data(Key, ShortcutList, MasterPid),
- ProcVars;
-
- Msg0 = {Win, configure, _, _} ->
- {Win, configure, _, [W, H | _T]} = flush_msgs(Msg0),
- WinP = ProcVars#process_variables.window_params,
- #window_params{window_id = WindowId,
- min_window_width = MinAllowedWidth,
- min_window_height = MinAllowedHeight} = WinP,
- FinalWidth = ?COMM_FUNC_FILE:max(W, MinAllowedWidth),
- FinalHeight = ?COMM_FUNC_FILE:max(H, MinAllowedHeight),
- ?WIN_FUNC_FILE:resize_window(WindowId, FinalWidth, FinalHeight),
- MasterPid ! #pc_win_conf{sender = self(),
- width = FinalWidth,
- height = FinalHeight},
- NewWinP = WinP#window_params{window_width = FinalWidth,
- window_height = FinalHeight
- },
- ProcVars#process_variables{window_params = NewWinP};
-
- {_Win, destroy, _Data, _Args} ->
- exit(normal);
-
- _Other ->
- ProcVars
- end.
-
-flush_msgs(Msg0 = {Win, Op, _, _}) ->
- receive {gs, Win,Op,D,P} ->
- flush_msgs({Win,Op,D,P})
- after 200 ->
- Msg0
- end.
-
-send_shortcut_data(_Key, [], _MasterPid) ->
- done;
-send_shortcut_data(Key, ShortcutList, MasterPid) ->
- case lists:keysearch(Key, 1, ShortcutList) of
- {value, {Key, Data}} ->
- MasterPid ! #pc_menu_msg{sender = self(),
- data = Data};
- false ->
- done
- end.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_pw_int_def.hrl b/lib/tv/src/tv_pw_int_def.hrl
deleted file mode 100644
index fabfbc2762..0000000000
--- a/lib/tv/src/tv_pw_int_def.hrl
+++ /dev/null
@@ -1,55 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Internal definitions for the pw part of the table tool.
-%%%
-%%%*********************************************************************
-
--define(WIN_FUNC_FILE, tv_pw_window).
-
-
-
--define(DEFAULT_WINDOW_WIDTH, 1000).
--define(DEFAULT_WINDOW_HEIGHT, 800).
--define(DEFAULT_MIN_WINDOW_WIDTH, 50).
--define(DEFAULT_MIN_WINDOW_HEIGHT, 50).
-
-
-
--record(window_params, {window_id,
- window_title,
- window_width,
- window_height,
- min_window_width,
- min_window_height
- }).
-
-
--record(menu_params, {menubar_id,
- shortcuts
- }).
-
-
-
-
-
--record(process_variables, {master_pid,
- window_params = #window_params{},
- menu_params = #menu_params{}
- }).
diff --git a/lib/tv/src/tv_pw_window.erl b/lib/tv/src/tv_pw_window.erl
deleted file mode 100644
index 81f29dc41c..0000000000
--- a/lib/tv/src/tv_pw_window.erl
+++ /dev/null
@@ -1,277 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1997-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
-%%%*********************************************************************
-%%%
-%%% Description: Part of the pw component controlling the graphics.
-%%%
-%%%*********************************************************************
-
-
--module(tv_pw_window).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,menuitem,3}},
- {nowarn_deprecated_function,{gs,start,0}}]).
-
-
-
--export([create_window/2,
- resize_window/3,
- create_menubar/2,
- create_menu/2]).
-
-
-
-
--include("tv_int_def.hrl").
--include("tv_int_msg.hrl").
--include("tv_pw_int_def.hrl").
-
-
-
--define(DEFAULT_BG_COLOR, {217, 217, 217}).
-
-
-
-
-%%%*********************************************************************
-%%% EXTERNAL FUNCTIONS
-%%%*********************************************************************
-
-
-
-
-%%======================================================================
-%% Function: create_menu.
-%%
-%% Return Value: Identifier to the menu created.
-%%
-%% Description: Creates a menu in the window.
-%%
-%% Parameters: Win: ID of parent window.
-%%======================================================================
-
-
-create_menu(Msg, ProcVars) ->
- MenuP = ProcVars#process_variables.menu_params,
- MenubarId = MenuP#menu_params.menubar_id,
- ShortcutList = MenuP#menu_params.shortcuts,
-
- #pw_create_menu{menutitle = MenuTitle,
- title_acc_pos = TitleAccPos,
- menulist = MenuList} = Msg,
-
- % Create the menubutton!
- Label = def_or_param(MenuTitle, "NoName"),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- % {font, {helvetica, bold, 14}},
- {label, {text, Label}},
- {underline, TitleAccPos}
- ]),
-
- % Create the actual menu!
- Menu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}
- ]),
-
- NewMenuP = MenuP#menu_params{shortcuts = ShortcutList ++ create_menulist(MenuList, Menu)},
-
- ProcVars#process_variables{menu_params = NewMenuP}.
-
-
-
-
-
-
-
-create_menubar(WinP, MenuP) ->
- WindowId = WinP#window_params.window_id,
- MenubarId = gs:create(menubar, WindowId, [{bg, ?DEFAULT_BG_COLOR}
- ]),
- Mbutt = gs:create(menubutton, MenubarId, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}, % firebrick
- % {font, {helvetica, bold, 14}},
- {label, {text, " Help "}},
- {underline, 1},
- {side, right}
- ]),
-
- % Create the actual menu!
- Menu = gs:create(menu, Mbutt, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}}
- ]),
- MenuP#menu_params{menubar_id = MenubarId,
- shortcuts = create_menulist([{" Help ", normal, help_button, 1, h},
- separator,
- {" OTP Documentation ",normal,otp_help_button,1,no_char}],
- Menu) ++ [{x,exit_button}, {'X',exit_button}]
- }.
-
-
-
-
-
-create_window(Msg, WinP) ->
- #pw_deblock{win_title = Title,
- win_width = Width,
- win_height = Height,
- min_win_width = MinWidth} = Msg,
-
-
- S = gs:start(),
- WindowTitle = def_or_param(Title, "NoName"),
- WindowMinWidth = def_or_param(MinWidth, ?DEFAULT_MIN_WINDOW_WIDTH),
- WindowMinHeight = def_or_param(MinWidth, ?DEFAULT_MIN_WINDOW_HEIGHT),
- WindowWidth = ?COMM_FUNC_FILE:max(def_or_param(Width,
- ?DEFAULT_WINDOW_WIDTH),
- WindowMinWidth),
- WindowHeight = ?COMM_FUNC_FILE:max(def_or_param(Height,
- ?DEFAULT_WINDOW_HEIGHT),
- WindowMinHeight),
-
-
- WindowId = gs:create(window, S, [{title, WindowTitle},
- {width, WindowWidth},
- {height, WindowHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {keypress, true},
- {cursor, arrow}
- ]),
-
- WinP#window_params{window_id = WindowId,
- window_title = WindowTitle,
- window_width = WindowWidth,
- window_height = WindowHeight,
- min_window_width = WindowMinWidth,
- min_window_height = WindowMinHeight
- }.
-
-
-
-
-
-
-
-resize_window(WindowId, NewWidth, NewHeight) ->
- gs:config(WindowId, [{width, NewWidth},
- {height, NewHeight}
- ]).
-
-
-
-
-%%%********************************************************************
-%%% INTERNAL FUNCTIONS
-%%%********************************************************************
-
-
-
-create_menulist([], _Menu) ->
- [];
-create_menulist(List, Menu) ->
- MaxLength = get_length_of_longest_menu_text(List, 0),
- create_menulist(List, Menu, MaxLength).
-
-
-
-
-create_menulist([], _Menu, _MaxLength) ->
- [];
-create_menulist([{Text, Type, Data, AccCharPos, ShortcutChar} | Rest], Menu, MaxLength) ->
- ShortcutCapitalChar =
- if
- ShortcutChar =:= no_char ->
- no_char;
- true ->
- CharAsciiValue = lists:nth(1, atom_to_list(ShortcutChar)),
- CapitalCharValue = CharAsciiValue - ($a - $A),
- list_to_atom([CapitalCharValue])
- end,
-
- FinalText = if
- ShortcutChar =:= no_char ->
- Text;
- true ->
- Text ++ lists:duplicate(MaxLength - length(Text), " ") ++
- " Ctrl+" ++ atom_to_list(ShortcutCapitalChar) ++ " "
- end,
- TypeAndSel =
- case Type of
- normal ->
- [{itemtype, normal}];
- {radio, Selected, Group} ->
- [{itemtype, radio},
- {select, Selected},
- {group, Group}];
- {check, Selected} ->
- [{itemtype, check},
- {select, Selected}]
- end,
- gs:menuitem(Data, Menu, [{bg, ?DEFAULT_BG_COLOR},
- {fg, {178, 34, 34}},
- {label, {text, FinalText}},
- {underline, AccCharPos},
- {data, Data} |
- TypeAndSel
- ]),
- [{ShortcutChar, Data}, {ShortcutCapitalChar, Data} | create_menulist(Rest, Menu, MaxLength)];
-create_menulist([separator | Rest], Menu, MaxLength) ->
- gs:create(menuitem, Menu, [{itemtype, separator}
- ]),
- create_menulist(Rest, Menu, MaxLength).
-
-
-
-
-
-
-
-get_length_of_longest_menu_text([], MaxLength) ->
- MaxLength;
-get_length_of_longest_menu_text([{Text, _Type, _Data, _APos, _SChar} | Rest], CurrMax) ->
- L = length(Text),
- if
- L > CurrMax ->
- get_length_of_longest_menu_text(Rest, L);
- true ->
- get_length_of_longest_menu_text(Rest, CurrMax)
- end;
-get_length_of_longest_menu_text([separator | Rest], CurrMax) ->
- get_length_of_longest_menu_text(Rest, CurrMax).
-
-
-
-
-
-def_or_param(undefined, DefaultValue) ->
- DefaultValue;
-def_or_param(Param, _Default) ->
- Param.
-
-
-
-
-
-
-
-
-
-
diff --git a/lib/tv/src/tv_rec_edit.erl b/lib/tv/src/tv_rec_edit.erl
deleted file mode 100644
index 3f9ea8b5f5..0000000000
--- a/lib/tv/src/tv_rec_edit.erl
+++ /dev/null
@@ -1,754 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_rec_edit).
--compile([{nowarn_deprecated_function,{gs,button,2}},
- {nowarn_deprecated_function,{gs,button,3}},
- {nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,entry,3}},
- {nowarn_deprecated_function,{gs,frame,2}},
- {nowarn_deprecated_function,{gs,frame,3}},
- {nowarn_deprecated_function,{gs,label,2}},
- {nowarn_deprecated_function,{gs,read,2}},
- {nowarn_deprecated_function,{gs,start,0}},
- {nowarn_deprecated_function,{gs,window,3}}]).
-
-
-
--export([start/5,
- start/6,
- init/8
- ]).
-
-
--include("tv_int_def.hrl").
-
-
-
--define(DEFAULT_BG_COLOR, {217,217,217}).
-
--define(WIN_WIDTH, 375).
--define(WIN_HEIGHT, 341).
--define(ETS_WIN_HEIGHT, 154).
-
--define(FRAME_WIDTH, 375).
--define(FRAME_HEIGHT, 265).
--define(ETS_FRAME_HEIGHT, 74).
-
--define(MAX_LABEL_WIDTH, 165).
--define(X0, 15).
--define(Y0, 20).
--define(LABEL_HEIGHT, 30).
--define(ENTRY_HEIGHT, 30).
--define(FONT, {screen,12}).
--define(NEXT_BTN_WIDTH, 57).
--define(NEXT_BTN_HEIGHT, 22).
--define(NEXT_BTN_FG, {178,34,34}).
--define(INSERT_BTN_WIDTH, 80).
--define(INSERT_BTN_HEIGHT, 30).
--define(INSERT_BTN_DIST_BETWEEN, 23).
--define(INSERT_BTN_DIST_FROM_BOTTOM, 23).
-
-
-
-
-
-start(TableType, TableName, AttributeList, ListsAsStr, ErrMsgMode) ->
- AttributeValues = lists:duplicate(length(AttributeList), undefined),
- spawn_link(?MODULE, init, [TableType, TableName, AttributeList,
- AttributeValues, ListsAsStr, ErrMsgMode, self(), true]).
-
-
-
-start(TableType, TableName, AttributeList, AttributeValues, ListsAsStr, ErrMsgMode) ->
- spawn_link(?MODULE, init, [TableType, TableName, AttributeList,
- AttributeValues, ListsAsStr, ErrMsgMode, self(), false]).
-
-
-
-
-init(TableType,TableName,AttributeList,AttributeValues,ListsAsStr,ErrMsgMode,MasterPid,Insert) ->
- process_flag(trap_exit, true),
- put(error_msg_mode, ErrMsgMode),
- Frames = create_window(TableType, TableName, AttributeList, AttributeValues,
- ListsAsStr, Insert),
- loop(TableType, TableName, Frames, AttributeList, AttributeValues, MasterPid, ListsAsStr).
-
-
-
-
-
-loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr) ->
- receive
-
- {gs, insert, click, Insert, _Args} ->
- gs:config(win, [{cursor, busy}]),
- case get_record(TabType, TabName, AttrList, AttrList, Frames) of
- {ok, NewRec} ->
- case Insert of
- insert ->
- MPid ! {new_object, NewRec};
- change ->
- MPid ! {updated_object, NewRec}
- end;
- error ->
- done
- end,
- gs:config(win, [{cursor, arrow}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, cancel, click, _Data, _Args} ->
- exit(normal);
-
-
- {gs, reset, click, _Data, _Args} ->
- gs:config(win, [{cursor, busy}]),
- set_entry_values(TabType, AttrList, AttrVals, ListsAsStr),
- gs:config(win, [{cursor, arrow}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 0 | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, forward),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Down' | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, forward),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Tab', _No, 1 | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, backward),
- gs:config(NextFrame, [raise]),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, EntryId, keypress, _Data, ['Up' | _T]} ->
- {_Term, {NextEntry, NextFrame}} =
- check_entry_content(EntryId, AttrList, Frames, backward),
- gs:config(NextFrame, [raise]),
- case NextEntry of
- EntryId ->
- gs:config(NextEntry, [{setfocus, true}]);
- _OtherId ->
- gs:config(NextFrame, [raise]),
- gs:config(NextEntry, [{setfocus, true},
- {select, {0,100000000}}])
- end,
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, Id, keypress, _Data, ['Return' | _T]} ->
- OldCursor = gs:read(Id, cursor),
- gs:config(Id, [{cursor, busy}]),
- gs:config(win, [{cursor, busy}]),
- Insert = gs:read(insert, data),
- case get_record(TabType, TabName, AttrList, AttrList, Frames) of
- {ok, NewRec} ->
- case Insert of
- insert ->
- MPid ! {new_object, NewRec};
- change ->
- MPid ! {updated_object, NewRec}
- end;
- error ->
- done
- end,
- gs:config(win, [{cursor, arrow}]),
- gs:config(Id, [{cursor, OldCursor}]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
-
- {gs, _Id, click, FrameNo, _Args} ->
- gs:config(lists:nth(FrameNo, Frames), [raise]),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, win, configure, _Data, [Width | _T]} ->
- resize_window(TabType, lists:max([Width, ?WIN_WIDTH]), Frames, AttrList),
- loop(TabType, TabName, Frames, AttrList, AttrVals, MPid, ListsAsStr);
-
-
- {gs, win, destroy, _Data, _Args} ->
- exit(normal);
-
-
- insert_mode ->
- NewAttrVals = lists:duplicate(length(AttrList), undefined),
- set_entry_values(TabType, AttrList, NewAttrVals, ListsAsStr),
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- {update_mode, Obj} ->
- NewAttrVals =
- case TabType of
- mnesia ->
- case Obj of
- undefined ->
- lists:duplicate(length(AttrList), undefined);
- _AnyRec ->
- tl(tuple_to_list(Obj))
- end;
- ets ->
- [Obj]
- end,
- set_entry_values(TabType, AttrList, NewAttrVals, ListsAsStr),
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- {reset_info, Obj} ->
- %% Info to use, instead of old info, when reset button is pressed.
- NewAttrVals =
- case TabType of
- mnesia ->
- case Obj of
- undefined ->
- lists:duplicate(length(AttrList), undefined);
- _AnyRec ->
- tl(tuple_to_list(Obj))
- end;
- ets ->
- [Obj]
- end,
- loop(TabType, TabName, Frames, AttrList, NewAttrVals, MPid, ListsAsStr);
-
-
- raise ->
- gs:config(win, [raise]),
- loop(TabType, TabName, Frames, AttrList,AttrVals, MPid, ListsAsStr);
-
-
- {'EXIT', _Pid, _Reason} ->
- exit(normal);
-
-
- _Other ->
- loop(TabType, TabName, Frames, AttrList,AttrVals, MPid, ListsAsStr)
- end.
-
-
-
-
-resize_window(TabType, WinWidth, Frames, AttrList) ->
- WinHeight =
- case TabType of
- mnesia ->
- get_window_height(length(AttrList));
- ets ->
- ?ETS_WIN_HEIGHT
- end,
- gs:config(win, [{width, WinWidth},
- {height, WinHeight}
- ]),
- FrameWidth = WinWidth,
- LblL = lists:map(fun(H) ->
- gs:config(H, [{width, FrameWidth}]),
- {LblW, BId, NId} = gs:read(H, data),
- XNext = get_next_btn_xpos(FrameWidth),
- XBack = XNext - ?NEXT_BTN_WIDTH,
- gs:config(BId, [{x, XBack}]),
- gs:config(NId, [{x, XNext}]),
- LblW
- end,
- Frames),
- LblW = hd(LblL),
- EntryW = get_entry_width(TabType, FrameWidth, LblW),
- lists:foreach(fun(H) ->
- gs:config(H, [{width, EntryW}])
- end,
- AttrList),
- gs:config(btnframe, [{width, FrameWidth}]),
- {XInsert, XCancel, XReset} = get_insert_btn_coords(WinWidth),
- gs:config(insert, [{x, XInsert}]),
- gs:config(cancel, [{x, XCancel}]),
- gs:config(reset, [{x, XReset}]).
-
-
-
-
-check_entry_content(EntryId, AttributeList, Frames, Direction) ->
- EditedStr = gs:read(EntryId, text),
- case tv_db_search:string_to_term(EditedStr) of
- {error, {_Reason, Msg}} ->
- gs:config(EntryId, [beep]),
- tv_utils:notify(gs:start(), "TV Notification", Msg),
- {error, {EntryId, no_matter}};
- {ok, NewTerm} ->
- {{ok,NewTerm}, get_next_entry_id(EntryId, AttributeList, Frames, Direction)}
- end.
-
-
-
-
-get_next_entry_id(EntryId, AttributeList, Frames, Direction) ->
- OldPos = get_pos(EntryId, AttributeList),
- MaxPos = length(AttributeList),
- NewPos = case Direction of
- forward when OldPos < MaxPos ->
- OldPos + 1;
- forward ->
- 1;
- backward when OldPos > 1 ->
- OldPos - 1;
- backward ->
- MaxPos;
- stationary ->
- OldPos
- end,
- FramePos = get_next_frame_id(NewPos),
- {lists:nth(NewPos, AttributeList), lists:nth(FramePos, Frames)}.
-
-
-
-
-get_next_frame_id(Pos) ->
- case Pos rem 5 of
- 0 ->
- Pos div 5;
- _Other ->
- (Pos div 5) + 1
- end.
-
-
-
-
-get_record(TabType, TabName, AttrList, AttrList, Frames) ->
- case get_record(AttrList, AttrList, Frames, []) of
- {ok, RecList} ->
- case TabType of
- mnesia ->
- NewRecList = [TabName | RecList],
- {ok, list_to_tuple(NewRecList)};
- ets ->
- {ok, hd(RecList)} %% Only one element, a tuple!
- end;
- error ->
- error
- end.
-
-
-
-
-get_record([H | T], AttrList, Frames, Acc) ->
- case check_entry_content(H, AttrList, Frames, forward) of
- {{ok, NewTerm}, _PosTuple} ->
- get_record(T, AttrList, Frames, [NewTerm | Acc]);
- {error, _PosTuple} ->
- {EntryId, FrameId} = get_next_entry_id(H, AttrList, Frames, stationary),
- gs:config(FrameId, [raise]),
- gs:config(EntryId, [{setfocus, true}]),
- error
- end;
-get_record([], _AttrList, _Frames, Acc) ->
- {ok, lists:reverse(Acc)}.
-
-
-
-
-
-
-get_pos(Elem, L) ->
- get_pos(Elem, L, 1).
-
-
-get_pos(Elem, [Elem | _T], N) ->
- N;
-get_pos(Elem, [_H | T], N) ->
- get_pos(Elem, T, N + 1).
-
-
-
-
-create_window(mnesia, TableName, AttrList, AttrValues, ListsAsStr, Insert) ->
- NofAttr = length(AttrList),
- NofFrames =
- case NofAttr rem 5 of
- 0 ->
- NofAttr div 5;
- _Rem ->
- (NofAttr div 5) + 1
- end,
-
- WinHeight = get_window_height(NofAttr),
- FrameHeight = get_frame_height(NofAttr),
-
- Attr = get_longest_attribute_name(AttrList),
- LabelWidth = lists:min([?MAX_LABEL_WIDTH,
- element(1, gs:read(gs:start(),
- {font_wh, {?FONT, atom_to_list(Attr)}}))]),
-
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, WinHeight},
- {title, "[TV] Record Editor: '" ++
- atom_to_list(TableName) ++ "'"},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- create_insert_and_cancel_btns(Insert, WinHeight, FrameHeight),
- FrameList = create_frames(NofFrames, LabelWidth, AttrList, AttrValues, NofFrames,
- ListsAsStr, FrameHeight),
- gs:config(hd(FrameList), [raise]),
- gs:config(hd(AttrList), [{setfocus, true},
- {select, {0,100000000}}]),
- gs:config(win, [{map,true}]),
- FrameList;
-create_window(ets, TableName, [Attr], [AttrVal], ListsAsStr, Insert) ->
- gs:window(win, gs:start(), [{width, ?WIN_WIDTH},
- {height, ?ETS_WIN_HEIGHT},
- {title, "[TV] Tuple Editor, table '" ++
- atom_to_list(TableName) ++ "'"},
- {bg, ?DEFAULT_BG_COLOR},
- {configure, true},
- {destroy, true},
- {cursor, arrow}
- ]),
-
- F = gs:frame(win, [{width, ?FRAME_WIDTH},
- {height, ?ETS_FRAME_HEIGHT},
- {x, 0},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2},
- {data, {0, undefined, undefined}}
- ]),
-
- create_insert_and_cancel_btns(Insert, ?ETS_WIN_HEIGHT, ?ETS_FRAME_HEIGHT),
-
- EntryW = get_entry_width(ets, ?FRAME_WIDTH, 0),
- EntryX = ?X0 - 2,
-
- EntryText =
- case AttrVal of
- undefined ->
- "";
- _OtherVal ->
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [AttrVal]);
- false ->
- lists:flatten(io_lib:write(AttrVal))
- end
- end,
- gs:entry(Attr, F, [{width, EntryW},
- {height, ?LABEL_HEIGHT},
- {x, EntryX},
- {y, ?Y0},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font, ?FONT},
- {justify, left},
- {text, EntryText},
- {cursor, text},
- {setfocus, true},
- {enable, true},
- {keypress,true},
- {select, {0,100000000}}
- ]),
- gs:config(win, [{map,true}]),
- [F].
-
-
-
-
-get_insert_btn_coords(WinWidth) ->
- Middle = round(WinWidth / 2),
- XInsert = Middle - round(1.5 * ?INSERT_BTN_WIDTH) - ?INSERT_BTN_DIST_BETWEEN,
- XCancel = Middle - round(0.5 * ?INSERT_BTN_WIDTH),
- XReset = Middle + round(0.5 * ?INSERT_BTN_WIDTH) + ?INSERT_BTN_DIST_BETWEEN,
- {XInsert, XCancel, XReset}.
-
-
-
-
-create_insert_and_cancel_btns(Insert, WinHeight, FrameHeight) ->
- LowerFrameHeight = WinHeight - FrameHeight,
- Y = ?INSERT_BTN_DIST_FROM_BOTTOM,
- {XInsert, XCancel, XReset} = get_insert_btn_coords(?WIN_WIDTH),
-
- {InsertBtnText, InsertBtnData} =
- case Insert of
- true ->
- {"Insert", insert};
- false ->
- {"Change", change}
- end,
-
- gs:frame(btnframe, win, [{width, ?FRAME_WIDTH},
- {height, LowerFrameHeight},
- {x, 0},
- {y, FrameHeight},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2}
- ]),
- gs:button(insert, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XInsert},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, InsertBtnText}},
- {align, center},
- {data, InsertBtnData}
- ]),
- gs:button(cancel, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XCancel},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, "Cancel"}},
- {align, center}
- ]),
- gs:button(reset, btnframe, [{width, ?INSERT_BTN_WIDTH},
- {height, ?INSERT_BTN_HEIGHT},
- {x, XReset},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {font, ?FONT},
- {label, {text, "Reset"}},
- {align, center}
- ]).
-
-
-
-
-
-create_frames(0, _LblW, _AttrList, _AttrValues, _NofFrames, _ListsAsStr, _FrameHeight) ->
- [];
-create_frames(N, LblW, AttrList, AttrValues, NofFrames, ListsAsStr, FrameHeight) ->
- F = gs:frame(win, [{width, ?FRAME_WIDTH},
- {height, FrameHeight},
- {x, 0},
- {y, 0},
- {bg, ?DEFAULT_BG_COLOR},
- {bw,2}
- ]),
- {BId, NId} = create_back_and_next_btns(F, 5, N, NofFrames),
- gs:config(F, [{data, {LblW, BId, NId}}]),
- {RemAttrList, RemAttrValues} =
- create_labels_and_entries(5, AttrList, AttrValues, LblW, F, ListsAsStr),
- [F | create_frames(N - 1,LblW,RemAttrList,RemAttrValues,NofFrames,ListsAsStr,FrameHeight)].
-
-
-
-
-
-
-create_back_and_next_btns(FrameId, NofEntries, FrameNo, NofFrames) ->
- Y = ?Y0 + NofEntries * (?LABEL_HEIGHT + 10) + 8,
- XNext = get_next_btn_xpos(?FRAME_WIDTH),
- XBack = XNext - ?NEXT_BTN_WIDTH,
- DataNext = (NofFrames - FrameNo + 1) + 1,
- DataBack = (NofFrames - FrameNo + 1) - 1,
- BId =
- if
- DataBack =< 0 ->
- undefined;
- true ->
- gs:button(FrameId, [{width, ?NEXT_BTN_WIDTH},
- {height, ?NEXT_BTN_HEIGHT},
- {x, XBack},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NEXT_BTN_FG},
- {font, ?FONT},
- {align, center},
- {label, {text, "< Back"}},
- %% {underline, 2},
- {data, DataBack}
- ])
- end,
- NId =
- if
- DataNext > NofFrames ->
- undefined;
- true ->
- gs:button(FrameId, [{width, ?NEXT_BTN_WIDTH},
- {height, ?NEXT_BTN_HEIGHT},
- {x, XNext},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, ?NEXT_BTN_FG},
- {font, ?FONT},
- {align, center},
- {label, {text, " Next >"}},
- %% {underline, 1},
- {data, DataNext}
- ])
- end,
- {BId, NId}.
-
-
-
-
-get_next_btn_xpos(FrameWidth) ->
- FrameWidth - ?X0 - ?NEXT_BTN_WIDTH.
-
-
-
-get_entry_width(TableType, FrameWidth, LblWidth) ->
- HorizontalSpacing =
- case TableType of
- mnesia ->
- 10;
- ets ->
- 0
- end,
- FrameWidth - LblWidth - 2 * ?X0 - HorizontalSpacing.
-
-
-
-create_labels_and_entries(N, [H | T], [VH | VT], LblW, F, ListsAsStr) when N > 0 ->
- Y = ?Y0 + (5 - N) * (?LABEL_HEIGHT + 10),
- EntryW = get_entry_width(mnesia, ?FRAME_WIDTH, LblW),
- EntryX = ?FRAME_WIDTH - EntryW - ?X0 - 2,
-
- EntryText =
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [VH]);
- false ->
- lists:flatten(io_lib:write(VH))
- end,
- gs:label(F, [{width, LblW},
- {height, ?LABEL_HEIGHT},
- {x, ?X0},
- {y, Y},
- {bg, ?DEFAULT_BG_COLOR},
- {fg, {0,0,0}},
- {align,w},
- {font, ?FONT},
- {label, {text, atom_to_list(H)}}
- ]),
- gs:entry(H, F, [{width, EntryW},
- {height, ?LABEL_HEIGHT},
- {x, EntryX},
- {y, Y},
- {bg, {255,255,255}},
- {fg, {0,0,0}},
- {bw, 1},
- {font, ?FONT},
- {justify, left},
- {text, EntryText},
- {cursor, text},
- {setfocus, false},
- {enable, true},
- {keypress,true}
- ]),
- create_labels_and_entries(N - 1, T, VT, LblW, F, ListsAsStr);
-create_labels_and_entries(0, RemAttrList, RemAttrValues, _LblW, _F, _ListsAsStr) ->
- {RemAttrList, RemAttrValues};
-create_labels_and_entries(_N, [], [], _LblW, _F, _ListsAsStr) ->
- {[], []}.
-
-
-
-
-get_longest_attribute_name(AttrList) ->
- get_longest_attribute_name(AttrList, 0, undefined).
-
-
-get_longest_attribute_name([H | T], Max, Attr) ->
- CurrLength = length(atom_to_list(H)),
- if
- CurrLength >= Max ->
- get_longest_attribute_name(T, CurrLength, H);
- true ->
- get_longest_attribute_name(T, Max, Attr)
- end;
-get_longest_attribute_name([], _Max, Attr) ->
- Attr.
-
-
-
-
-get_window_height(N) ->
- if
- N >= 5 ->
- ?WIN_HEIGHT;
- true ->
- ?WIN_HEIGHT - ((5 - N) * (?LABEL_HEIGHT + 10) + ?NEXT_BTN_HEIGHT + 8)
- end.
-
-
-
-get_frame_height(N) ->
- if
- N >= 5 ->
- ?FRAME_HEIGHT;
- true ->
- ?FRAME_HEIGHT - ((5 - N) * (?LABEL_HEIGHT + 10) + ?NEXT_BTN_HEIGHT + 8)
- end.
-
-
-
-
-set_entry_values(TabType, [H | T], [VH | VT], ListsAsStr) ->
- EntryText =
- case VH of
- undefined when TabType =:= ets ->
- "";
- _AnyValue ->
- case ListsAsStr of
- true ->
- tv_io_lib:format("~p", [VH]);
- false ->
- lists:flatten(io_lib:write(VH))
- end
- end,
- gs:config(H, [{text, EntryText}]),
- set_entry_values(TabType, T, VT, ListsAsStr);
-set_entry_values(_TabType, [], [], _ListsAsStr) ->
- done.
diff --git a/lib/tv/src/tv_table_owner.erl b/lib/tv/src/tv_table_owner.erl
deleted file mode 100644
index bccac6c236..0000000000
--- a/lib/tv/src/tv_table_owner.erl
+++ /dev/null
@@ -1,122 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2009. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_table_owner).
-
-
-
--export([create/5
- ]).
-
-
--export([internal_create/3,
- start/0,
- init/0
- ]).
-
-
-
--define(REGISTERED_NAME, tv_table_owner).
-
-
-
-create(mnesia, _Node, _LocalNode, _TableName, _Options) ->
- error;
-create(ets, _Node, true, TabName, Options) ->
- case catch internal_create(ets, TabName, Options) of
- {TabName, Pid} when is_pid(Pid) ->
- {ok, {TabName,Pid}};
- {TabNo, Pid} when is_pid(Pid) ->
- {ok, {TabNo,Pid}};
- _OtherResult ->
- error
- end;
-create(ets, Node, false, TabName, Options) ->
- case catch rpc:block_call(Node, ?MODULE, internal_create, [ets, TabName, Options]) of
- {TabName, Pid} when is_pid(Pid) ->
- {ok, {TabName,Pid}};
- {TabNo, Pid} when is_pid(Pid) ->
- {ok, {TabNo,Pid}};
- _OtherResult ->
- error
- end.
-
-
-
-
-
-internal_create(ets, TabName, Options) ->
- ?MODULE:start(),
- ?REGISTERED_NAME ! {create, self(), ets, TabName, Options},
- receive
- {?REGISTERED_NAME, Result} ->
- Result
- after
- 5000 ->
- error
- end.
-
-
-
-
-
-
-start() ->
- case whereis(?REGISTERED_NAME) of
- undefined ->
- ServerPid = spawn(?MODULE, init, []),
- case catch register(?REGISTERED_NAME, ServerPid) of
- true ->
- ok;
- {'EXIT', _Reason} ->
- exit(ServerPid, kill),
- timer:sleep(500),
- start()
- end;
- Pid when is_pid(Pid) ->
- ok
- end.
-
-
-
-
-
-
-
-
-init() ->
- %% Currently no initialisations!
- loop().
-
-
-
-
-
-
-loop() ->
- receive
-
- {create, Sender, ets, TabName, Options} ->
- Sender ! {?REGISTERED_NAME, (catch ets:new(TabName, Options))},
- loop();
-
-
- _Other ->
- loop()
-
- end.
-
diff --git a/lib/tv/src/tv_utils.erl b/lib/tv/src/tv_utils.erl
deleted file mode 100644
index 799e3994cb..0000000000
--- a/lib/tv/src/tv_utils.erl
+++ /dev/null
@@ -1,179 +0,0 @@
-%%
-%% %CopyrightBegin%
-%%
-%% Copyright Ericsson AB 1998-2012. All Rights Reserved.
-%%
-%% The contents of this file are subject to the Erlang Public License,
-%% Version 1.1, (the "License"); you may not use this file except in
-%% compliance with the License. You should have received a copy of the
-%% Erlang Public License along with this software. If not, it can be
-%% retrieved online at http://www.erlang.org/.
-%%
-%% Software distributed under the License is distributed on an "AS IS"
-%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
-%% the License for the specific language governing rights and limitations
-%% under the License.
-%%
-%% %CopyrightEnd%
--module(tv_utils).
--compile([{nowarn_deprecated_function,{gs,config,2}},
- {nowarn_deprecated_function,{gs,create,3}},
- {nowarn_deprecated_function,{gs,destroy,1}}]).
-
-
-
--export([notify/3]).
-
-
-
- %% Minimum size of help windows
--define(wwin, 300).
--define(hwin, 180).
-
- %% Button sizes
--define(wbut, 60).
--define(hbut, 30).
-
--define(pad, 10).
-
-
-%----------------------------------------
-% notify(S,Strings) -> ok
-% S = pid() GS
-% Strings = string() | [string()]
-% A notification window contains a message to the user.
-% Will lock the GUI until the user confirms the message by
-% pressing the 'Ok' button.
-%----------------------------------------
-notify(S,Title,Strings) ->
- W = required_width(Strings, ?wwin),
- Htop = round(2 * ?hwin / 3),
- Hbot = ?hwin - Htop,
-
- %% Open a new window
- Win = gs:create(window,S,[{width, W},
- {height, ?hwin},
- {title, Title},
- {data, notifywin}
- ]),
-
- %% Top frame containing a label
- Top = gs:create(frame,Win,[{width, W},
- {height, Htop},
- {x, 0},
- {y, 0},
- {data, notifywin},
- {keypress, true}
- ]),
-
- Lbl = gs:create(label,Top,[{width,W},
- {height, Htop - 2 * ?pad},
- {x, 0},
- {y, ?pad},
- {align, c},
- {justify, center},
- {data, notifywin},
- {keypress, true}
- ]),
-
- gs:config(Lbl, {label, {text, insert_newlines(Strings)}}),
-
- %% Bottom frame containing an 'Ok' button
- Bot = gs:create(frame,Win,[{width, W},
- {height, Hbot},
- {x, 0},
- {y, Htop}
- ]),
- gs:create(button,Bot,[{width, ?wbut},
- {height, ?hbut},
- {x, W / 2 - ?wbut/2},
- {y, Hbot / 2 - ?hbut / 2},
- {label, {text, "OK"}},
- {data, notifywin},
- {keypress, true}]),
-
- gs:config(Win, [{map,true}]),
-
- event_loop(Win,null).
-
-
-
-
-insert_newlines([String|Rest]) when is_list(String), Rest=/=[]->
- String ++ "\n" ++ insert_newlines(Rest);
-insert_newlines([Last]) ->
- [Last];
-insert_newlines(Other) ->
- Other.
-
-
-
-
-event_loop(Win,Entry) ->
- receive
-
- %%
- %% Notify window
- %%
-
- %% 'Ok' pressed in notify window
- {gs,_Obj,_Event,notifywin,["OK"|_]} ->
- gs:destroy(Win),
- ok;
-
- %% 'Window manager destroy' received in notify window
- {gs,_Obj,destroy,notifywin,_} ->
- gs:destroy(Win),
- ok;
-
- %% 'Return' pressed in notify or confirm window
- {gs,_Obj,_Event,helpwin,['Return'|_]} ->
- gs:destroy(Win),
- ok;
-
-
- %%
- %% Common or partly common events
- %%
-
- %% 'Window manager destroy' received in notify,
- %% confirm,confirm_exit or request window
- {gs,_Obj,destroy,_,_} ->
- gs:destroy(Win),
- cancel;
-
- %% Flush any other GS events
- {gs,_Obj,_Event,_Data,_Arg} ->
- event_loop(Win,Entry)
- end.
-
-
-
-
-%----------------------------------------
-% required_width(Strings,Min) -> Req
-% Strings = string() | [string()]
-% Min = Req = integer()
-% Returns the minimum required width in pixels for a help window,
-% which is the maximum of Min and the required width for Strings.
-% NOTE: Font dependant really!
-%----------------------------------------
-required_width([First|Rest],Min) when is_list(First) ->
- Req = 7*length(First), % 7 pixels per character
- if
- Req>Min ->
- required_width(Rest,Req);
- true ->
- required_width(Rest,Min)
- end;
-required_width([],Min) ->
- Min;
-required_width(String,Min) ->
- Req = 7*length(String),
- if
- Req>Min ->
- Req;
- true ->
- Min
- end.
-
diff --git a/lib/tv/vsn.mk b/lib/tv/vsn.mk
deleted file mode 100644
index 59d124a3b7..0000000000
--- a/lib/tv/vsn.mk
+++ /dev/null
@@ -1 +0,0 @@
-TV_VSN = 2.1.4.10
diff --git a/lib/wx/api_gen/gen_util.erl b/lib/wx/api_gen/gen_util.erl
index 2ba1c6e16f..9b08815bf7 100644
--- a/lib/wx/api_gen/gen_util.erl
+++ b/lib/wx/api_gen/gen_util.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -222,11 +222,12 @@ halt(Reason) ->
erl_copyright() ->
StartYear = start_year(get(current_class)),
+ {CurrentYear,_,_} = erlang:date(),
w("%%~n",[]),
w("%% %CopyrightBegin%~n",[]),
w("%%~n",[]),
- w("%% Copyright Ericsson AB ~p-2013. All Rights Reserved.~n",
- [StartYear]),
+ w("%% Copyright Ericsson AB ~p-~p. All Rights Reserved.~n",
+ [StartYear, CurrentYear]),
w("%%~n",[]),
w("%% The contents of this file are subject to the Erlang Public License,~n",[]),
w("%% Version 1.1, (the \"License\"); you may not use this file except in~n",[]),
@@ -242,10 +243,11 @@ erl_copyright() ->
w("%% %CopyrightEnd%~n",[]).
c_copyright() ->
+ {CurrentYear,_,_} = erlang:date(),
w("/*~n",[]),
w(" * %CopyrightBegin%~n",[]),
w(" *~n",[]),
- w(" * Copyright Ericsson AB 2008-2013. All Rights Reserved.~n",[]),
+ w(" * Copyright Ericsson AB 2008-~p. All Rights Reserved.~n",[CurrentYear]),
w(" *~n",[]),
w(" * The contents of this file are subject to the Erlang Public License,~n",[]),
w(" * Version 1.1, (the \"License\"); you may not use this file except in~n",[]),
diff --git a/lib/wx/api_gen/wx_gen_cpp.erl b/lib/wx/api_gen/wx_gen_cpp.erl
index 7e35ebfa83..5ac57e4929 100644
--- a/lib/wx/api_gen/wx_gen_cpp.erl
+++ b/lib/wx/api_gen/wx_gen_cpp.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -190,10 +190,14 @@ gen_funcs(Defs) ->
%% w(" case WXE_REMOVE_PORT:~n", []),
%% w(" { destroyMemEnv(Ecmd.port); } break;~n", []),
w(" case DESTROY_OBJECT: {~n"),
- w(" wxObject *This = (wxObject *) getPtr(bp,memenv); "),
- w(" if(This) {"),
- w(" ((WxeApp *) wxTheApp)->clearPtr((void *) This);~n"),
- w(" delete This; }~n } break;~n"),
+ w(" wxObject *This = (wxObject *) getPtr(bp,memenv);~n"),
+ w(" if(This) {~n"),
+ w(" if(recurse_level > 1) {~n"),
+ w(" delayed_delete->Append(Ecmd.Save());~n"),
+ w(" } else {~n"),
+ w(" ((WxeApp *) wxTheApp)->clearPtr((void *) This);~n"),
+ w(" delete This; }~n"),
+ w(" } } break;~n"),
w(" case WXE_REGISTER_OBJECT: {~n"
" registerPid(bp, Ecmd.caller, memenv);~n"
" rt.addAtom(\"ok\");~n"
@@ -855,34 +859,24 @@ call_arg(#param{name=N,type={merged,_,_,_,_,_,_}}) -> N.
to_string(Type) when is_atom(Type) -> atom_to_list(Type);
to_string(Type) when is_list(Type) -> Type.
-virtual_dest(#class{abstract=true, parent="root"}) -> false;
-virtual_dest(#class{abstract=true, parent="object"}) -> true;
virtual_dest(#class{abstract=true, parent=Parent}) ->
- virtual_dest(get({class,Parent}));
+ virtual_dest(get_parent_class(Parent));
virtual_dest(#class{methods=Ms, parent=Parent}) ->
case lists:keysearch(destructor,#method.method_type, lists:append(Ms)) of
{value, #method{method_type=destructor, virtual=Virtual}} ->
case Virtual of
- undefined ->
- case get({class,Parent}) of
- undefined ->
- case Parent of
- "object" ->
- true;
- "root" ->
- false;
- _ ->
- io:format("Error: ~p~n",[Parent]),
- erlang:error(no_parent)
- end;
- PClass ->
- virtual_dest(PClass)
- end;
- _ ->
- Virtual
+ true -> true;
+ _ -> virtual_dest(get_parent_class(Parent))
end;
- false ->
- false
+ false -> virtual_dest(get_parent_class(Parent))
+ end;
+virtual_dest("root") -> false;
+virtual_dest("object") -> true.
+
+get_parent_class(Parent) ->
+ case get({class, Parent}) of
+ undefined -> Parent;
+ Class -> Class
end.
debug(F,A) ->
diff --git a/lib/wx/api_gen/wxapi.conf b/lib/wx/api_gen/wxapi.conf
index ff680d0655..73c5af43d8 100644
--- a/lib/wx/api_gen/wxapi.conf
+++ b/lib/wx/api_gen/wxapi.conf
@@ -2,7 +2,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -1883,3 +1883,5 @@
[{event,[wxEVT_TASKBAR_MOVE,wxEVT_TASKBAR_LEFT_DOWN,wxEVT_TASKBAR_LEFT_UP,
wxEVT_TASKBAR_RIGHT_DOWN,wxEVT_TASKBAR_RIGHT_UP,
wxEVT_TASKBAR_LEFT_DCLICK,wxEVT_TASKBAR_RIGHT_DCLICK]}],[]}.
+
+{class, wxInitDialogEvent, wxEvent, [{event,[wxEVT_INIT_DIALOG]}], []}.
diff --git a/lib/wx/c_src/Makefile.in b/lib/wx/c_src/Makefile.in
index 5507a74c14..93a191378f 100644
--- a/lib/wx/c_src/Makefile.in
+++ b/lib/wx/c_src/Makefile.in
@@ -1,7 +1,7 @@
#
# %CopyrightBegin%
#
-# Copyright Ericsson AB 2008-2012. All Rights Reserved.
+# Copyright Ericsson AB 2008-2014. All Rights Reserved.
#
# The contents of this file are subject to the Erlang Public License,
# Version 1.1, (the "License"); you may not use this file except in
@@ -34,8 +34,9 @@ SO_EXT = @SO_EXT@
OBJC_CC=@OBJC_CC@
OBJC_CFLAGS=@OBJC_CFLAGS@
-GENERAL = wxe_driver wxe_ps_init wxe_impl wxePrintout wxe_return wxe_gl
-GENERAL_H = wxe_driver.h wxe_impl.h wxe_return.h
+GENERAL = wxe_driver wxe_ps_init wxe_main wxe_impl wxe_helpers wxe_callback_impl wxe_return wxe_gl
+GENERAL_H = wxe_callback_impl.h wxe_driver.h wxe_events.h wxe_gl.h \
+ wxe_helpers.h wxe_impl.h wxe_memory.h wxe_return.h
GENERATED_F = wxe_funcs wxe_events wxe_init
GENERATED_H = gen/wxe_macros.h
diff --git a/lib/wx/c_src/gen/wxe_derived_dest.h b/lib/wx/c_src/gen/wxe_derived_dest.h
index 8dcaf1c1ac..7e2d4524cb 100644
--- a/lib/wx/c_src/gen/wxe_derived_dest.h
+++ b/lib/wx/c_src/gen/wxe_derived_dest.h
@@ -736,6 +736,12 @@ class EwxPrintout : public wxPrintout {
EwxPrintout(const wxString& title) : wxPrintout(title) {};
};
+class EwxStyledTextCtrl : public wxStyledTextCtrl {
+ public: ~EwxStyledTextCtrl() {((WxeApp *)wxTheApp)->clearPtr(this);};
+ EwxStyledTextCtrl(wxWindow * parent,wxWindowID id,const wxPoint& pos,const wxSize& size,long style) : wxStyledTextCtrl(parent,id,pos,size,style) {};
+ EwxStyledTextCtrl() : wxStyledTextCtrl() {};
+};
+
class EwxClipboard : public wxClipboard {
public: ~EwxClipboard() {((WxeApp *)wxTheApp)->clearPtr(this);};
EwxClipboard() : wxClipboard() {};
diff --git a/lib/wx/c_src/gen/wxe_events.cpp b/lib/wx/c_src/gen/wxe_events.cpp
index fb3a065448..a1b4d090b3 100644
--- a/lib/wx/c_src/gen/wxe_events.cpp
+++ b/lib/wx/c_src/gen/wxe_events.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -297,6 +297,7 @@ void initEventTable()
{wxEVT_TASKBAR_RIGHT_UP, 227, "taskbar_right_up"},
{wxEVT_TASKBAR_LEFT_DCLICK, 227, "taskbar_left_dclick"},
{wxEVT_TASKBAR_RIGHT_DCLICK, 227, "taskbar_right_dclick"},
+ {wxEVT_INIT_DIALOG, 228, "init_dialog"},
{-1, 0, }
};
for(int i=0; event_types[i].ev_type != -1; i++) {
@@ -814,6 +815,13 @@ case 227: {// wxTaskBarIconEvent
rt.addTupleCount(2);
break;
}
+case 228: {// wxInitDialogEvent
+ evClass = (char*)"wxInitDialogEvent";
+ rt.addAtom((char*)"wxInitDialog");
+ rt.addAtom(Etype->eName);
+ rt.addTupleCount(2);
+ break;
+}
}
rt.addTupleCount(5);
diff --git a/lib/wx/c_src/gen/wxe_funcs.cpp b/lib/wx/c_src/gen/wxe_funcs.cpp
index b5fbac3fe0..82dd414911 100644
--- a/lib/wx/c_src/gen/wxe_funcs.cpp
+++ b/lib/wx/c_src/gen/wxe_funcs.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -45,9 +45,14 @@ void WxeApp::wxe_dispatch(wxeCommand& Ecmd)
switch (Ecmd.op)
{
case DESTROY_OBJECT: {
- wxObject *This = (wxObject *) getPtr(bp,memenv); if(This) { ((WxeApp *) wxTheApp)->clearPtr((void *) This);
- delete This; }
- } break;
+ wxObject *This = (wxObject *) getPtr(bp,memenv);
+ if(This) {
+ if(recurse_level > 1) {
+ delayed_delete->Append(Ecmd.Save());
+ } else {
+ ((WxeApp *) wxTheApp)->clearPtr((void *) This);
+ delete This; }
+ } } break;
case WXE_REGISTER_OBJECT: {
registerPid(bp, Ecmd.caller, memenv);
rt.addAtom("ok");
@@ -26953,14 +26958,14 @@ case wxStyledTextCtrl_new_2: { // wxStyledTextCtrl::wxStyledTextCtrl
style = (long)*(int *) bp; bp += 4;
} break;
}};
- wxStyledTextCtrl * Result = new wxStyledTextCtrl(parent,id,pos,size,style);
- /* Possible memory leak here, class is missing virt dest */
+ wxStyledTextCtrl * Result = new EwxStyledTextCtrl(parent,id,pos,size,style);
+ newPtr((void *) Result, 0, memenv);
rt.addRef(getRef((void *)Result,memenv), "wxStyledTextCtrl");
break;
}
case wxStyledTextCtrl_new_0: { // wxStyledTextCtrl::wxStyledTextCtrl
- wxStyledTextCtrl * Result = new wxStyledTextCtrl();
- /* Possible memory leak here, class is missing virt dest */
+ wxStyledTextCtrl * Result = new EwxStyledTextCtrl();
+ newPtr((void *) Result, 0, memenv);
rt.addRef(getRef((void *)Result,memenv), "wxStyledTextCtrl");
break;
}
diff --git a/lib/wx/c_src/wxePrintout.cpp b/lib/wx/c_src/wxe_callback_impl.cpp
index fc8782ba95..8ba2557d82 100644
--- a/lib/wx/c_src/wxePrintout.cpp
+++ b/lib/wx/c_src/wxe_callback_impl.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -20,9 +20,49 @@
#include <wx/wx.h>
#include "wxe_impl.h"
#include "wxe_return.h"
+#include "wxe_events.h"
+#include "wxe_gl.h"
#include "gen/wxe_macros.h"
#include "gen/wxe_derived_dest.h"
+
+/* ****************************************************************************
+ * CallbackData *
+ * ****************************************************************************/
+
+wxeCallbackData::wxeCallbackData(ErlDrvTermData caller, int req, char *req_type,
+ int funcb, int skip_ev, wxeErlTerm * userData,
+ wxeEvtListener *handler_cb)
+ : wxObject()
+{
+ listener = caller;
+ obj = req;
+ fun_id = funcb;
+ strcpy(class_name, req_type);
+ skip = skip_ev;
+ user_data = userData;
+ handler = handler_cb;
+}
+
+wxeCallbackData::~wxeCallbackData() {
+ // fprintf(stderr, "CBD Deleteing %p %s\r\n", this, class_name); fflush(stderr);
+ if(user_data) {
+ delete user_data;
+ }
+ ptrMap::iterator it;
+ it = ((WxeApp *)wxTheApp)->ptr2ref.find(handler);
+ if(it != ((WxeApp *)wxTheApp)->ptr2ref.end()) {
+ wxeRefData *refd = it->second;
+ wxeReturn rt = wxeReturn(WXE_DRV_PORT, refd->memenv->owner, false);
+ rt.addAtom("wx_delete_cb");
+ rt.addInt(fun_id);
+ rt.addRef(refd->ref, "wxeEvtListener");
+ rt.addRef(obj, class_name);
+ rt.addTupleCount(4);
+ rt.send();
+ }
+}
+
/* *****************************************************************/
/* Special Class impls */
@@ -228,6 +268,35 @@ EwxListCtrl::~EwxListCtrl() {
clear_cb(port, onGetItemColumnImage);
((WxeApp *)wxTheApp)->clearPtr(this);
}
+
+/* ****************************************************************************
+ * wxListCtrlCompare wrapper
+ * ****************************************************************************/
+
+int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr)
+{
+ callbackInfo * cb = (callbackInfo *)callbackInfoPtr;
+ wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(cb->port);
+ wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
+ rt.addInt(cb->callbackID);
+ rt.addInt(item1);
+ rt.addInt(item2);
+ rt.endList(2);
+ rt.addAtom("_wx_invoke_cb_");
+ rt.addTupleCount(3);
+ rt.send();
+ handle_event_callback(WXE_DRV_PORT_HANDLE, memenv->owner);
+
+ if(((WxeApp *) wxTheApp)->cb_buff) {
+ int res = * (int*) ((WxeApp *) wxTheApp)->cb_buff;
+ driver_free(((WxeApp *) wxTheApp)->cb_buff);
+ ((WxeApp *) wxTheApp)->cb_buff = NULL;
+ return res;
+ }
+ return 0;
+}
+
+
// tools
void clear_cb(ErlDrvTermData port, int callback)
diff --git a/lib/wx/c_src/wxe_callback_impl.h b/lib/wx/c_src/wxe_callback_impl.h
new file mode 100644
index 0000000000..c7243e23a4
--- /dev/null
+++ b/lib/wx/c_src/wxe_callback_impl.h
@@ -0,0 +1,75 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2014. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#ifndef _WXE_CALLBACK_IMPL_H
+#define _WXE_CALLBACK_IMPL_H
+
+void pre_callback();
+void handle_event_callback(ErlDrvPort port, ErlDrvTermData process);
+
+class wxEPrintout : public wxPrintout
+{
+ public:
+ wxEPrintout(wxString Title, int onPrintP, int onPrepareP,
+ int onBeginP, int onEndP,
+ int onBeginD, int onEndD,
+ int hasP, int getPageI, ErlDrvTermData Port) :
+ wxPrintout(Title),
+ onPrintPage(onPrintP), onPreparePrinting(onPrepareP),
+ onBeginPrinting(onBeginP), onEndPrinting(onEndP),
+ onBeginDocument(onBeginD), onEndDocument(onEndD), hasPage(hasP), getPageInfo(getPageI),
+ port(Port)
+ { } ;
+
+ ~wxEPrintout();
+
+ bool OnBeginDocument(int startPage, int endPage);
+ void OnEndDocument();
+ void OnBeginPrinting();
+ void OnEndPrinting();
+
+ void OnPreparePrinting();
+
+ bool HasPage(int page);
+ bool OnPrintPage(int page);
+ void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo);
+
+ int onPrintPage;
+ int onPreparePrinting;
+ int onBeginPrinting;
+ int onEndPrinting;
+ int onBeginDocument;
+ int onEndDocument;
+ int hasPage;
+ int getPageInfo;
+
+ ErlDrvTermData port;
+};
+
+void clear_cb(ErlDrvTermData port, int callback);
+
+// Implementation of wxListCtrlCompare
+struct callbackInfo {
+ ErlDrvTermData port;
+ int callbackID;
+};
+
+int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr);
+
+#endif
diff --git a/lib/wx/c_src/wxe_driver.c b/lib/wx/c_src/wxe_driver.c
index 4d3aa577bf..ea52737fa2 100644
--- a/lib/wx/c_src/wxe_driver.c
+++ b/lib/wx/c_src/wxe_driver.c
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -195,7 +195,7 @@ void wxe_process_died(ErlDrvData handle, ErlDrvMonitor *monitor)
{
/* Callback is active for the dead process */
wxe_data *sd = ((wxe_data *)handle);
- push_command(WXE_CB_RETURN,NULL,0,sd);
+ push_command(WXE_CB_DIED,NULL,0,sd);
/* ErlDrvTermData pid; */
/* pid = driver_get_monitored_process(sd->port_handle, monitor); */
diff --git a/lib/wx/c_src/wxe_driver.h b/lib/wx/c_src/wxe_driver.h
index 0f0143bd4c..e35bbe2118 100644
--- a/lib/wx/c_src/wxe_driver.h
+++ b/lib/wx/c_src/wxe_driver.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -89,6 +89,7 @@ extern char * erl_wx_privdir;
#define WXE_BIN_INCR 11
#define WXE_BIN_DECR 12
#define WXE_INIT_OPENGL 13
+#define WXE_CB_DIED 14
#define OPENGL_START 5000
diff --git a/lib/wx/c_src/wxe_events.h b/lib/wx/c_src/wxe_events.h
index 718e0ad120..22a737d854 100644
--- a/lib/wx/c_src/wxe_events.h
+++ b/lib/wx/c_src/wxe_events.h
@@ -1,20 +1,20 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
+ *
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
* Erlang Public License along with this software. If not, it can be
* retrieved online at http://www.erlang.org/.
- *
+ *
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
- *
- * %CopyrightEnd%
+ *
+ * %CopyrightEnd%
*/
#ifndef __WXE_EVENT_H__
@@ -22,6 +22,8 @@
#include "wxe_driver.h"
+bool sendevent(wxEvent * event, ErlDrvTermData port);
+
class wxeEtype
{
public:
diff --git a/lib/wx/c_src/wxe_gl.cpp b/lib/wx/c_src/wxe_gl.cpp
index 34904397d3..a9feb23831 100644
--- a/lib/wx/c_src/wxe_gl.cpp
+++ b/lib/wx/c_src/wxe_gl.cpp
@@ -1,20 +1,20 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
+ *
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
* Erlang Public License along with this software. If not, it can be
* retrieved online at http://www.erlang.org/.
- *
+ *
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
- *
- * %CopyrightEnd%
+ *
+ * %CopyrightEnd%
*/
#include <stdio.h>
@@ -26,8 +26,9 @@
#endif
#include "wxe_impl.h"
#include "wxe_return.h"
+#include "wxe_gl.h"
-/* ****************************************************************************
+/* ****************************************************************************
* Opengl context management *
* ****************************************************************************/
@@ -138,7 +139,7 @@ void gl_dispatch(int op, char *bp,ErlDrvTermData caller,WXEBinRef *bins[]){
else {
ErlDrvTermData rt[] = // Error msg
{ERL_DRV_ATOM, driver_mk_atom((char *) "_egl_error_"),
- ERL_DRV_INT, op,
+ ERL_DRV_INT, (ErlDrvTermData) op,
ERL_DRV_ATOM, driver_mk_atom((char *) "no_gl_context"),
ERL_DRV_TUPLE,3};
erl_drv_send_term(WXE_DRV_PORT,caller,rt,8);
diff --git a/lib/wx/c_src/wxe_gl.h b/lib/wx/c_src/wxe_gl.h
index 1b556ff4ec..dc117bf610 100644
--- a/lib/wx/c_src/wxe_gl.h
+++ b/lib/wx/c_src/wxe_gl.h
@@ -1,22 +1,35 @@
/*
* %CopyrightBegin%
- *
- * Copyright Ericsson AB 2008-2010. All Rights Reserved.
- *
+ *
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
+ *
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
* compliance with the License. You should have received a copy of the
* Erlang Public License along with this software. If not, it can be
* retrieved online at http://www.erlang.org/.
- *
+ *
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
- *
- * %CopyrightEnd%
+ *
+ * %CopyrightEnd%
*/
+#ifndef _WXE_GL_H
+#define _WXE_GL_H
+
#include "egl_impl.h"
+#include "wxe_return.h"
+void activateGL(ErlDrvTermData caller);
+void setActiveGL(ErlDrvTermData caller, wxGLCanvas *canvas);
+void deleteActiveGL(wxGLCanvas *canvas);
void wxe_initOpenGL(wxeReturn, char*);
+void gl_dispatch(int op, char *bp, ErlDrvTermData caller, WXEBinRef *bins[]);
+
+WX_DECLARE_HASH_MAP(ErlDrvTermData, wxGLCanvas*, wxIntegerHash, wxIntegerEqual, wxeGLC);
+extern wxeGLC glc;
+
+#endif
diff --git a/lib/wx/c_src/wxe_helpers.cpp b/lib/wx/c_src/wxe_helpers.cpp
new file mode 100644
index 0000000000..15d75080d9
--- /dev/null
+++ b/lib/wx/c_src/wxe_helpers.cpp
@@ -0,0 +1,95 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2014. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#include <wx/wx.h>
+#include "wxe_impl.h"
+
+/* ****************************************************************************
+ * Erlang Commands
+ * ****************************************************************************/
+
+wxeCommand::wxeCommand(int fc,char * cbuf,int buflen, wxe_data *sd)
+ : wxObject()
+{
+ WXEBinRef *temp, *start, *prev;
+ int n = 0;
+ ref_count = 1;
+ caller = driver_caller(sd->port_handle);
+ port = sd->port;
+ op = fc;
+ len = buflen;
+ bin[0] = NULL;
+ bin[1] = NULL;
+ bin[2] = NULL;
+
+ if(cbuf) {
+ buffer = (char *) driver_alloc(len);
+ memcpy((void *) buffer, (void *) cbuf, len);;
+
+ temp = sd->bin;
+
+ prev = NULL;
+ start = temp;
+
+ while(temp) {
+ if(caller == temp->from) {
+ bin[n++] = temp;
+ if(prev) {
+ prev->next = temp->next;
+ } else {
+ start = temp->next;
+ }
+ temp = temp->next;
+ } else {
+ prev = temp;
+ temp = temp->next;
+ }
+ }
+ sd->bin = start;
+ } else { // No-op only PING currently
+ buffer = NULL;
+ }
+}
+
+wxeCommand::~wxeCommand() {
+ int n = 0;
+ if(buffer) {
+ while(bin[n]) {
+ if(bin[n]->bin)
+ driver_free_binary(bin[n]->bin);
+ driver_free(bin[n++]);
+ }
+ driver_free(buffer);
+ }
+}
+
+/* ****************************************************************************
+ * TreeItemData
+ * ****************************************************************************/
+
+wxETreeItemData::wxETreeItemData(int sz, char * data) {
+ size = sz;
+ bin = (char *) driver_alloc(sz);
+ memcpy(bin, data, sz);
+}
+
+wxETreeItemData::~wxETreeItemData()
+{
+ driver_free(bin);
+}
diff --git a/lib/wx/c_src/wxe_helpers.h b/lib/wx/c_src/wxe_helpers.h
new file mode 100644
index 0000000000..659bc666c6
--- /dev/null
+++ b/lib/wx/c_src/wxe_helpers.h
@@ -0,0 +1,122 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2014. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#ifndef _WXE_HELPER_H
+#define _WXE_HELPER_H
+
+DECLARE_EVENT_TYPE(wxeEVT_META_COMMAND, -1)
+
+class wxeMetaCommand : public wxEvent
+{
+ public:
+ wxeMetaCommand(wxe_data *sd, int EvId)
+ : wxEvent(EvId, wxeEVT_META_COMMAND)
+ { caller = driver_caller(sd->port_handle); port = sd->port; pdl = sd->pdl; } ;
+ wxeMetaCommand(const wxeMetaCommand& event)
+ : wxEvent(event)
+ { caller = event.caller; port = event.port; pdl = event.pdl; };
+ virtual ~wxeMetaCommand() {};
+ virtual wxEvent *Clone() const { return new wxeMetaCommand(*this); }
+
+ ErlDrvTermData caller;
+ ErlDrvTermData port;
+ ErlDrvPDL pdl;
+};
+
+class wxeCommand : public wxObject
+{
+ public:
+ wxeCommand(int fc,char * cbuf,int buflen, wxe_data *);
+ virtual ~wxeCommand(); // Use Delete()
+
+ wxeCommand * Save() {ref_count++; return this; };
+ void Delete() {if(--ref_count < 1) delete this;};
+
+ ErlDrvTermData caller;
+ ErlDrvTermData port;
+ WXEBinRef * bin[3];
+ char * buffer;
+ int len;
+ int op;
+ int ref_count;
+};
+
+class intListElement {
+ public:
+ intListElement(int Element) {car = Element; cdr = NULL;};
+ intListElement(int Element, intListElement *list)
+ {car = Element; cdr = list;};
+ int car;
+ intListElement *cdr;
+};
+
+class intList {
+ public:
+ intList() {list = NULL;};
+ ~intList() {
+ intListElement *head = list;
+ while(head) {
+ intListElement *tail=head->cdr;
+ delete head;
+ head = tail;
+ } };
+ bool IsEmpty() {return list == NULL;};
+ void Append(int Element) { list = new intListElement(Element, list); };
+ int Pop() {
+ intListElement *temp = list;
+ int res = list->car;
+ list = temp->cdr;
+ delete temp;
+ return res;
+ }
+ intListElement *list;
+};
+
+class wxe_badarg
+{
+ public:
+ wxe_badarg(int Ref) : ref(Ref) { } ;
+ int ref;
+};
+
+class wxeErlTerm : public wxClientData
+{
+ public:
+ wxeErlTerm(WXEBinRef * data)
+ {
+ size = data->size;
+ bin = (char *) driver_alloc(size);
+ memcpy(bin, data->base, size);
+ } ;
+ ~wxeErlTerm() { driver_free(bin); };
+ char * bin;
+ int size;
+};
+
+class wxETreeItemData : public wxTreeItemData
+{
+ public:
+ wxETreeItemData(int sz, char * data);
+ ~wxETreeItemData();
+
+ int size;
+ char * bin;
+};
+
+#endif
diff --git a/lib/wx/c_src/wxe_impl.cpp b/lib/wx/c_src/wxe_impl.cpp
index 4968075659..5964ccfd00 100644
--- a/lib/wx/c_src/wxe_impl.cpp
+++ b/lib/wx/c_src/wxe_impl.cpp
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -23,10 +23,6 @@
#include <wx/wx.h>
-#if defined(_WIN32)
-#include <wx/msw/private.h> // for wxSetInstance
-#endif
-
// Avoid including these in dcbuffer below
#include "wx/dcmemory.h"
#include "wx/dcclient.h"
@@ -34,12 +30,12 @@
// Ok ugly but needed for wxBufferedDC crash workaround
#define private public
#include <wx/dcbuffer.h>
-
#undef private
#include "wxe_impl.h"
#include "wxe_events.h"
#include "wxe_return.h"
+#include "wxe_gl.h"
IMPLEMENT_APP_NO_MAIN(WxeApp)
@@ -47,120 +43,21 @@ DECLARE_APP(WxeApp)
DEFINE_EVENT_TYPE(wxeEVT_META_COMMAND)
-#define WXE_NOT_INITIATED 0
-#define WXE_INITIATED 1
-#define WXE_EXITED 2
-#define WXE_ERROR -1
-
#define WXE_NORMAL 0
#define WXE_CALLBACK 1
#define WXE_STORED 2
-ErlDrvTid wxe_thread;
-
-ErlDrvMutex *wxe_status_m;
-ErlDrvCond *wxe_status_c;
-
-ErlDrvMutex * wxe_batch_locker_m;
-ErlDrvCond * wxe_batch_locker_c;
-
-static int wxe_status = WXE_NOT_INITIATED;
+// Globals initiated in wxe_init.cpp
+extern ErlDrvMutex *wxe_status_m;
+extern ErlDrvCond *wxe_status_c;
+extern ErlDrvMutex * wxe_batch_locker_m;
+extern ErlDrvCond * wxe_batch_locker_c;
+extern ErlDrvTermData init_caller;
+extern int wxe_status;
wxList * wxe_batch = NULL;
wxList * wxe_batch_cb_saved = NULL;
-
-ErlDrvTermData wxe_batch_caller = 0;
-ErlDrvTermData init_caller = 0;
-
-// extern opengl
-void gl_dispatch(int op, char *bp, ErlDrvTermData caller, WXEBinRef *bins[]);
-
-
-// Until fixed in emulator
-#ifndef _WIN32
-extern "C" {
-extern void erts_thread_disable_fpe(void);
-}
-#endif
-
-#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
-#define __DARWIN__ 1
-#endif
-
-#ifdef __DARWIN__
-extern "C" {
- int erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp);
- int erl_drv_steal_main_thread(char *name,
- ErlDrvTid *dtid,
- void* (*func)(void*),
- void* arg,
- ErlDrvThreadOpts *opts);
-}
-#endif
-
-void *wxe_main_loop(void * );
-
-/* ************************************************************
- * START AND STOP of driver thread
- * ************************************************************/
-
-int load_native_gui()
-{
- return 1;
-}
-
-int start_native_gui(wxe_data *sd)
-{
- int res;
- wxe_status_m = erl_drv_mutex_create((char *) "wxe_status_m");
- wxe_status_c = erl_drv_cond_create((char *)"wxe_status_c");
-
- wxe_batch_locker_m = erl_drv_mutex_create((char *)"wxe_batch_locker_m");
- wxe_batch_locker_c = erl_drv_cond_create((char *)"wxe_batch_locker_c");
- init_caller = driver_connected(sd->port_handle);
-
-#ifdef __DARWIN__
- res = erl_drv_steal_main_thread((char *)"wxwidgets",
- &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
-#else
- res = erl_drv_thread_create((char *)"wxwidgets",
- &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
-#endif
- if(res == 0) {
- erl_drv_mutex_lock(wxe_status_m);
- for(;wxe_status == WXE_NOT_INITIATED;) {
- erl_drv_cond_wait(wxe_status_c, wxe_status_m);
- }
- erl_drv_mutex_unlock(wxe_status_m);
- return wxe_status;
- } else {
- wxString msg;
- msg.Printf(wxT("Erlang failed to create wxe-thread %d\r\n"), res);
- send_msg("error", &msg);
- return -1;
- }
-}
-
-void stop_native_gui(wxe_data *sd)
-{
- if(wxe_status == WXE_INITIATED) {
- meta_command(WXE_SHUTDOWN, sd);
- }
-#ifdef __DARWIN__
- erl_drv_stolen_main_thread_join(wxe_thread, NULL);
-#else
- erl_drv_thread_join(wxe_thread, NULL);
-#endif
- erl_drv_mutex_destroy(wxe_status_m);
- erl_drv_cond_destroy(wxe_status_c);
- erl_drv_mutex_destroy(wxe_batch_locker_m);
- erl_drv_cond_destroy(wxe_batch_locker_c);
-}
-
-void unload_native_gui()
-{
-
-}
+int wxe_batch_caller = 0; // inside batch if larger than 0
/* ************************************************************
* Commands from erlang
@@ -169,7 +66,8 @@ void unload_native_gui()
void push_command(int op,char * buf,int len, wxe_data *sd)
{
- // fprintf(stderr, "Op %d %d\r\n", op, (int) driver_caller(sd->port_handle)),fflush(stderr);
+ /* fprintf(stderr, "Op %d %d [%ld] %d\r\n", op, (int) driver_caller(sd->port_handle),
+ wxe_batch->size(), wxe_batch_caller),fflush(stderr); */
wxeCommand *Cmd = new wxeCommand(op, buf, len, sd);
erl_drv_mutex_lock(wxe_batch_locker_m);
wxe_batch->Append(Cmd);
@@ -195,9 +93,8 @@ void meta_command(int what, wxe_data *sd) {
wxeCommand *Cmd = new wxeCommand(WXE_DEBUG_PING, NULL, 0, sd);
wxe_batch->Append(Cmd);
erl_drv_cond_signal(wxe_batch_locker_c);
- } else {
- wxWakeUpIdle();
}
+ wxWakeUpIdle();
erl_drv_mutex_unlock(wxe_batch_locker_m);
} else {
if(sd) {
@@ -207,60 +104,19 @@ void meta_command(int what, wxe_data *sd) {
}
}
-/* ************************************************************
- * wxWidgets Thread
- * ************************************************************/
-
-void *wxe_main_loop(void *vpdl)
-{
- int result;
- int argc = 1;
- char * temp = (char *) "Erlang";
- char * argv[] = {temp,NULL};
- ErlDrvPDL pdl = (ErlDrvPDL) vpdl;
-
- driver_pdl_inc_refc(pdl);
-
- // Disable floating point execption if they are on.
- // This should be done in emulator but it's not in yet.
-#ifndef _WIN32
- erts_thread_disable_fpe();
-#else
- // Setup that wxWidgets should look for cursors and icons in
- // this dll and not in werl.exe (which is the default)
- HMODULE WXEHandle = GetModuleHandle(_T("wxe_driver"));
- wxSetInstance((HINSTANCE) WXEHandle);
-#endif
-
- wxe_ps_init();
- result = wxEntry(argc, argv);
- // fprintf(stderr, "WXWidgets quits main loop %d \r\n", result);
- if(result >= 0 && wxe_status == WXE_INITIATED) {
- /* We are done try to make a clean exit */
- wxe_status = WXE_EXITED;
- driver_pdl_dec_refc(pdl);
-#ifndef __DARWIN__
- erl_drv_thread_exit(NULL);
-#endif
- return NULL;
- } else {
- erl_drv_mutex_lock(wxe_status_m);
- wxe_status = WXE_ERROR;
- erl_drv_cond_signal(wxe_status_c);
- erl_drv_mutex_unlock(wxe_status_m);
- driver_pdl_dec_refc(pdl);
- return NULL;
- }
-}
-
-void WxeApp::dummy_close(wxEvent& Ev) {
- // fprintf(stderr, "Dummy Close invoked\r\n");
- // wxMac really wants a top level window which command-q quits if there are no
- // windows open, and this will kill the erlang, override default handling
+void send_msg(const char * type, wxString * msg) {
+ wxeReturn rt = wxeReturn(WXE_DRV_PORT, init_caller);
+ rt.addAtom((char *) "wxe_driver");
+ rt.addAtom((char *) type);
+ rt.add(msg);
+ rt.addTupleCount(3);
+ rt.send();
}
+/* ************************************************************
+ * Init WxeApp the application emulator
+ * ************************************************************/
-// Init wx-widgets thread
bool WxeApp::OnInit()
{
@@ -268,6 +124,9 @@ bool WxeApp::OnInit()
wxe_batch = new wxList;
wxe_batch_cb_saved = new wxList;
cb_buff = NULL;
+ recurse_level = 0;
+ delayed_cleanup = new wxList;
+ delayed_delete = new wxList;
wxe_ps_init2();
// wxIdleEvent::SetMode(wxIDLE_PROCESS_SPECIFIED); // Hmm printpreview doesn't work in 2.9 with this
@@ -305,13 +164,16 @@ void WxeApp::shutdown(wxeMetaCommand& Ecmd) {
ExitMainLoop();
}
-void send_msg(const char * type, wxString * msg) {
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, init_caller);
- rt.addAtom((char *) "wxe_driver");
- rt.addAtom((char *) type);
- rt.add(msg);
- rt.addTupleCount(3);
- rt.send();
+void WxeApp::dummy_close(wxEvent& Ev) {
+ // fprintf(stderr, "Dummy Close invoked\r\n");
+ // wxMac really wants a top level window which command-q quits if there are no
+ // windows open, and this will kill the erlang, override default handling
+}
+
+// Called by wx thread
+void WxeApp::idle(wxIdleEvent& event) {
+ event.Skip(true);
+ dispatch_cmds();
}
/* ************************************************************
@@ -328,29 +190,51 @@ void handle_event_callback(ErlDrvPort port, ErlDrvTermData process)
{
WxeApp * app = (WxeApp *) wxTheApp;
ErlDrvMonitor monitor;
- driver_monitor_process(port, process, &monitor);
- // Should we be able to handle commands when recursing? probably
- erl_drv_mutex_lock(wxe_batch_locker_m);
- //fprintf(stderr, "\r\nCB EV Start %lu \r\n", process);fflush(stderr);
- app->dispatch_cb(wxe_batch, wxe_batch_cb_saved, process);
- //fprintf(stderr, "CB EV done %lu \r\n", process);fflush(stderr);
- wxe_batch_caller = 0;
- erl_drv_mutex_unlock(wxe_batch_locker_m);
- driver_demonitor_process(port, &monitor);
-}
-
-// Called by wx thread
-void WxeApp::idle(wxIdleEvent& event) {
- event.Skip(true);
- dispatch_cmds();
+ // Is thread safe if pdl have been incremented
+ if(driver_monitor_process(port, process, &monitor) == 0) {
+ // Should we be able to handle commands when recursing? probably
+ erl_drv_mutex_lock(wxe_batch_locker_m);
+ //fprintf(stderr, "\r\nCB EV Start %lu \r\n", process);fflush(stderr);
+ app->recurse_level++;
+ app->dispatch_cb(wxe_batch, wxe_batch_cb_saved, process);
+ app->recurse_level--;
+ //fprintf(stderr, "CB EV done %lu \r\n", process);fflush(stderr);
+ wxe_batch_caller = 0;
+ erl_drv_mutex_unlock(wxe_batch_locker_m);
+ driver_demonitor_process(port, &monitor);
+ }
}
-void WxeApp::dispatch_cmds() {
+void WxeApp::dispatch_cmds()
+{
erl_drv_mutex_lock(wxe_batch_locker_m);
+ recurse_level++;
int level = dispatch(wxe_batch_cb_saved, 0, WXE_STORED);
dispatch(wxe_batch, level, WXE_NORMAL);
+ recurse_level--;
wxe_batch_caller = 0;
erl_drv_mutex_unlock(wxe_batch_locker_m);
+ // Cleanup old memenv's and deleted objects
+ if(recurse_level == 0) {
+ if(delayed_delete->size() > 0)
+ for( wxList::compatibility_iterator node = delayed_delete->GetFirst();
+ node;
+ node = delayed_delete->GetFirst()) {
+ wxeCommand *event = (wxeCommand *)node->GetData();
+ delayed_delete->Erase(node);
+ wxe_dispatch(*event);
+ event->Delete();
+ }
+ if(delayed_cleanup->size() > 0)
+ for( wxList::compatibility_iterator node = delayed_cleanup->GetFirst();
+ node;
+ node = delayed_cleanup->GetFirst()) {
+ wxeMetaCommand *event = (wxeMetaCommand *)node->GetData();
+ delayed_cleanup->Erase(node);
+ destroyMemEnv(*event);
+ delete event;
+ }
+ }
}
// Should have erl_drv_mutex_lock(wxe_batch_locker_m);
@@ -402,7 +286,7 @@ int WxeApp::dispatch(wxList * batch, int blevel, int list_type)
erl_drv_mutex_lock(wxe_batch_locker_m);
break;
}
- delete event;
+ event->Delete();
}
} else {
if((list_type == WXE_STORED) || (blevel <= 0 && list_type == WXE_NORMAL)) {
@@ -434,6 +318,7 @@ void WxeApp::dispatch_cb(wxList * batch, wxList * temp, ErlDrvTermData process)
// fprintf(stderr, " Ev %d %lu\r\n", event->op, event->caller);
if(event->caller == process || // Callbacks from CB process only
event->op == WXE_CB_START || // Event callback start change process
+ event->op == WXE_CB_DIED || // Event callback process died
// Allow connect_cb during CB i.e. msg from wxe_server.
(memenv && event->caller == memenv->owner))
{
@@ -446,7 +331,8 @@ void WxeApp::dispatch_cb(wxList * batch, wxList * temp, ErlDrvTermData process)
if(event->len > 0) {
cb_buff = (char *) driver_alloc(event->len);
memcpy(cb_buff, event->buffer, event->len);
- }
+ } // continue
+ case WXE_CB_DIED:
callback_returned = 1;
return;
case WXE_CB_START:
@@ -481,7 +367,7 @@ void WxeApp::dispatch_cb(wxList * batch, wxList * temp, ErlDrvTermData process)
return;
break;
}
- delete event;
+ event->Delete();
} else {
// fprintf(stderr, " save %d \r\n", event->op);
temp->Append(event);
@@ -518,7 +404,8 @@ void WxeApp::newMemEnv(wxeMetaCommand& Ecmd) {
erl_drv_send_term(WXE_DRV_PORT,Ecmd.caller,rt,2);
}
-void WxeApp::destroyMemEnv(wxeMetaCommand& Ecmd) {
+void WxeApp::destroyMemEnv(wxeMetaCommand& Ecmd)
+{
// Clear incoming cmd queue first
// dispatch_cmds();
wxWindow *parent = NULL;
@@ -537,26 +424,33 @@ void WxeApp::destroyMemEnv(wxeMetaCommand& Ecmd) {
ptrMap::iterator it = ptr2ref.find(ptr);
if(it != ptr2ref.end()) {
wxeRefData *refd = it->second;
- if(refd->alloc_in_erl) {
- if(refd->type == 2) {
- wxDialog *win = (wxDialog *) ptr;
- if(win->IsModal()) {
- win->EndModal(-1);
- }
- parent = win->GetParent();
- if(parent) {
- ptrMap::iterator parentRef = ptr2ref.find(parent);
- if(parentRef == ptr2ref.end()) {
- // The parent is already dead delete the parent ref
- win->SetParent(NULL);
- }
+ if(refd->alloc_in_erl && refd->type == 2) {
+ wxDialog *win = (wxDialog *) ptr;
+ if(win->IsModal()) {
+ win->EndModal(-1);
+ }
+ parent = win->GetParent();
+ if(parent) {
+ ptrMap::iterator parentRef = ptr2ref.find(parent);
+ if(parentRef == ptr2ref.end()) {
+ // The parent is already dead delete the parent ref
+ win->SetParent(NULL);
}
+ }
+ if(recurse_level > 0) {
+ // Delay delete until we are out of dispatch*
+ delayed_cleanup->Append(Ecmd.Clone());
+ } else {
delete win;
}
}
}
}
}
+
+ if(recurse_level > 0)
+ return;
+
// First pass, delete all top parents/windows of all linked objects
// fprintf(stderr, "close port %x\r\n", Ecmd.port);fflush(stderr);
@@ -781,161 +675,3 @@ void WxeApp::registerPid(char * bp, ErlDrvTermData pid, wxeMemEnv * memenv) {
};
throw wxe_badarg(index);
}
-
-
-/* ************************************************************
- * Misc utility classes
- * ************************************************************/
-
-/* ****************************************************************************
- * Memory handling
- * ****************************************************************************/
-
-wxeMemEnv::wxeMemEnv() {
- ref2ptr = (void **) driver_alloc(128*sizeof(void *));
- ref2ptr[0] = NULL;
- next = 1;
- max = 128;
-}
-
-wxeMemEnv::~wxeMemEnv() {
- driver_free(ref2ptr);
-}
-
-/* ****************************************************************************
- * Erlang Commands (don't need to be derived of wxEvent anymore should
- * be re-written to own class struct)
- * ****************************************************************************/
-
-wxeCommand::wxeCommand(int fc,char * cbuf,int buflen, wxe_data *sd)
- : wxObject()
-{
- WXEBinRef *temp, *start, *prev;
- int n = 0;
- caller = driver_caller(sd->port_handle);
- port = sd->port;
- op = fc;
- len = buflen;
- bin[0] = NULL;
- bin[1] = NULL;
- bin[2] = NULL;
-
- if(cbuf) {
- buffer = (char *) driver_alloc(len);
- memcpy((void *) buffer, (void *) cbuf, len);;
-
- temp = sd->bin;
-
- prev = NULL;
- start = temp;
-
- while(temp) {
- if(caller == temp->from) {
- bin[n++] = temp;
- if(prev) {
- prev->next = temp->next;
- } else {
- start = temp->next;
- }
- temp = temp->next;
- } else {
- prev = temp;
- temp = temp->next;
- }
- }
- sd->bin = start;
- } else { // No-op only PING currently
- buffer = NULL;
- }
-}
-
-wxeCommand::~wxeCommand() {
- int n = 0;
- if(buffer) {
- while(bin[n]) {
- if(bin[n]->bin)
- driver_free_binary(bin[n]->bin);
- driver_free(bin[n++]);
- }
- driver_free(buffer);
- }
-}
-
-/* ****************************************************************************
- * TreeItemData
- * ****************************************************************************/
-
-wxETreeItemData::wxETreeItemData(int sz, char * data) {
- size = sz;
- bin = (char *) driver_alloc(sz);
- memcpy(bin, data, sz);
-}
-
-wxETreeItemData::~wxETreeItemData()
-{
- driver_free(bin);
-}
-
-/* ****************************************************************************
- * CallbackData *
- * ****************************************************************************/
-
-wxeCallbackData::wxeCallbackData(ErlDrvTermData caller, int req, char *req_type,
- int funcb, int skip_ev, wxeErlTerm * userData,
- wxeEvtListener *handler_cb)
- : wxObject()
-{
- listener = caller;
- obj = req;
- fun_id = funcb;
- strcpy(class_name, req_type);
- skip = skip_ev;
- user_data = userData;
- handler = handler_cb;
-}
-
-wxeCallbackData::~wxeCallbackData() {
- // fprintf(stderr, "CBD Deleteing %p %s\r\n", this, class_name); fflush(stderr);
- if(user_data) {
- delete user_data;
- }
- ptrMap::iterator it;
- it = ((WxeApp *)wxTheApp)->ptr2ref.find(handler);
- if(it != ((WxeApp *)wxTheApp)->ptr2ref.end()) {
- wxeRefData *refd = it->second;
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, refd->memenv->owner, false);
- rt.addAtom("wx_delete_cb");
- rt.addInt(fun_id);
- rt.addRef(refd->ref, "wxeEvtListener");
- rt.addRef(obj, class_name);
- rt.addTupleCount(4);
- rt.send();
- }
-}
-
-/* ****************************************************************************
- * wxListCtrlCompare wrapper
- * ****************************************************************************/
-
-int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr)
-{
- callbackInfo * cb = (callbackInfo *)callbackInfoPtr;
- wxeMemEnv * memenv = ((WxeApp *) wxTheApp)->getMemEnv(cb->port);
- wxeReturn rt = wxeReturn(WXE_DRV_PORT, memenv->owner, false);
- rt.addInt(cb->callbackID);
- rt.addInt(item1);
- rt.addInt(item2);
- rt.endList(2);
- rt.addAtom("_wx_invoke_cb_");
- rt.addTupleCount(3);
- rt.send();
- handle_event_callback(WXE_DRV_PORT_HANDLE, memenv->owner);
-
- if(((WxeApp *) wxTheApp)->cb_buff) {
- int res = * (int*) ((WxeApp *) wxTheApp)->cb_buff;
- driver_free(((WxeApp *) wxTheApp)->cb_buff);
- ((WxeApp *) wxTheApp)->cb_buff = NULL;
- return res;
- }
- return 0;
-}
diff --git a/lib/wx/c_src/wxe_impl.h b/lib/wx/c_src/wxe_impl.h
index a3c57e2598..bb54961edd 100644
--- a/lib/wx/c_src/wxe_impl.h
+++ b/lib/wx/c_src/wxe_impl.h
@@ -1,7 +1,7 @@
/*
* %CopyrightBegin%
*
- * Copyright Ericsson AB 2008-2013. All Rights Reserved.
+ * Copyright Ericsson AB 2008-2014. All Rights Reserved.
*
* The contents of this file are subject to the Erlang Public License,
* Version 1.1, (the "License"); you may not use this file except in
@@ -14,12 +14,17 @@
* the License for the specific language governing rights and limitations
* under the License.
*
- * %CopyrightEnd%
+ * %CopyrightEnd%
*/
#ifndef _WXE_IMPL_H
#define _WXE_IMPL_H
+#if defined(__APPLE__) && defined(__MACH__) && !defined(__DARWIN__)
+#define __DARWIN__ 1
+#endif
+
+
#include <wx/glcanvas.h>
#include <wx/treectrl.h>
#include <wx/print.h>
@@ -27,119 +32,16 @@ extern "C" {
#include "wxe_driver.h"
}
-DECLARE_EVENT_TYPE(wxeEVT_META_COMMAND, -1)
-
-class wxeMetaCommand : public wxEvent
-{
- public:
- wxeMetaCommand(wxe_data *sd, int EvId)
- : wxEvent(EvId, wxeEVT_META_COMMAND)
- { caller = driver_caller(sd->port_handle); port = sd->port; pdl = sd->pdl; } ;
- wxeMetaCommand(const wxeMetaCommand& event)
- : wxEvent(event)
- { caller = event.caller; port = event.port; pdl = event.pdl; };
- virtual ~wxeMetaCommand() {};
- virtual wxEvent *Clone() const { return new wxeMetaCommand(*this); }
-
- ErlDrvTermData caller;
- ErlDrvTermData port;
- ErlDrvPDL pdl;
-};
-
-class wxeCommand : public wxObject
-{
- public:
- wxeCommand(int fc,char * cbuf,int buflen, wxe_data *);
- virtual ~wxeCommand();
-
- ErlDrvTermData caller;
- ErlDrvTermData port;
- WXEBinRef * bin[3];
- char * buffer;
- int len;
- int op;
-};
-
-#define WXE_EVENT_PTR 0
-#define WXE_OBJECT_PTR 1
-
-class intListElement {
-public:
- intListElement(int Element) {car = Element; cdr = NULL;};
- intListElement(int Element, intListElement *list)
- {car = Element; cdr = list;};
- int car;
- intListElement *cdr;
-};
-
-class intList {
-public:
- intList() {list = NULL;};
- bool IsEmpty() {return list == NULL;};
- void Append(int Element) { list = new intListElement(Element, list); };
- int Pop() {
- intListElement *temp = list;
- int res = list->car;
- list = temp->cdr;
- delete temp;
- return res;
- }
- intListElement *list;
-};
-
-class wxe_badarg
-{
-public:
- wxe_badarg(int Ref) : ref(Ref) { } ;
- int ref;
-};
-
-class wxeErlTerm : public wxClientData
-{
- public:
- wxeErlTerm(WXEBinRef * data)
- {
- size = data->size;
- bin = (char *) driver_alloc(size);
- memcpy(bin, data->base, size);
- } ;
- ~wxeErlTerm() { driver_free(bin); };
- char * bin;
- int size;
-};
-
-class wxeMemEnv
-{
-public:
- wxeMemEnv();
- int next;
- int max;
- void ** ref2ptr;
- intList free;
- ~wxeMemEnv();
- ErlDrvTermData owner;
-};
-
-class wxeRefData {
- public:
- wxeRefData(unsigned int dref, int ttype, int is_new, wxeMemEnv *menv) :
- ref(dref), type(ttype), alloc_in_erl(is_new), memenv(menv), pid(-1) { } ;
- int ref;
- int type;
- // 0 = wxWindow subclasses, 1 = wxObject subclasses
- // 2 = wxDialog subclasses, 3 = allocated wxObjects but not returned from new
- // > 3 classes which lack virtual destr, or are supposed to be allocated on
- // the stack
- bool alloc_in_erl;
- wxeMemEnv *memenv;
- ErlDrvTermData pid;
-};
-
-WX_DECLARE_HASH_MAP(ErlDrvTermData, wxGLCanvas*, wxIntegerHash, wxIntegerEqual, wxeGLC);
-WX_DECLARE_HASH_MAP(ErlDrvTermData, wxeMemEnv*, wxIntegerHash, wxIntegerEqual, wxeMemMap);
+#include "wxe_helpers.h"
+#include "wxe_callback_impl.h"
+#include "wxe_memory.h"
+#define WXE_NOT_INITIATED 0
+#define WXE_INITIATED 1
+#define WXE_EXITED 2
+#define WXE_ERROR -1
-WX_DECLARE_VOIDPTR_HASH_MAP(wxeRefData *, ptrMap);
+void send_msg(const char *, wxString *); // For debugging and error msgs
class WxeApp : public wxApp
{
@@ -158,101 +60,31 @@ public:
void dummy_close(wxEvent& Ev);
bool sendevent(wxEvent *event);
- // MemEnv handling
+ // MemEnv handling
void newMemEnv(wxeMetaCommand& event);
void destroyMemEnv(wxeMetaCommand& event);
wxeMemEnv * getMemEnv(ErlDrvTermData port);
-
+
int newPtr(void * ptr, int type, wxeMemEnv *memenv);
int getRef(void * ptr, wxeMemEnv *memenv);
- void * getPtr(char * bp, wxeMemEnv *memenv);
+ void * getPtr(char * bp, wxeMemEnv *memenv);
void clearPtr(void *ptr);
void registerPid(char *ptr, ErlDrvTermData pid, wxeMemEnv *memenv);
- void init_nonconsts(wxeMemEnv *memenv, ErlDrvTermData caller);
-
+ void init_nonconsts(wxeMemEnv *memenv, ErlDrvTermData caller);
+
// Code found in gen/wxe_derived_dest.h
void delete_object(void *ptr, wxeRefData *refd);
-
+
wxeMemMap refmap;
ptrMap ptr2ref;
wxeMemEnv * global_me;
-
+
+ int recurse_level;
+ wxList * delayed_cleanup;
+ wxList * delayed_delete;
// Temp container for callbacks
char *cb_buff;
int cb_len;
};
-class wxETreeItemData : public wxTreeItemData
-{
- public:
- wxETreeItemData(int sz, char * data);
-
- ~wxETreeItemData();
-
- int size;
- char * bin;
-};
-
-bool sendevent(wxEvent * event, ErlDrvTermData port);
-void pre_callback();
-void handle_event_callback(ErlDrvPort port, ErlDrvTermData process);
-
-void activateGL(ErlDrvTermData caller);
-void setActiveGL(ErlDrvTermData caller, wxGLCanvas *canvas);
-void deleteActiveGL(wxGLCanvas *canvas);
-
-void send_msg(const char *, wxString *); // For debugging and error msgs
-
-extern wxeGLC glc;
-
-class wxEPrintout : public wxPrintout
-{
- public:
- wxEPrintout(wxString Title, int onPrintP, int onPrepareP,
- int onBeginP, int onEndP,
- int onBeginD, int onEndD,
- int hasP, int getPageI, ErlDrvTermData Port) :
- wxPrintout(Title),
- onPrintPage(onPrintP), onPreparePrinting(onPrepareP),
- onBeginPrinting(onBeginP), onEndPrinting(onEndP),
- onBeginDocument(onBeginD), onEndDocument(onEndD), hasPage(hasP), getPageInfo(getPageI),
- port(Port)
- { } ;
-
- ~wxEPrintout();
-
- bool OnBeginDocument(int startPage, int endPage);
- void OnEndDocument();
- void OnBeginPrinting();
- void OnEndPrinting();
-
- void OnPreparePrinting();
-
- bool HasPage(int page);
- bool OnPrintPage(int page);
- void GetPageInfo(int *minPage, int *maxPage, int *pageFrom, int *pageTo);
-
- int onPrintPage;
- int onPreparePrinting;
- int onBeginPrinting;
- int onEndPrinting;
- int onBeginDocument;
- int onEndDocument;
- int hasPage;
- int getPageInfo;
-
- ErlDrvTermData port;
-};
-
-void clear_cb(ErlDrvTermData port, int callback);
-
-
-// Implementation of wxListCtrlCompare
-struct callbackInfo {
- ErlDrvTermData port;
- int callbackID;
-};
-
-int wxCALLBACK wxEListCtrlCompare(long item1, long item2, long callbackInfoPtr);
-
#endif //_WXE_IMPL_H
diff --git a/lib/wx/c_src/wxe_main.cpp b/lib/wx/c_src/wxe_main.cpp
new file mode 100644
index 0000000000..2bec2422c9
--- /dev/null
+++ b/lib/wx/c_src/wxe_main.cpp
@@ -0,0 +1,163 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2014. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#if defined(_WIN32)
+#include <wx/msw/private.h> // for wxSetInstance
+#endif
+
+#include "wxe_impl.h"
+
+// Until fixed in emulator
+#ifndef _WIN32
+extern "C" {
+ extern void erts_thread_disable_fpe(void);
+}
+#endif
+
+ErlDrvTid wxe_thread;
+
+ErlDrvMutex *wxe_status_m;
+ErlDrvCond *wxe_status_c;
+
+int wxe_status = WXE_NOT_INITIATED;
+
+ErlDrvMutex * wxe_batch_locker_m;
+ErlDrvCond * wxe_batch_locker_c;
+ErlDrvTermData init_caller = 0;
+
+#ifdef __DARWIN__
+extern "C" {
+ int erl_drv_stolen_main_thread_join(ErlDrvTid tid, void **respp);
+ int erl_drv_steal_main_thread(char *name,
+ ErlDrvTid *dtid,
+ void* (*func)(void*),
+ void* arg,
+ ErlDrvThreadOpts *opts);
+}
+#endif
+
+void *wxe_main_loop(void * );
+
+/* ************************************************************
+ * START AND STOP of driver thread
+ * ************************************************************/
+
+int load_native_gui()
+{
+ return 1;
+}
+
+int start_native_gui(wxe_data *sd)
+{
+ int res;
+ wxe_status_m = erl_drv_mutex_create((char *) "wxe_status_m");
+ wxe_status_c = erl_drv_cond_create((char *)"wxe_status_c");
+
+ wxe_batch_locker_m = erl_drv_mutex_create((char *)"wxe_batch_locker_m");
+ wxe_batch_locker_c = erl_drv_cond_create((char *)"wxe_batch_locker_c");
+ init_caller = driver_connected(sd->port_handle);
+
+#ifdef __DARWIN__
+ res = erl_drv_steal_main_thread((char *)"wxwidgets",
+ &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
+#else
+ res = erl_drv_thread_create((char *)"wxwidgets",
+ &wxe_thread,wxe_main_loop,(void *) sd->pdl,NULL);
+#endif
+ if(res == 0) {
+ erl_drv_mutex_lock(wxe_status_m);
+ for(;wxe_status == WXE_NOT_INITIATED;) {
+ erl_drv_cond_wait(wxe_status_c, wxe_status_m);
+ }
+ erl_drv_mutex_unlock(wxe_status_m);
+ return wxe_status;
+ } else {
+ wxString msg;
+ msg.Printf(wxT("Erlang failed to create wxe-thread %d\r\n"), res);
+ send_msg("error", &msg);
+ return -1;
+ }
+}
+
+void stop_native_gui(wxe_data *sd)
+{
+ if(wxe_status == WXE_INITIATED) {
+ meta_command(WXE_SHUTDOWN, sd);
+ }
+#ifdef __DARWIN__
+ erl_drv_stolen_main_thread_join(wxe_thread, NULL);
+#else
+ erl_drv_thread_join(wxe_thread, NULL);
+#endif
+ erl_drv_mutex_destroy(wxe_status_m);
+ erl_drv_cond_destroy(wxe_status_c);
+ erl_drv_mutex_destroy(wxe_batch_locker_m);
+ erl_drv_cond_destroy(wxe_batch_locker_c);
+}
+
+void unload_native_gui()
+{
+
+}
+
+/* ************************************************************
+ * wxWidgets Thread
+ * ************************************************************/
+
+void *wxe_main_loop(void *vpdl)
+{
+ int result;
+ int argc = 1;
+ char * temp = (char *) "Erlang";
+ char * argv[] = {temp,NULL};
+ ErlDrvPDL pdl = (ErlDrvPDL) vpdl;
+
+ driver_pdl_inc_refc(pdl);
+
+ // Disable floating point execption if they are on.
+ // This should be done in emulator but it's not in yet.
+#ifndef _WIN32
+ erts_thread_disable_fpe();
+#else
+ // Setup that wxWidgets should look for cursors and icons in
+ // this dll and not in werl.exe (which is the default)
+ HMODULE WXEHandle = GetModuleHandle(_T("wxe_driver"));
+ wxSetInstance((HINSTANCE) WXEHandle);
+#endif
+
+ wxe_ps_init();
+ result = wxEntry(argc, argv);
+ // fprintf(stderr, "WXWidgets quits main loop %d \r\n", result);
+ if(result >= 0 && wxe_status == WXE_INITIATED) {
+ /* We are done try to make a clean exit */
+ wxe_status = WXE_EXITED;
+ driver_pdl_dec_refc(pdl);
+#ifndef __DARWIN__
+ erl_drv_thread_exit(NULL);
+#endif
+ return NULL;
+ } else {
+ erl_drv_mutex_lock(wxe_status_m);
+ wxe_status = WXE_ERROR;
+ erl_drv_cond_signal(wxe_status_c);
+ erl_drv_mutex_unlock(wxe_status_m);
+ driver_pdl_dec_refc(pdl);
+ return NULL;
+ }
+}
diff --git a/lib/wx/c_src/wxe_memory.h b/lib/wx/c_src/wxe_memory.h
new file mode 100644
index 0000000000..ec22183bfa
--- /dev/null
+++ b/lib/wx/c_src/wxe_memory.h
@@ -0,0 +1,61 @@
+/*
+ * %CopyrightBegin%
+ *
+ * Copyright Ericsson AB 2014. All Rights Reserved.
+ *
+ * The contents of this file are subject to the Erlang Public License,
+ * Version 1.1, (the "License"); you may not use this file except in
+ * compliance with the License. You should have received a copy of the
+ * Erlang Public License along with this software. If not, it can be
+ * retrieved online at http://www.erlang.org/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+ * the License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * %CopyrightEnd%
+ */
+
+#ifndef _WXE_MEMORY_H
+#define _WXE_MEMORY_H
+
+class wxeMemEnv
+{
+public:
+ wxeMemEnv()
+ {
+ ref2ptr = (void **) driver_alloc(128*sizeof(void *));
+ ref2ptr[0] = NULL;
+ next = 1;
+ max = 128;
+ };
+ ~wxeMemEnv()
+ { driver_free(ref2ptr); };
+ int next;
+ int max;
+ void ** ref2ptr;
+ intList free;
+ ErlDrvTermData owner;
+};
+
+class wxeRefData {
+ public:
+ wxeRefData(unsigned int dref, int ttype, int is_new, wxeMemEnv *menv) :
+ ref(dref), type(ttype), alloc_in_erl(is_new), memenv(menv), pid(-1) { } ;
+ int ref;
+ int type;
+ // 0 = wxWindow subclasses, 1 = wxObject subclasses
+ // 2 = wxDialog subclasses, 3 = allocated wxObjects but not returned from new
+ // > 3 classes which lack virtual destr, or are supposed to be allocated on
+ // the stack
+ bool alloc_in_erl;
+ wxeMemEnv *memenv;
+ ErlDrvTermData pid;
+};
+
+WX_DECLARE_HASH_MAP(ErlDrvTermData, wxeMemEnv*, wxIntegerHash, wxIntegerEqual, wxeMemMap);
+
+WX_DECLARE_VOIDPTR_HASH_MAP(wxeRefData *, ptrMap);
+
+#endif
diff --git a/lib/wx/configure.in b/lib/wx/configure.in
index 12b4de6fe6..3756786831 100755
--- a/lib/wx/configure.in
+++ b/lib/wx/configure.in
@@ -183,7 +183,7 @@ AC_SUBST(OBJC_CFLAGS)
case $host_os in
darwin*)
- LDFLAGS="-bundle -flat_namespace -undefined warning -fPIC $LDFLAGS"
+ LDFLAGS="$MAC_MIN -bundle -flat_namespace -undefined warning -fPIC $LDFLAGS"
# Check sizof_void_p as future will hold 64bit MacOS wx
if test $ac_cv_sizeof_void_p = 4; then
LDFLAGS="-m32 $LDFLAGS"
@@ -211,20 +211,20 @@ dnl ----------------------------------------------------------------------
case $host_os in
mingw32)
DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS"
- CFLAGS="-g -Wall -O2 -fomit-frame-pointer -fno-strict-aliasing $CFLAGS"
+ CFLAGS="-g -Wall -O2 $CFLAGS -fomit-frame-pointer -fno-strict-aliasing"
;;
win32)
- DEBUG_CFLAGS="-g -Wall -DDEBUG $CFLAGS"
+ DEBUG_CFLAGS="-g -Wall $CFLAGS -DDEBUG"
CFLAGS="-g -Wall -O2 $CFLAGS"
;;
darwin*)
- DEBUG_CFLAGS="-g -Wall -fPIC -DDEBUG $CFLAGS"
- # Disable -02 crashes with xcode 5.0.2 (clang-500.2.79)
- CFLAGS="-g -Wall -fPIC -fomit-frame-pointer -fno-strict-aliasing $CFLAGS"
+ DEBUG_CFLAGS="-g -Wall -fPIC $CFLAGS -DDEBUG"
+ # omit-frame-pointer causes seg faults with 10.9 and clang
+ CFLAGS="-g -Wall -fPIC $CFLAGS -fno-strict-aliasing"
;;
*)
- DEBUG_CFLAGS="-g -Wall -fPIC -DDEBUG $CFLAGS"
- CFLAGS="-g -Wall -O2 -fPIC -fomit-frame-pointer -fno-strict-aliasing $CFLAGS"
+ DEBUG_CFLAGS="-g -Wall -fPIC $CFLAGS -DDEBUG"
+ CFLAGS="-g -Wall -O2 -fPIC $CFLAGS -fomit-frame-pointer -fno-strict-aliasing"
;;
esac
diff --git a/lib/wx/doc/src/notes.xml b/lib/wx/doc/src/notes.xml
index c330353dd4..6e653cf828 100644
--- a/lib/wx/doc/src/notes.xml
+++ b/lib/wx/doc/src/notes.xml
@@ -31,6 +31,22 @@
<p>This document describes the changes made to the wxErlang
application.</p>
+<section><title>Wx 1.1.2</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p>
+ Fixed a problem which caused the debugger to crash when
+ closing a window. Fixed static linking on mac.</p>
+ <p>
+ Own Id: OTP-11444</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Wx 1.1.1</title>
<section><title>Fixed Bugs and Malfunctions</title>
diff --git a/lib/wx/include/wx.hrl b/lib/wx/include/wx.hrl
index aa1c81ac0f..2dc1791cce 100644
--- a/lib/wx/include/wx.hrl
+++ b/lib/wx/include/wx.hrl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -273,6 +273,10 @@
-type wxAuiManagerEventType() :: aui_pane_button | aui_pane_close | aui_pane_maximize | aui_pane_restore | aui_render | aui_find_manager.
-type wxAuiManager() :: #wxAuiManager{}. %% Callback event: {@link wxAuiManagerEvent}
+-record(wxInitDialog, {type :: wxInitDialogEventType()}). %% Callback event: {@link wxInitDialogEvent}
+-type wxInitDialogEventType() :: init_dialog.
+-type wxInitDialog() :: #wxInitDialog{}. %% Callback event: {@link wxInitDialogEvent}
+
-record(wxCommand,{type :: wxCommandEventType(), %% Callback event: {@link wxCommandEvent}
cmdString :: unicode:chardata(),
commandInt :: integer(),
@@ -312,8 +316,8 @@
-type wxTreeEventType() :: command_tree_begin_drag | command_tree_begin_rdrag | command_tree_begin_label_edit | command_tree_end_label_edit | command_tree_delete_item | command_tree_get_info | command_tree_set_info | command_tree_item_expanded | command_tree_item_expanding | command_tree_item_collapsed | command_tree_item_collapsing | command_tree_sel_changed | command_tree_sel_changing | command_tree_key_down | command_tree_item_activated | command_tree_item_right_click | command_tree_item_middle_click | command_tree_end_drag | command_tree_state_image_click | command_tree_item_gettooltip | command_tree_item_menu.
-type wxTree() :: #wxTree{}. %% Callback event: {@link wxTreeEvent}
--type event() :: wxAuiManager() | wxAuiNotebook() | wxCalendar() | wxChildFocus() | wxClipboardText() | wxClose() | wxColourPicker() | wxCommand() | wxContextMenu() | wxDate() | wxDisplayChanged() | wxErase() | wxFileDirPicker() | wxFocus() | wxFontPicker() | wxGrid() | wxHelp() | wxHtmlLink() | wxIconize() | wxIdle() | wxJoystick() | wxKey() | wxList() | wxMaximize() | wxMenu() | wxMouse() | wxMouseCaptureChanged() | wxMove() | wxNavigationKey() | wxNotebook() | wxPaint() | wxPaletteChanged() | wxQueryNewPalette() | wxSash() | wxScroll() | wxScrollWin() | wxSetCursor() | wxShow() | wxSize() | wxSpin() | wxSplitter() | wxStyledText() | wxSysColourChanged() | wxTaskBarIcon() | wxTree() | wxUpdateUI() | wxWindowCreate() | wxWindowDestroy().
--type wxEventType() :: wxAuiManagerEventType() | wxAuiNotebookEventType() | wxCalendarEventType() | wxChildFocusEventType() | wxClipboardTextEventType() | wxCloseEventType() | wxColourPickerEventType() | wxCommandEventType() | wxContextMenuEventType() | wxDateEventType() | wxDisplayChangedEventType() | wxEraseEventType() | wxFileDirPickerEventType() | wxFocusEventType() | wxFontPickerEventType() | wxGridEventType() | wxHelpEventType() | wxHtmlLinkEventType() | wxIconizeEventType() | wxIdleEventType() | wxJoystickEventType() | wxKeyEventType() | wxListEventType() | wxMaximizeEventType() | wxMenuEventType() | wxMouseCaptureChangedEventType() | wxMouseEventType() | wxMoveEventType() | wxNavigationKeyEventType() | wxNotebookEventType() | wxPaintEventType() | wxPaletteChangedEventType() | wxQueryNewPaletteEventType() | wxSashEventType() | wxScrollEventType() | wxScrollWinEventType() | wxSetCursorEventType() | wxShowEventType() | wxSizeEventType() | wxSpinEventType() | wxSplitterEventType() | wxStyledTextEventType() | wxSysColourChangedEventType() | wxTaskBarIconEventType() | wxTreeEventType() | wxUpdateUIEventType() | wxWindowCreateEventType() | wxWindowDestroyEventType().
+-type event() :: wxAuiManager() | wxAuiNotebook() | wxCalendar() | wxChildFocus() | wxClipboardText() | wxClose() | wxColourPicker() | wxCommand() | wxContextMenu() | wxDate() | wxDisplayChanged() | wxErase() | wxFileDirPicker() | wxFocus() | wxFontPicker() | wxGrid() | wxHelp() | wxHtmlLink() | wxIconize() | wxIdle() | wxInitDialog() | wxJoystick() | wxKey() | wxList() | wxMaximize() | wxMenu() | wxMouse() | wxMouseCaptureChanged() | wxMove() | wxNavigationKey() | wxNotebook() | wxPaint() | wxPaletteChanged() | wxQueryNewPalette() | wxSash() | wxScroll() | wxScrollWin() | wxSetCursor() | wxShow() | wxSize() | wxSpin() | wxSplitter() | wxStyledText() | wxSysColourChanged() | wxTaskBarIcon() | wxTree() | wxUpdateUI() | wxWindowCreate() | wxWindowDestroy().
+-type wxEventType() :: wxAuiManagerEventType() | wxAuiNotebookEventType() | wxCalendarEventType() | wxChildFocusEventType() | wxClipboardTextEventType() | wxCloseEventType() | wxColourPickerEventType() | wxCommandEventType() | wxContextMenuEventType() | wxDateEventType() | wxDisplayChangedEventType() | wxEraseEventType() | wxFileDirPickerEventType() | wxFocusEventType() | wxFontPickerEventType() | wxGridEventType() | wxHelpEventType() | wxHtmlLinkEventType() | wxIconizeEventType() | wxIdleEventType() | wxInitDialogEventType() | wxJoystickEventType() | wxKeyEventType() | wxListEventType() | wxMaximizeEventType() | wxMenuEventType() | wxMouseCaptureChangedEventType() | wxMouseEventType() | wxMoveEventType() | wxNavigationKeyEventType() | wxNotebookEventType() | wxPaintEventType() | wxPaletteChangedEventType() | wxQueryNewPaletteEventType() | wxSashEventType() | wxScrollEventType() | wxScrollWinEventType() | wxSetCursorEventType() | wxShowEventType() | wxSizeEventType() | wxSpinEventType() | wxSplitterEventType() | wxStyledTextEventType() | wxSysColourChangedEventType() | wxTaskBarIconEventType() | wxTreeEventType() | wxUpdateUIEventType() | wxWindowCreateEventType() | wxWindowDestroyEventType().
%% Hardcoded Records
-record(wxMouseState, {x :: integer(), y :: integer(),
diff --git a/lib/wx/priv/erlang-logo128.png b/lib/wx/priv/erlang-logo128.png
new file mode 100644
index 0000000000..33d1475cea
--- /dev/null
+++ b/lib/wx/priv/erlang-logo128.png
Binary files differ
diff --git a/lib/wx/priv/erlang-logo32.png b/lib/wx/priv/erlang-logo32.png
index a4afed8140..efddf5c5f9 100644
--- a/lib/wx/priv/erlang-logo32.png
+++ b/lib/wx/priv/erlang-logo32.png
Binary files differ
diff --git a/lib/wx/priv/erlang-logo64.png b/lib/wx/priv/erlang-logo64.png
index 91dfbbab53..b7d2128cdb 100644
--- a/lib/wx/priv/erlang-logo64.png
+++ b/lib/wx/priv/erlang-logo64.png
Binary files differ
diff --git a/lib/wx/src/gen/wxInitDialogEvent.erl b/lib/wx/src/gen/wxInitDialogEvent.erl
new file mode 100644
index 0000000000..c8fe6042ac
--- /dev/null
+++ b/lib/wx/src/gen/wxInitDialogEvent.erl
@@ -0,0 +1,64 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%% This file is generated DO NOT EDIT
+
+%% @doc See external documentation: <a href="http://www.wxwidgets.org/manuals/2.8.12/wx_wxinitdialogevent.html">wxInitDialogEvent</a>.
+%% <dl><dt>Use {@link wxEvtHandler:connect/3.} with EventType:</dt>
+%% <dd><em>init_dialog</em></dd></dl>
+%% See also the message variant {@link wxEvtHandler:wxInitDialog(). #wxInitDialog{}} event record type.
+%%
+%% <p>This class is derived (and can use functions) from:
+%% <br />{@link wxEvent}
+%% </p>
+%% @type wxInitDialogEvent(). An object reference, The representation is internal
+%% and can be changed without notice. It can't be used for comparsion
+%% stored on disc or distributed for use on other nodes.
+
+-module(wxInitDialogEvent).
+-include("wxe.hrl").
+-export([]).
+
+%% inherited exports
+-export([getId/1,getSkipped/1,getTimestamp/1,isCommandEvent/1,parent_class/1,
+ resumePropagation/2,shouldPropagate/1,skip/1,skip/2,stopPropagation/1]).
+
+-export_type([wxInitDialogEvent/0]).
+%% @hidden
+parent_class(wxEvent) -> true;
+parent_class(_Class) -> erlang:error({badtype, ?MODULE}).
+
+-type wxInitDialogEvent() :: wx:wx_object().
+ %% From wxEvent
+%% @hidden
+stopPropagation(This) -> wxEvent:stopPropagation(This).
+%% @hidden
+skip(This, Options) -> wxEvent:skip(This, Options).
+%% @hidden
+skip(This) -> wxEvent:skip(This).
+%% @hidden
+shouldPropagate(This) -> wxEvent:shouldPropagate(This).
+%% @hidden
+resumePropagation(This,PropagationLevel) -> wxEvent:resumePropagation(This,PropagationLevel).
+%% @hidden
+isCommandEvent(This) -> wxEvent:isCommandEvent(This).
+%% @hidden
+getTimestamp(This) -> wxEvent:getTimestamp(This).
+%% @hidden
+getSkipped(This) -> wxEvent:getSkipped(This).
+%% @hidden
+getId(This) -> wxEvent:getId(This).
diff --git a/lib/wx/test/wx_basic_SUITE.erl b/lib/wx/test/wx_basic_SUITE.erl
index df92348b3d..79dbea0575 100644
--- a/lib/wx/test/wx_basic_SUITE.erl
+++ b/lib/wx/test/wx_basic_SUITE.erl
@@ -241,21 +241,6 @@ wx_misc(Config) ->
%% wx:shutdown() %% How do you test this?
- case os:type() of
- {win32, _} -> %% These hangs when running automatic tests
- skip; %% through ssh on windows. Works otherwise
- _ ->
- wx_misc:shell([{command,"echo TESTING close the popup shell"}])
- end,
-
- case wx_test_lib:user_available(Config) of
- true ->
- wx_misc:shell();
- false ->
- %% Don't want to spawn a shell if no user
- skip %% is available
- end,
-
?m(false, wx_misc:isBusy()),
?m(ok, wx_misc:beginBusyCursor([])),
?m(true, wx_misc:isBusy()),
@@ -323,7 +308,18 @@ data_types(_Config) ->
wx_object(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
wx_object(Config) ->
wx:new(),
- Frame = ?mt(wxFrame, wx_obj_test:start([])),
+ Me = self(),
+ Init = fun() ->
+ Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Test wx_object", [{size, {500, 400}}]),
+ Sz = wxBoxSizer:new(?wxHORIZONTAL),
+ Panel = wxPanel:new(Frame),
+ wxSizer:add(Sz, Panel, [{flag, ?wxEXPAND}, {proportion, 1}]),
+ wxPanel:connect(Panel, size, [{skip, true}]),
+ wxPanel:connect(Panel, paint, [callback, {userData, Me}]),
+ wxWindow:show(Frame),
+ {Frame, {Frame, Panel}}
+ end,
+ Frame = ?mt(wxFrame, wx_obj_test:start([{init, Init}])),
timer:sleep(500),
?m(ok, check_events(flush())),
@@ -345,6 +341,7 @@ wx_object(Config) ->
%% Which it did in my buggy handling of the sync_callback
wxWindow:refresh(Frame),
?m([{sync_event, #wx{event=#wxPaint{}}, _}], flush()),
+ timer:sleep(500),
?m([{cast, slept}], flush()),
Monitor = erlang:monitor(process, FramePid),
diff --git a/lib/wx/test/wx_event_SUITE.erl b/lib/wx/test/wx_event_SUITE.erl
index 6a9f19ad51..b9c2fafe0e 100644
--- a/lib/wx/test/wx_event_SUITE.erl
+++ b/lib/wx/test/wx_event_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2008-2013. All Rights Reserved.
+%% Copyright Ericsson AB 2008-2014. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -48,7 +48,7 @@ suite() -> [{ct_hooks,[ts_install_cth]}].
all() ->
[connect, disconnect, connect_msg_20, connect_cb_20,
mouse_on_grid, spin_event, connect_in_callback, recursive,
- char_events, callback_clean
+ dialog, char_events, callback_clean
].
groups() ->
@@ -402,6 +402,42 @@ recursive(Config) ->
wx_test_lib:wx_destroy(Frame, Config).
+dialog(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
+dialog(Config) ->
+ Wx = wx:new(),
+ Frame = wxFrame:new(Wx, ?wxID_ANY, "Testing"),
+ wxFrame:show(Frame),
+ Env = wx:get_env(),
+ Tester = self(),
+ PD = wxProgressDialog:new("Dialog","Testing",
+ [%%{parent, Frame},
+ {maximum,101},
+ {style, ?wxPD_SMOOTH bor ?wxPD_AUTO_HIDE}]),
+ Forward = fun(#wx{event=#wxInitDialog{}}, Ev) ->
+ ?mt(wxInitDialogEvent, Ev),
+ io:format("Heyhoo~n", []),
+ wxEvent:skip(Ev),
+ Tester ! {progress_dialog,PD}
+ end,
+ wxDialog:connect(PD, init_dialog, [{callback, Forward}]),
+ Recurse = fun(Recurse, N) ->
+ true = wxProgressDialog:update(PD, min(N,100)),
+ timer:sleep(5),
+ Recurse(Recurse,N+1)
+ end,
+ Run = fun() ->
+ wx:set_env(Env),
+ Recurse(Recurse, 0)
+ end,
+ Worker = spawn_link(Run),
+ timer:sleep(500),
+ io:format("Got ~p~n", [wx_test_lib:flush()]),
+ unlink(Worker),
+ wxProgressDialog:destroy(PD),
+ wx_test_lib:wx_destroy(Frame, Config).
+
+
+
char_events(TestInfo) when is_atom(TestInfo) -> wx_test_lib:tc_info(TestInfo);
char_events(Config) ->
Wx = wx:new(),
@@ -484,6 +520,7 @@ callback_clean(Config) ->
%% timer:sleep(infinity),
%% ok.
+
white_box_check_event_handlers() ->
{_,_,Server,_} = wx:get_env(),
{status, _, _, [Env, _, _, _, Data]} = sys:get_status(Server),
@@ -495,3 +532,35 @@ white_box_check_event_handlers() ->
gb_trees:to_list(CBs),
[Funs || Funs = {Id, {Fun,_}} <- Env, is_integer(Id), is_function(Fun)]
}.
+
+handler_clean(TestInfo) when is_atom(TestInfo) ->
+ wx_test_lib:tc_info(TestInfo);
+handler_clean(_Config) ->
+ wx:new(),
+ Init = fun() -> create_window() end,
+ Frame1 = wx_obj_test:start([{init, Init}]),
+ ?mt(wxFrame, Frame1),
+ wxWindow:show(Frame1),
+ ?m([_|_], lists:sort(wx_test_lib:flush())),
+ ?m({stop,_}, wx_obj_test:stop(Frame1, fun(_) -> normal end)),
+ ?m([{terminate,normal}], lists:sort(wx_test_lib:flush())),
+
+ Frame2 = wx_obj_test:start([{init, Init}]),
+ wxWindow:show(Frame2),
+ ?m([_|_], lists:sort(wx_test_lib:flush())),
+ ?m({stop,_}, wx_obj_test:stop(Frame2, fun(_) -> wxWindow:destroy(Frame2), normal end)),
+ ?m([{terminate,normal}], lists:sort(wx_test_lib:flush())),
+ timer:sleep(104),
+ ?m({[],[],[]}, white_box_check_event_handlers()),
+ ?m(ok, wx:destroy()),
+ ok.
+
+create_window() ->
+ Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Test wx_object", [{size, {500, 400}}]),
+ Sz = wxBoxSizer:new(?wxHORIZONTAL),
+ Panel = wxPanel:new(Frame),
+ wxSizer:add(Sz, Panel, [{flag, ?wxEXPAND}, {proportion, 1}]),
+ wxWindow:connect(Frame, show),
+ %% wxPanel:connect(Panel, paint, [callback, {userData, foobar}]),
+ wxWindow:connect(Panel, size, [callback]),
+ {Frame, {Frame, Panel}}.
diff --git a/lib/wx/test/wx_obj_test.erl b/lib/wx/test/wx_obj_test.erl
index b4d7640c7e..f47f2fbc46 100644
--- a/lib/wx/test/wx_obj_test.erl
+++ b/lib/wx/test/wx_obj_test.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2011. All Rights Reserved.
+%% Copyright Ericsson AB 2011-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -18,69 +18,71 @@
-module(wx_obj_test).
-include_lib("wx/include/wx.hrl").
--export([start/1]).
+-export([start/1, stop/2]).
%% wx_object callbacks
-export([init/1, handle_info/2, terminate/2, code_change/3, handle_call/3,
handle_sync_event/3, handle_event/2, handle_cast/2]).
--record(state, {frame, panel, opts}).
+-record(state, {parent, opts, user_state}).
start(Opts) ->
- wx_object:start_link(?MODULE, [{parent, self()}, Opts], []).
+ wx_object:start_link(?MODULE, [{parent, self()}| Opts], []).
+
+stop(Object, Fun) ->
+ wx_object:call(Object, {stop, Fun}).
init(Opts) ->
- put(parent_pid, proplists:get_value(parent, Opts)),
- Frame = wxFrame:new(wx:null(), ?wxID_ANY, "Test wx_object", [{size, {500, 400}}]),
- Sz = wxBoxSizer:new(?wxHORIZONTAL),
- Panel = wxPanel:new(Frame),
- wxSizer:add(Sz, Panel, [{flag, ?wxEXPAND}, {proportion, 1}]),
- wxPanel:connect(Panel, size, [{skip, true}]),
- wxPanel:connect(Panel, paint, [callback, {userData, proplists:get_value(parent, Opts)}]),
- wxWindow:show(Frame),
- {Frame, #state{frame=Frame, panel=Panel, opts=Opts}}.
+ Parent = proplists:get_value(parent, Opts),
+ put(parent_pid, Parent),
+ Init = proplists:get_value(init, Opts),
+ {Obj, UserState} = Init(),
+ {Obj, #state{parent=Parent, opts=Opts, user_state=UserState}}.
-handle_sync_event(Event = #wx{obj=Panel}, WxEvent, #state{opts=Opts}) ->
- DC=wxPaintDC:new(Panel), %% We must create & destroy paintDC, or call wxEvent:skip(WxEvent))
- wxPaintDC:destroy(DC), %% in sync_event. Otherwise wx on windows keeps sending the events.
- Pid = proplists:get_value(parent, Opts),
- true = is_pid(Pid),
- Pid ! {sync_event, Event, WxEvent},
+handle_sync_event(Event = #wx{obj=Panel, event=#wxPaint{}},
+ WxEvent, #state{parent=Parent, user_state=US, opts=Opts}) ->
+ case proplists:get_value(redraw, Opts) of
+ undefined ->
+ DC=wxPaintDC:new(Panel), %% We must create & destroy paintDC, or call wxEvent:skip(WxEvent))
+ wxPaintDC:destroy(DC), %% in sync_event. Otherwise wx on windows keeps sending the events.
+ Parent ! {sync_event, Event, WxEvent};
+ Redraw ->
+ Redraw(Event, WxEvent, US)
+ end,
+ ok;
+handle_sync_event(Event, WxEvent, #state{parent=Parent}) ->
+ Parent ! {sync_event, Event, WxEvent},
ok.
-handle_event(Event, State = #state{opts=Opts}) ->
- Pid = proplists:get_value(parent, Opts),
- Pid ! {event, Event},
+handle_event(Event, State = #state{parent=Parent}) ->
+ Parent ! {event, Event},
{noreply, State}.
-handle_call(What, From, State) when is_function(What) ->
- Result = What(State),
+handle_call(What, From, State = #state{user_state=US}) when is_function(What) ->
+ Result = What(US),
{reply, {call, Result, From}, State};
+handle_call({stop, Fun}, From, State = #state{user_state=US}) ->
+ {stop, Fun(US), {stop, From}, State};
handle_call(What, From, State) ->
{reply, {call, What, From}, State}.
-handle_cast(What, State = #state{opts=Opts}) when is_function(What) ->
- Result = What(State),
- Pid = proplists:get_value(parent, Opts),
+handle_cast(What, State = #state{parent=Pid, user_state=US}) when is_function(What) ->
+ Result = What(US),
Pid ! {cast, Result},
{noreply, State};
-handle_cast(What, State = #state{opts=Opts}) ->
- Pid = proplists:get_value(parent, Opts),
+handle_cast(What, State = #state{parent=Pid}) ->
Pid ! {cast, What},
{noreply, State}.
-handle_info(What, State = #state{opts=Opts}) ->
- Pid = proplists:get_value(parent, Opts),
+handle_info(What, State = #state{parent=Pid}) ->
Pid ! {info, What},
{noreply, State}.
-terminate(What, #state{opts=Opts}) ->
- Pid = proplists:get_value(parent, Opts),
+terminate(What, #state{parent=Pid}) ->
Pid ! {terminate, What},
ok.
-code_change(Ver1, Ver2, State = #state{opts=Opts}) ->
- Pid = proplists:get_value(parent, Opts),
+code_change(Ver1, Ver2, State = #state{parent=Pid}) ->
Pid ! {code_change, Ver1, Ver2},
State.
diff --git a/lib/wx/vsn.mk b/lib/wx/vsn.mk
index 24c62390f4..c018b4fb86 100644
--- a/lib/wx/vsn.mk
+++ b/lib/wx/vsn.mk
@@ -1 +1 @@
-WX_VSN = 1.1.1
+WX_VSN = 1.1.2
diff --git a/lib/xmerl/doc/src/notes.xml b/lib/xmerl/doc/src/notes.xml
index 8f51262c81..b020b9bfa3 100644
--- a/lib/xmerl/doc/src/notes.xml
+++ b/lib/xmerl/doc/src/notes.xml
@@ -31,6 +31,35 @@
<p>This document describes the changes made to the Xmerl application.</p>
+<section><title>Xmerl 1.3.6</title>
+
+ <section><title>Fixed Bugs and Malfunctions</title>
+ <list>
+ <item>
+ <p> Fixed a problem in the SAX parser when the header of
+ the next document was appearing in the buffer when using
+ xmerl_sax_parser:stream/2 function. </p>
+ <p>
+ Own Id: OTP-11551 Aux Id: seq12505 </p>
+ </item>
+ </list>
+ </section>
+
+
+ <section><title>Improvements and New Features</title>
+ <list>
+ <item>
+ <p> The default encoding of Erlang files has been changed
+ from ISO-8859-1 to UTF-8. </p> <p> The encoding of XML
+ files has also been changed to UTF-8. </p>
+ <p>
+ Own Id: OTP-10907</p>
+ </item>
+ </list>
+ </section>
+
+</section>
+
<section><title>Xmerl 1.3.5</title>
<section><title>Improvements and New Features</title>
diff --git a/lib/xmerl/src/xmerl_sax_parser.erl b/lib/xmerl/src/xmerl_sax_parser.erl
index 5c006aada2..ad71072d95 100644
--- a/lib/xmerl/src/xmerl_sax_parser.erl
+++ b/lib/xmerl/src/xmerl_sax_parser.erl
@@ -74,7 +74,8 @@ file(Name,Options) ->
CL = filename:absname(Dir),
File = filename:basename(Name),
ContinuationFun = fun default_continuation_cb/1,
- Res = stream(<<>>, [{continuation_fun, ContinuationFun},
+ Res = stream(<<>>,
+ [{continuation_fun, ContinuationFun},
{continuation_state, FD},
{current_location, CL},
{entity, File}
@@ -98,9 +99,13 @@ stream(Xml, Options) when is_list(Xml), is_list(Options) ->
State = parse_options(Options, initial_state()),
case State#xmerl_sax_parser_state.file_type of
dtd ->
- xmerl_sax_parser_list:parse_dtd(Xml, State#xmerl_sax_parser_state{encoding = list});
+ xmerl_sax_parser_list:parse_dtd(Xml,
+ State#xmerl_sax_parser_state{encoding = list,
+ input_type = stream});
normal ->
- xmerl_sax_parser_list:parse(Xml, State#xmerl_sax_parser_state{encoding = list})
+ xmerl_sax_parser_list:parse(Xml,
+ State#xmerl_sax_parser_state{encoding = list,
+ input_type = stream})
end;
stream(Xml, Options) when is_binary(Xml), is_list(Options) ->
case parse_options(Options, initial_state()) of
@@ -124,17 +129,14 @@ stream(Xml, Options) when is_binary(Xml), is_list(Options) ->
[],
State#xmerl_sax_parser_state.event_state};
{Xml1, State1} ->
- parse(Xml1, State1, ParseFunction)
+ parse_binary(Xml1,
+ State1#xmerl_sax_parser_state{input_type = stream},
+ ParseFunction)
end
end.
-
-%%======================================================================
-%% Internal functions
-%%======================================================================
-
%%----------------------------------------------------------------------
-%% Function: parse(Encoding, Xml, State, F) -> Result
+%% Function: parse_binary(Encoding, Xml, State, F) -> Result
%% Input: Encoding = atom()
%% Xml = [integer()] | binary()
%% State = #xmerl_sax_parser_state
@@ -144,15 +146,15 @@ stream(Xml, Options) when is_binary(Xml), is_list(Options) ->
%% EventState = term()
%% Description: Chooses the correct parser depending on the encoding.
%%----------------------------------------------------------------------
-parse(Xml, #xmerl_sax_parser_state{encoding=utf8}=State, F) ->
+parse_binary(Xml, #xmerl_sax_parser_state{encoding=utf8}=State, F) ->
xmerl_sax_parser_utf8:F(Xml, State);
-parse(Xml, #xmerl_sax_parser_state{encoding={utf16,little}}=State, F) ->
+parse_binary(Xml, #xmerl_sax_parser_state{encoding={utf16,little}}=State, F) ->
xmerl_sax_parser_utf16le:F(Xml, State);
-parse(Xml, #xmerl_sax_parser_state{encoding={utf16,big}}=State, F) ->
+parse_binary(Xml, #xmerl_sax_parser_state{encoding={utf16,big}}=State, F) ->
xmerl_sax_parser_utf16be:F(Xml, State);
-parse(Xml, #xmerl_sax_parser_state{encoding=latin1}=State, F) ->
+parse_binary(Xml, #xmerl_sax_parser_state{encoding=latin1}=State, F) ->
xmerl_sax_parser_latin1:F(Xml, State);
-parse(_, #xmerl_sax_parser_state{encoding=Enc}, _) ->
+parse_binary(_, #xmerl_sax_parser_state{encoding=Enc}, _) ->
{error, lists:flatten(io_lib:format("Charcter set ~p not supported", [Enc]))}.
%%----------------------------------------------------------------------
diff --git a/lib/xmerl/src/xmerl_sax_parser.hrl b/lib/xmerl/src/xmerl_sax_parser.hrl
index 736316e069..b433dd6cf9 100644
--- a/lib/xmerl/src/xmerl_sax_parser.hrl
+++ b/lib/xmerl/src/xmerl_sax_parser.hrl
@@ -86,7 +86,15 @@
file_type = normal, % Can be normal, dtd and entity
current_location, % Location of the currently parsed XML entity
entity, % Parsed XML entity
- skip_external_dtd = false % If true the external DTD is skipped during parsing
+ skip_external_dtd = false,% If true the external DTD is skipped during parsing
+ input_type % Source type: file | stream.
+ % This field is a preparation for an fix in R17 of a bug in
+ % the conformance against the standard.
+ % Today a file which contains two XML documents will be considered
+ % well-formed and the second is placed in the rest part of the
+ % return tuple, according to the conformance tests this should fail.
+ % In the future this will fail if xmerl_sax_aprser:file/2 is used but
+ % left to the user in the xmerl_sax_aprser:stream/2 case.
}).
diff --git a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
index 7b64d7c302..e198f2fef5 100644
--- a/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
+++ b/lib/xmerl/src/xmerl_sax_parser_base.erlsrc
@@ -113,6 +113,10 @@ parse_dtd(Xml, State) ->
State3 = event_callback(endDocument, State2),
ets:delete(RefTable),
{ok, State3#xmerl_sax_parser_state.event_state, Rest};
+ {endDocument, Rest, State2} when is_record(State2, xmerl_sax_parser_state) ->
+ State3 = event_callback(endDocument, State2),
+ ets:delete(RefTable),
+ {ok, State3#xmerl_sax_parser_state.event_state, Rest};
Other ->
_State2 = event_callback(endDocument, State1),
ets:delete(RefTable),
@@ -207,8 +211,14 @@ parse_prolog(?STRING_EMPTY, State) ->
parse_prolog(?STRING("<") = Bytes, State) ->
cf(Bytes, State, fun parse_prolog/2);
parse_prolog(?STRING_REST("<?", Rest), State) ->
- {Rest1, State1} = parse_pi(Rest, State),
- parse_prolog(Rest1, State1);
+ case parse_pi(Rest, State) of
+ {Rest1, State1} ->
+ parse_prolog(Rest1, State1);
+ {endDocument, Rest1, State1} ->
+ parse_prolog(Rest1, State1)
+ % IValue = ?TO_INPUT_FORMAT("<?"),
+ % {?APPEND_STRING(IValue, Rest1), State1}
+ end;
parse_prolog(?STRING_REST("<!", Rest), State) ->
parse_prolog_1(Rest, State);
parse_prolog(?STRING_REST("<", Rest), State) ->
@@ -409,10 +419,11 @@ parse_pi(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) ->
parse_name(Rest, State, [C]),
case string:to_lower(PiTarget) of
"xml" ->
- case State#xmerl_sax_parser_state.end_tags of
- [] ->
- {Bytes, State};
- _ ->
+ case check_if_new_doc_allowed(State#xmerl_sax_parser_state.input_type,
+ State#xmerl_sax_parser_state.end_tags) of
+ true ->
+ {endDocument, Bytes, State};
+ false ->
?fatal_error(State1, "<?xml ...?> not first in document")
end;
_ ->
@@ -426,6 +437,11 @@ parse_pi(?STRING_UNBOUND_REST(C, Rest) = Bytes, State) ->
parse_pi(Bytes, State) ->
unicode_incomplete_check([Bytes, State, fun parse_pi/2], undefined).
+check_if_new_doc_allowed(stream, []) ->
+ true;
+check_if_new_doc_allowed(_, _) ->
+ false.
+
%%----------------------------------------------------------------------
%% Function: parse_pi_1(Rest, State) -> Result
%% Input: Rest = string() | binary()
@@ -657,8 +673,13 @@ parse_misc(?STRING_EMPTY, State, Eod) ->
parse_misc(?STRING("<") = Rest, State, Eod) ->
cf(Rest, State, Eod, fun parse_misc/3);
parse_misc(?STRING_REST("<?", Rest), State, Eod) ->
- {Rest1, State1} = parse_pi(Rest, State),
- parse_misc(Rest1, State1, Eod);
+ case parse_pi(Rest, State) of
+ {Rest1, State1} ->
+ parse_misc(Rest1, State1, Eod);
+ {endDocument, _Rest1, State1} ->
+ IValue = ?TO_INPUT_FORMAT("<?"),
+ {?APPEND_STRING(IValue, Rest), State1}
+ end;
parse_misc(?STRING("<!") = Rest, State, Eod) ->
cf(Rest, State, Eod, fun parse_misc/3);
parse_misc(?STRING("<!-") = Rest, State, Eod) ->
@@ -1063,8 +1084,13 @@ parse_content(?STRING_REST("<!--", Rest), State, Acc, IgnorableWS) ->
parse_content(Rest1, State2, [], true);
parse_content(?STRING_REST("<?", Rest), State, Acc, IgnorableWS) ->
State1 = send_character_event(length(Acc), IgnorableWS, lists:reverse(Acc), State),
- {Rest1, State2} = parse_pi(Rest, State1),
- parse_content(Rest1, State2, [], true);
+ case parse_pi(Rest, State1) of
+ {Rest1, State2} ->
+ parse_content(Rest1, State2, [], true);
+ {endDocument, _Rest1, State2} ->
+ IValue = ?TO_INPUT_FORMAT("<?"),
+ {?APPEND_STRING(IValue, Rest), State2}
+ end;
parse_content(?STRING_REST("<!", Rest1) = Rest, #xmerl_sax_parser_state{end_tags = ET} = State, Acc, IgnorableWS) ->
case ET of
[] ->
@@ -1649,8 +1675,9 @@ handle_external_entity({file, FileToOpen}, State) ->
{?STRING_EMPTY, EntityState} =
parse_external_entity_1(<<>>,
State#xmerl_sax_parser_state{continuation_state=FD,
- current_location=filename:dirname(FileToOpen),
- entity=filename:basename(FileToOpen)}),
+ current_location=filename:dirname(FileToOpen),
+ entity=filename:basename(FileToOpen),
+ input_type=file}),
file:close(FD),
EntityState#xmerl_sax_parser_state.event_state
end;
@@ -1667,8 +1694,9 @@ handle_external_entity({http, Url}, State) ->
{?STRING_EMPTY, EntityState} =
parse_external_entity_1(<<>>,
State#xmerl_sax_parser_state{continuation_state=FD,
- current_location=filename:dirname(Url),
- entity=filename:basename(Url)}),
+ current_location=filename:dirname(Url),
+ entity=filename:basename(Url),
+ input_type=file}),
file:close(FD),
file:delete(TmpFile),
EntityState#xmerl_sax_parser_state.event_state
@@ -1881,8 +1909,13 @@ parse_doctype_decl(?STRING_EMPTY, State) ->
parse_doctype_decl(?STRING("<"), State) ->
cf(?STRING("<"), State, fun parse_doctype_decl/2);
parse_doctype_decl(?STRING_REST("<?", Rest), State) ->
- {Rest1, State1} = parse_pi(Rest, State),
- parse_doctype_decl(Rest1, State1);
+ case parse_pi(Rest, State) of
+ {Rest1, State1} ->
+ parse_doctype_decl(Rest1, State1);
+ {endDocument, _Rest1, State1} ->
+ IValue = ?TO_INPUT_FORMAT("<?"),
+ {?APPEND_STRING(IValue, Rest), State1}
+ end;
parse_doctype_decl(?STRING_REST("%", Rest), State) ->
{Ref, Rest1, State1} = parse_pe_reference(Rest, State),
case Ref of
diff --git a/lib/xmerl/test/xmerl_sax_SUITE.erl b/lib/xmerl/test/xmerl_sax_SUITE.erl
index 563bbaaa06..10a96f470b 100644
--- a/lib/xmerl/test/xmerl_sax_SUITE.erl
+++ b/lib/xmerl/test/xmerl_sax_SUITE.erl
@@ -67,7 +67,8 @@ end_per_testcase(_Func,_Config) ->
%% Description: Checks that end of document is checked properly when continuation fun is missing.
ticket_8213(suite) -> [];
ticket_8213(_Config) ->
- ?line {ok,ok,[]} = xmerl_sax_parser:stream("<elem/>", [{event_fun, fun (_E,_,_) -> ok end}]).
+ ?line {ok,ok,[]} = xmerl_sax_parser:stream("<elem/>", [{event_fun, fun (_E,_,_) -> ok end}]),
+ ok.
%%----------------------------------------------------------------------
@@ -86,7 +87,35 @@ ticket_8214(_Config) ->
({startElement, _, "elem",_,_}, _,_) ->
throw({test, "Error in startElement tuple"});
(_E,_,_) -> ok
- end}]).
+ end}]),
+ ok.
+
+%%----------------------------------------------------------------------
+%% Test Case
+%% ID: ticket_8214
+%% Description: Checks that attributes with default namespace don't get [] in NS field.
+ticket_11551(suite) -> [];
+ticket_11551(Config) ->
+ Stream1 = <<"<?xml version=\"1.0\" encoding=\"utf-8\" ?>
+<a>hej</a>
+<?xml version=\"1.0\" encoding=\"utf-8\" ?>
+<a>hej</a>">>,
+ ?line {ok, undefined, <<"<?xml", _/binary>>} = xmerl_sax_parser:stream(Stream1, []),
+ Stream2= <<"<?xml version=\"1.0\" encoding=\"utf-8\" ?>
+<a>hej</a>
+
+
+<?xml version=\"1.0\" encoding=\"utf-8\" ?>
+<a>hej</a>">>,
+ ?line {ok, undefined, <<"<?xml", _/binary>>} = xmerl_sax_parser:stream(Stream2, []),
+ Stream3= <<"<a>hej</a>
+
+<?xml version=\"1.0\" encoding=\"utf-8\" ?>
+<a>hej</a>">>,
+ ?line {ok, undefined, <<"<?xml", _/binary>>} = xmerl_sax_parser:stream(Stream3, []),
+ ok.
+
+
%%----------------------------------------------------------------------
%% Bug test cases
@@ -99,7 +128,7 @@ all() ->
[{group, bugs}].
groups() ->
- [{bugs, [], [ticket_8213, ticket_8214]}].
+ [{bugs, [], [ticket_8213, ticket_8214, ticket_11551]}].
init_per_group(_GroupName, Config) ->
Config.
diff --git a/lib/xmerl/test/xmerl_sax_std_SUITE.erl b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
index 2b7b59dacf..6440329112 100644
--- a/lib/xmerl/test/xmerl_sax_std_SUITE.erl
+++ b/lib/xmerl/test/xmerl_sax_std_SUITE.erl
@@ -2074,8 +2074,9 @@ end_per_testcase(_Func,_Config) ->
%% Special case becase we returns everything after a legal document
%% as an rest instead of giving and error to let the user handle
%% multipple docs on a stream.
- ?line {ok,_,<<"xml version=\"1.0\"?>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
- %%?line check_result(R, "not-wf").
+ ?line {ok,_,<<"<?xml version=\"1.0\"?>\r\n">>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ % ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ % ?line check_result(R, "not-wf").
%%----------------------------------------------------------------------
%% Test Case
@@ -12361,8 +12362,9 @@ end_per_testcase(_Func,_Config) ->
%% Special case becase we returns everything after a legal document
%% as an rest instead of giving and error to let the user handle
%% multipple docs on a stream.
- ?line {ok,_, <<"xml version=\"1.0\"?>", _/binary>>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
- %%?line check_result(R, "not-wf").
+ ?line {ok,_, <<"<?xml version=\"1.0\"?>", _/binary>>} = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]).
+ % ?line R = xmerl_sax_parser:file(Path, [{event_fun, fun(_,_,S) -> S end}]),
+ % ?line check_result(R, "not-wf").
%%----------------------------------------------------------------------
%% Test Case
@@ -24625,7 +24627,7 @@ groups() ->
'not-wf-sa-136', 'not-wf-sa-137', 'not-wf-sa-138',
'not-wf-sa-139', 'not-wf-sa-140', 'not-wf-sa-141',
'not-wf-sa-142', 'not-wf-sa-143', 'not-wf-sa-144',
- 'not-wf-sa-145', 'not-wf-sa-146', 'not-wf-sa-147',
+ 'not-wf-sa-145', 'not-wf-sa-146', %'not-wf-sa-147', LATH: Check this later
'not-wf-sa-148', 'not-wf-sa-149', 'not-wf-sa-150',
'not-wf-sa-151', 'not-wf-sa-152', 'not-wf-sa-153',
'not-wf-sa-154', 'not-wf-sa-155', 'not-wf-sa-156',
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl
index 44ec4b592d..34a65ac6ff 100644
--- a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2006-2010. All Rights Reserved.
+%% Copyright Ericsson AB 2006-2013. All Rights Reserved.
%%
%% The contents of this file are subject to the Erlang Public License,
%% Version 1.1, (the "License"); you may not use this file except in
@@ -32,7 +32,7 @@
all() ->
- [att, ct, elem, group, idc_, id, mgABCD, mgEFG, mgHIJ,
+ [att, ct, elem, model_group, idc_, id, mgABCD, mgEFG, mgHIJ,
mgK, mgLM, mgN, mgOP, mgQR, mgS, particlesAB,
particlesCDE, particlesFHI, particlesJ,
particlesKOSRTQUVW, stABCDE, stFGH, stIJK, stZ,
@@ -5743,8 +5743,7 @@ elem(Config) when is_list(Config) ->
%% Syntax Checking Model Group Tests.
%% Content Checking Model Group Tests.
-
-group(Config) when is_list(Config) ->
+model_group(Config) when is_list(Config) ->
STResList0 = [],
?line {STRes0,_} = xmerl_xsd_lib:schema_test(Config,'./msxsdtest/Group/groupA001.xsd','./msxsdtest/Group',valid),
diff --git a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log
index a89a9a798c..7ee2a56c20 100644
--- a/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log
+++ b/lib/xmerl/test/xmerl_xsd_MS2002-01-16_SUITE_data/msx_failed_cases.log
@@ -532,7 +532,7 @@
"elemQ018.xml",
"elemO011.xml",
"elemO006.xml"],[]}}.
-{group,{["groupO027.xsd",
+{model_group,{["groupO027.xsd",
"groupO025.xsd",
"groupO024.xsd",
"groupO023.xsd",
diff --git a/lib/xmerl/vsn.mk b/lib/xmerl/vsn.mk
index 4b933deb4a..333466c11e 100644
--- a/lib/xmerl/vsn.mk
+++ b/lib/xmerl/vsn.mk
@@ -1 +1 @@
-XMERL_VSN = 1.3.5
+XMERL_VSN = 1.3.6
diff --git a/otp_build b/otp_build
index ca3ffa21a8..945027f0ed 100755
--- a/otp_build
+++ b/otp_build
@@ -1310,7 +1310,7 @@ determine_version_controller
# Unset ERL_FLAGS and ERL_OTP<Major-VSN>_FLAGS during bootstrap to
# prevent potential problems
-otp_major_vsn=`cat erts/vsn.mk | grep SYSTEM_VSN | sed "s|SYSTEM_VSN[^=]*=[^0-9]*\([0-9]*\).*|\1|"`
+otp_major_vsn=`cat erts/vsn.mk | grep SYSTEM_VSN | sed "s|SYSTEM_VSN[^=]*=[^0-9]*\([0-9]*\).*|\1|g"`
erl_otp_flags="ERL_OTP${otp_major_vsn}_FLAGS"
unset ERL_FLAGS
unset ${erl_otp_flags}
diff --git a/system/doc/definitions/term.defs b/system/doc/definitions/term.defs
index f3d6f865d2..6091a46a20 100644
--- a/system/doc/definitions/term.defs
+++ b/system/doc/definitions/term.defs
@@ -1,8 +1,6 @@
[{"agent","agent","An entity that terminates a management protocol in the Network Element.","mbj"},
{"API","API","Application Programming Interface. The interface towards an application. Usually this is a set of functions available, but can also be a set of messages sent to or from an application.","mbj"},
{"application","application","A collection of resources which is required to offer a specific service.","mbj"},
-{"appmon","Application Monitor","A graphical node and application process tree viewer. See also appmon.","mbj"},
-{"Appmon","Appmon","Application name for the Application Monitor within Erlang/OTP. A graphical node and process viewer.","mbj"},
{"app callback","application callback module","A module which is called when the application is started, and when it has stopped. Every application has one application callback module.","mbj"},
{"AC","application controller","A process which coordinates all operations on applications.","mbj"},
{"app master","application master","The application master is a process that monitors the application. It is provided by the Erlang run-time system. Every application has an application master process.","mbj"},
@@ -137,7 +135,6 @@ the module Erlang in the application kernel","kenneth"},
{"pattern matching","pattern matching","A basic mechanism in Erlang for assigning values to variables and for controlling the flow of a program.","kenneth"},
{"permanent child","permanent child","A supervised process which always is restarted when it dies.","mbj"},
{"Pid","Pid","Process Identifier. A data type in Erlang for storing process references. The process identity of the process displayed in the line.","kenneth"},
-{"Pman","Pman","Module and application name for the Process Trace Tool.","olin"},
{"point","point","A unit used to indicate the size of a typeface. Equal to 1/72 inches.","jocke"},
{"pointer","pointer","A pointer tells where data is stored. Memory pointers are not used in Erlang.","kent"},
{"port","port","A data type in Erlang. Ports provide the basic mechanism for communication with the external world.","peterl"},
@@ -196,10 +193,8 @@ the module Erlang in the application kernel","kenneth"},
{"sup_bridge","supervisor bridge"," A behaviour used to connect a process, or subsystem, to a supervisor tree.","mbj"},
{"SASLlong","System Architecture Support Libraries (SASL)","An Erlang/OTP application which contains services for error logging, release handling and report browsing.","mbj"}, {".config","system configuration file","A file which specifies configuration parameters for the applications in the system.","mbj"},
{"table lock","table lock","Table locks are locks which are set on whole tables. They may either be read locks or write locks.","hakan"},
-{"Table Visualizer","Table Visualizer","A tool which enables the user to examine ETS and Mnesia tables.","olin"},
{"temporary child","temporary child","A supervised process which is never restarted when it dies.","mbj"},
{"term","term","The super type of all Erlang types.","kenneth"},
-{"Toolbar","Toolbar","A tool that provides an simplistic interface to the other various Erlang/OTP tools","olin"},
{"tools","tools","An application within Erlang/OTP which contains the tools which are not applications themselves.","olin"},
{"transaction","transaction","Transactions groups a set of database accesses into an atomic unit. All transactions has the ACID (atomicity, concistency, isolation and durability) properties.","hakan"},
{"transient child","transient child","A supervised process which is restarted if it dies non-normally.","mbj"},
diff --git a/system/doc/design_principles/spec_proc.xml b/system/doc/design_principles/spec_proc.xml
index 96e82c83b3..8de7a5fe03 100644
--- a/system/doc/design_principles/spec_proc.xml
+++ b/system/doc/design_principles/spec_proc.xml
@@ -43,7 +43,7 @@
<p>The module <c>sys</c> contains some functions for simple debugging
of processes implemented using behaviours. We use the
<c>code_lock</c> example from
- the <seealso marker="fsm#ex">gen_event</seealso> chapter to
+ the <seealso marker="fsm#ex">gen_fsm</seealso> chapter to
illustrate this:</p>
<pre>
% <input>erl</input>
diff --git a/system/doc/getting_started/seq_prog.xml b/system/doc/getting_started/seq_prog.xml
index 567d032bb5..3830a34e5a 100644
--- a/system/doc/getting_started/seq_prog.xml
+++ b/system/doc/getting_started/seq_prog.xml
@@ -408,7 +408,7 @@ list_length([First | Rest]) ->
or "structs" in other languages and we use lists when we want to
represent things which have varying sizes, (i.e. where we would
use linked lists in other languages).</p>
- <p>Erlang does not have a string date type, instead strings can be
+ <p>Erlang does not have a string data type, instead strings can be
represented by lists of ASCII characters. So the list
<c>[97,98,99]</c> is equivalent to "abc". The Erlang shell is
"clever" and guesses the what sort of list we mean and outputs it
@@ -1031,7 +1031,7 @@ month_length(Year, Month) ->
<title>Built In Functions (BIFs)</title>
<p>Built in functions BIFs are functions which for some reason is
built in to the Erlang virtual machine. BIFs often implement
- functionality that is impossible to implement in Erlang or is to
+ functionality that is impossible to implement in Erlang or is too
inefficient to implement in Erlang. Some BIFs can be called
by use of the function name only but they are by default belonging
to the erlang module so for example the call to the BIF <c>trunc</c>
diff --git a/system/doc/reference_manual/code_loading.xml b/system/doc/reference_manual/code_loading.xml
index 10022a5d33..23871dfa83 100644
--- a/system/doc/reference_manual/code_loading.xml
+++ b/system/doc/reference_manual/code_loading.xml
@@ -121,10 +121,9 @@ loop() ->
<title>Running a function when a module is loaded</title>
<warning>
- <p>This section describes an experimental feature that was
- introduced in R13B03, and changed in a backwards-incompatible
- way in R13B04. There may be more backward-incompatible changes
- in future releases.</p>
+ <p>We recommend that the feature described in this section is to
+ be used only for loading NIF libraries. For other usages this
+ feature should be considered experimental.</p>
</warning>
<p>The <c>-on_load()</c> directive names a function that should